设计背景:
数字时钟的设计,在我们的好多设计中都有过这样那样的设计,这基本属于一个比较精简的一个小项目,可以练习我们学到的好多知识点。
设计原理:
本次的设计主要还是为了结合我们所学到的知识,因为我们学到的知识要经常的用,并不是我们不用,一直在用我们就可以加深我们的想法和思路,这也是一种良好的学习态度。
我设计的数字钟是这样的一种架构,我又3个按键,上电后,我们需要先配置我们的时分秒,我的设计是一个按键来控制我们的时,一个按键来控制我们的分,秒我没有控制,因为我比较懒,大家可以自己取设计控制一下我们的设计,那么然后是这样的,第三个按键来控制我们时钟的运行,也就是说当我们用2个那件配置好了我们的时钟的时候,按下这个开始按键,我们的时钟就开始工作了。
那么我们就在来讨论一下我们的按键模块,我们的按键模块是这样的,因为按键有抖动,我加入按键消抖,和边沿检测电路,这样我们就实现了按键的消抖,用到的也就是我们前面设计的知识。
设计架构图:

写好一个模块,我们可以任意例化几次都是可以的,目前还不用考虑别的,三个按键就例化了三次我们的按键消抖和边沿检测。
设计代码:
设计模块
0moduletime_seg(clk,rst_n,sel,seg7,key_fen,key_shi,go);
1
2 inputclk;
3 inputrst_n;
4
5 inputkey_fen; //控制分的按键
6 inputkey_shi; //控制时的按键
7 inputgo; //控制时钟运行的按键
8 output[2:0]sel;
9 output[7:0]seg7;
10
11 wire[23:0]data_in;
12
13
14seg seg_dut( //例化我们的数码管模块
15 .clk(clk),
16 .rst_n(rst_n),
17 .sel(sel),
18 .seg7(seg7),
19 .data_in(data_in)
20 );
21 wiref_fen,f_shi,f_go;
22contol countol_dut( //例化我们的控制模块
23 .clk(clk),
24 .rst_n(rst_n),
25 .data(data_in),
26 .key_fen1(f_fen),
27 .key_shi1(f_shi),
28 .go1(f_go)
29 );
30 wirefen_x,shi_x,go_x;
31key_xiaodou shi3( //例化3次消抖
32 .clk(clk),
33 .rst_n(rst_n),
34 .key(key_shi),
35 .key_x(shi_x)
36 );
37key_xiaodou fen3(
38 .clk(clk),
39 .rst_n(rst_n),
40 .key(key_fen),
41 .key_x(fen_x)
42 );
43
44key_xiaodou go3(
45 .clk(clk),
46 .rst_n(rst_n),
47 .key(go),
48 .key_x(go_x)
49 );
50
51edge_jiance shi2( //例化3次边沿检测电路
52 .clk(clk),
53 .rst_n(rst_n),
54 .signle(shi_x),
55 .nege_dge(f_shi),
56 .pose_dge()
57 );
58edge_jiance fen2(
59 .clk(clk),
60 .rst_n(rst_n),
61 .signle(fen_x),
62 .nege_dge(f_fen),
63 .pose_dge()
64 );
65edge_jiance go2(
66 .clk(clk),
67 .rst_n(rst_n),
68 .signle(go_x),
69 .nege_dge(f_go),
70 .pose_dge()
71 );
72
73endmodule
控制模块:
0modulecontol(clk,rst_n,data,key_fen1,key_shi1,go1);
1
2 inputclk;
3 inputrst_n;
4 inputkey_fen1; //输入端口
5 inputkey_shi1;
6 inputgo1;
7
8 outputreg[23:0]data; //输出的端口
9
10
11 reg[26:0]count;
12
13 always@(posedgeclk ornegedgerst_n) //1秒的计数器
14 if(!rst_n)
15 begin
16 count <=26'd0;
17 end
18 else
19 begin
20 if(count ==50_000_000)
21 count <=26'd0;
22 else
23 begin
24 count <=count +1'd1;
25 end
26 end
27
28 wireflag;
29
30 assignflag =(count ==50_000_000)?1'b1:1'b0; //计数到了1S给一个高脉冲
31
32 reg[1:0]state;
33 always@(posedgeclk ornegedgerst_n)
34 if(!rst_n)
35 begin
36 data <=0;
37 state <=0;
38 end
39 else
40 case(state)
41 0:begin
42 if(key_fen1) //调节分
43 begin
44 data[11:8]<=data[11:8]+1;
45 if(data[11:8]==9)
46 begin
47 data[11:8]<=4'd0;
48 data[15:12]<=data[15:12]+1'b1;
49 if(data[15:12]==5)
50 data[15:12]<=0;
51 end
52 end
53 elseif(key_shi1) //调节时
54 begin
55 data[19:16]<=data[19:16]+1;
56 if(data[19:16]==9&&data[23:20]!=1)
57 begin
58 data[19:16]<=4'd0;
59 data[23:20]<=data[23:20]+1'b1;
60 if(data[23:20]==1)
61 data[23:20]<=0;
62 end
63 elseif(data[19:16]==2&&data[23:20]==1)
64 begin
65 data[19:16]<=0;
66 data[23:20]<=0;
67 end
68 end
69 elseif(go1) //让我们的时钟启动
70 begin
71 state <=1;
72 end
73 else
74 state <=0;
75 end
//一层一层的嵌套设计,让我们的秒一个一个的来驱动
76 1:begin
77 if(flag )
78 begin
79 data[3:0]<=data[3:0]+1;
80 if(data[3:0]==9) //秒的个位
81 begin
82 data[3:0]<=4'd0;
83 data[7:4]<=data[7:4]+1'b1;
84 if(data[7:4]==5) //秒的时位
85 begin
86 data[7:4]<=4'd0;
87 data[11:8]<=data[11:8]+1'b1;
88 if(data[11:8]==9) //分的个位
89 begin
90 data[11:8]<=4'd0;
91 data[15:12]<=data[15:12]+1'b1;
92 if(data[15:12]==5) //分的十位
93 begin
94 data[15:12]<=4'd0;
95 data[19:16]<=data[19:16]+1'b1;
96 if(data[19:16]==9&&data[23:20]!=1)//时的计算
97 begin
98 data[23:20]<=4'd0;
99 data[23:20]<=data[23:19]+1'b1;
100 if(data[23:20]==1)
101 data[23:20]<=4'd0;
102 end
103 elseif(data[19:16]==2&&data[23:20]==1)//如果到12小时制
104 begin
105 data[19:16]<=0;
106 data[23:20]<=0;
107 end
108 end
109 end
110 end
111 end
112 end
113 end
114
115 default:;
116 endcase
117
118
19 endmodule
这边我就不给大家仿真了,后续我会给大家发一个完整的工程,建议大家可以自己例化我的设计。
-
FPGA
+关注
关注
1664文章
22502浏览量
639083
发布评论请先 登录
IDT ICS664 - 01数字视频时钟源:高清电视数字视频设备的时钟解决方案
Xilinx FPGA中的混合模式时钟管理器MMCME2_ADV详解
浅谈FPGA的时钟输入要求
RENESAS ICS664 - 02 PECL数字视频时钟源:高清电视时钟解决方案
Xilinx FPGA中IDELAYCTRL参考时钟控制模块的使用
汽车时钟MC - K系列时钟振荡器:设计与应用指南
数字IC/FPGA设计中的时序优化方法
高云半导体22nm FPGA产品家族亮相ICCAD-Expo 2025
开源RISC-V处理器(蜂鸟E203)学习(二)修改FPGA综合环境(移植到自己的Xilinx FPGA板卡)
FPGA在机器学习中的具体应用
Analog Devices Inc. AD9546双通道DPLL 数字化时钟同步器数据手册
高性能紧凑型 RFSoC FPGA 开发平台 AXW22,重塑射频开发体验
【教程】轻松上手!E22系列模组简单通信教程
Xilinx Ultrascale系列FPGA的时钟资源与架构解析
FPGA学习系列:22. 数字时钟的设计
评论