设计背景:
数字时钟的设计,在我们的好多设计中都有过这样那样的设计,这基本属于一个比较精简的一个小项目,可以练习我们学到的好多知识点。
设计原理:
本次的设计主要还是为了结合我们所学到的知识,因为我们学到的知识要经常的用,并不是我们不用,一直在用我们就可以加深我们的想法和思路,这也是一种良好的学习态度。
我设计的数字钟是这样的一种架构,我又3个按键,上电后,我们需要先配置我们的时分秒,我的设计是一个按键来控制我们的时,一个按键来控制我们的分,秒我没有控制,因为我比较懒,大家可以自己取设计控制一下我们的设计,那么然后是这样的,第三个按键来控制我们时钟的运行,也就是说当我们用2个那件配置好了我们的时钟的时候,按下这个开始按键,我们的时钟就开始工作了。
那么我们就在来讨论一下我们的按键模块,我们的按键模块是这样的,因为按键有抖动,我加入按键消抖,和边沿检测电路,这样我们就实现了按键的消抖,用到的也就是我们前面设计的知识。
设计架构图:
写好一个模块,我们可以任意例化几次都是可以的,目前还不用考虑别的,三个按键就例化了三次我们的按键消抖和边沿检测。
设计代码:
设计模块
0 module time_seg(clk,rst_n,sel,seg7,key_fen,key_shi,go);
1
2 input clk;
3 input rst_n;
4
5 input key_fen; //控制分的按键
6 input key_shi; //控制时的按键
7 input go; //控制时钟运行的按键
8 output [2:0] sel;
9 output [7:0] seg7;
10
11 wire [23:0] data_in;
12
13
14 seg seg_dut( //例化我们的数码管模块
15 .clk(clk),
16 .rst_n(rst_n),
17 .sel(sel),
18 .seg7(seg7),
19 .data_in(data_in)
20 );
21 wire f_fen,f_shi,f_go;
22 contol 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 wire fen_x,shi_x,go_x;
31 key_xiaodou shi3( //例化3次消抖
32 .clk(clk),
33 .rst_n(rst_n),
34 .key(key_shi),
35 .key_x(shi_x)
36 );
37 key_xiaodou fen3(
38 .clk(clk),
39 .rst_n(rst_n),
40 .key(key_fen),
41 .key_x(fen_x)
42 );
43
44 key_xiaodou go3(
45 .clk(clk),
46 .rst_n(rst_n),
47 .key(go),
48 .key_x(go_x)
49 );
50
51 edge_jiance shi2( //例化3次边沿检测电路
52 .clk(clk),
53 .rst_n(rst_n),
54 .signle(shi_x),
55 .nege_dge(f_shi),
56 .pose_dge()
57 );
58 edge_jiance fen2(
59 .clk(clk),
60 .rst_n(rst_n),
61 .signle(fen_x),
62 .nege_dge(f_fen),
63 .pose_dge()
64 );
65 edge_jiance go2(
66 .clk(clk),
67 .rst_n(rst_n),
68 .signle(go_x),
69 .nege_dge(f_go),
70 .pose_dge()
71 );
72
73 endmodule
控制模块:
0 module contol(clk,rst_n,data,key_fen1,key_shi1,go1);
1
2 input clk;
3 input rst_n;
4 input key_fen1; //输入端口
5 input key_shi1;
6 input go1;
7
8 output reg [23:0] data; //输出的端口
9
10
11 reg [26:0] count;
12
13 always @(posedge clk or negedge rst_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 wire flag;
29
30 assign flag =(count == 50_000_000 ) ? 1'b1 : 1'b0; //计数到了1s给一个高脉冲
31
32 reg [1:0] state;
33 always @ (posedge clk or negedge rst_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 else if(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 else if(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 else if(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 else if(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
这边我就不给大家仿真了,后续我会给大家发一个完整的工程,建议大家可以自己例化我的设计。
信步科技SV-2718F医疗监护主板规格
在FPGA中使用采用ASIC风格的设计方法的好处有哪些
京瓷集团面向4个重点市场 Our Future,Together
Linux中如何如何为现有用户创建主目录?
Nank南卡A1主动降噪耳机火爆来袭,被誉降噪界的最强王者
FPGA学习系列:22. 数字时钟的设计
海为PLC,H01ZB模块和PC2ZB模块,在停车场控制系统中的应用设计
华为手机安全很重要: 华为Mate9这个功能不能忘了打开
选择合适的系列电压基准源的绝对精度电压输出数模转换器设计-S
Keysight已推出新一代数字万用表
汽车电子控制系统上的CAN总线通讯介绍
新机红米Note4X和红米Note4都是999元,你会选谁?
如何选型电源SPD后备保护器
华为4G新手机订单成品预计明年上半年上市
中兴发布首款支持国内四大运营商的5G手机
同轴电缆的主要电气参数和物理参数
单片机三总线结构研究分析
一万元的预算,你是选择低配版的MacBook Pro、Surface Pro还是华为新MateBook呢?
大数据分析应用常见的困难及发展趋势分析
手持采集仪 手持振弦读数仪有哪些特点