FPGA学习系列:22. 数字时钟的设计

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

2  input clk;
3  input rst_n;

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呢?
大数据分析应用常见的困难及发展趋势分析
手持采集仪 手持振弦读数仪有哪些特点