基于Verilog HDL的数字时钟设计

一、实验内容:

    利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能。时间设置由开关S1和S2控制,分别是增和减。开关S3是模式选择:0是正常时钟显示;1是进入调分模式;2是进入调时模式;3是进入秒表模式,当进入秒表模式时,S1具有启动和停止功能,S2具有复位归零功能。只有四位数码管,所以没有做万年历,下一步会在这个基础上加入定时闹钟。

二、实验板

自个制作的实验板,用的是Altera CycloneIII EP3C40Q240C8N。上面的这块板是简单的外围电路,有流水灯、EEPROM、蜂鸣器、MAX3232、拨码开关、开关按键。PS2解码、VGA、AD转换等外围电路正在筹划中。

 

二、实验原理图设计

1、数码管原理图:利用74HC245驱动7段共阴极数码,其中F_X是代表接入到FPGA的I/O口。

  

2、开关原理图

 

三、整体架构设计

1、模块结构

 

2、RTL Viewer

 

四、各个击破

第1步:数码管显示,四位数码管的a~g、dp都是复用的,得先让四位数码管能分别显示不同的数据。大家都应该想到了“同步动态扫描”。我是这样做的:每位数码工作5ms,并采取流水方式进行循环操作(列扫描),每位数码即将工作那一刻,同时给a~g送入数据,数据保留5ms并进行定时更新数据(行扫描),行与列保持同步。定时开关,定时发送数据。下图有点错误,其实是在低电平是有效的,高低电平反了。 

 

第2步:小数点显示,为了与时钟显示格式更为逼真,让中间的小数点一直亮着(充分利用资源吧),其他小数点要灭掉,很不幸运,不能直接把data_dp管脚直接拉高或拉低,这里是给该管脚产生周期为20ms,占空比为3/4的一个时钟信号,下图高低电平反了。

第3步:要让不同数码显示不同数据,那么就得事先编好每位数码管要显示的数据。由于时钟与秒表显示的最大数据不一样,得单独编码,这步很简单,一看代码就知道。

 

第4步:开关的信号输入,涉及到开关,那么就得消抖。这里借鉴特权的方法实现的。

 

把要做的实验思路搞清楚后,那么数字时钟设计应该很快就会完成。

五、各模块的信号输入/输出定义

Setting.v

Pin Name

I/O

Description

clk

input

主时钟27MHZ

rst_n

input

系统复位,低有效

add_in

input

开关S1的输入

sub_in

input

开关S2的输入

model_in

input

开关S3的输入

Hour_Ten

output

时的十位

Hour_One

output

时的个位

Minute_Ten

output

分的十位

Minute_One

output

分的个位

Display_Model

output

控制时钟与秒表的显示切换

M_Start

output

启动/停止秒表计数器

M_Reset

output

复位归零

control_wei.v

Pin Name

I/O

Description

clk

input

主时钟27MHZ

rst_n

input

系统复位,低有效

select_wei

output

控制数码管流水工作

miaobiao.v

Pin Name

I/O

Description

clk

input

主时钟27MHZ

rst_n

input

系统复位,低有效

M_Start

input

启动/停止秒表计数器

M_Reset

input

复位归零

S_data1

output

秒表:第一位数码管数据编码

S_data2

output

秒表:第二位数码管数据编码

S_data3

output

秒表:第三位数码管数据编码

S_data4

output

秒表:第四位数码管数据编码

control_display.v

Pin Name

I/O

Description

clk

input

主时钟27MHZ

rst_n

input

系统复位,低有效

H_data1

input

时钟:第一位数码管数据

H_data2

input

 

时钟:第二位数码管数据

H_data3

input

时钟:第三位数码管数据

H_data4

input

时钟:第四位数码管数据

S_data1

input

秒表:第一位数码管数据

S_data2

input

秒表:第二位数码管数据

S_data3

input

秒表:第三位数码管数据

S_data4

input

秒表:第四位数码管数据

Display_Model

input

控制时钟与秒表的显示切换

data

output

送出7段a~g数据

data_dp

output

小数点

clock_top.v

Pin Name

I/O

Description

clk

input

主时钟27MHZ

rst_n

input

系统复位,低有效

add_in

input

开关S1的输入

sub_in

input

开关S2的输入

model_in

input

开关S3的输入

data

output

送出7段a~g数据

select_wei

output

控制数码管流水工作

data_dp

output

小数点

六:代码的实现

 control_wei.v

 1 /***********************************************/
 2 //四位数码管进行流水控制,每位数码管工作5MS
 3 /***********************************************/
 4 module control_wei(
 5                     clk,
 6                     rst_n,
 7                     select_wei,
 8                     );
 9 input clk;
10 input rst_n;
11 output[3:0] select_wei;
12 
13 /**********************************************/
14 parameter T5MS = 18\'d134_999;
15 /**********************************************/
16 reg[3:0] select_wei;
17 reg[17:0] cnt; 
18 always @(posedge clk or negedge rst_n)
19     if(!rst_n) cnt <= 18\'d0;
20     else if(cnt == T5MS)
21         cnt <= 18\'d0;
22     else
23         cnt <= cnt + 1\'b1;
24 /**********************************************/    
25 //通过移位方式进行流水工作,定时开关
26 always @(posedge clk or negedge rst_n)
27     if(!rst_n) begin
28         select_wei <= 4\'d7;
29     end
30     else if(cnt == T5MS) begin
31         if(select_wei == 4\'d14)
32             select_wei <= 4\'d7;
33         else
34             select_wei <= {1\'b1,select_wei[3:1]};
35         end
36 endmodule
37     
38     

View Code

setting.v

  1 module setting(
  2                 //input 
  3                 clk,
  4                 rst_n,
  5                 add_in,//增加按钮
  6                 sub_in,//减去按钮
  7                 model_in,//模式选择
  8                 
  9                 //output
 10                 Hour_Ten,
 11                 Hour_One,
 12                 Minute_Ten,
 13                 Minute_One,
 14                 Display_Model,
 15                 M_Start,
 16                 M_Reset,
 17             );
 18 input clk;
 19 input rst_n;
 20 input add_in;
 21 input sub_in;
 22 input model_in;
 23 
 24 output [1:0] Hour_Ten;
 25 output [3:0] Hour_One;
 26 output [2:0] Minute_Ten;
 27 output [3:0] Minute_One;
 28 output Display_Model;
 29 output M_Start;
 30 output M_Reset;
 31 
 32 /************************************/
 33 parameter T20MS = 20\'d539_999;
 34 parameter T1S = 25\'d26_999_999;
 35 parameter T60S = 31\'d1_619_999_999;
 36 /************************************************/
 37 //检测下降沿脉冲key_en = key_rst_r & (~key_rst);
 38 //key_rst_r要晚一个时钟节拍才能得到key_rst的值
 39 //key_rst在1变为0时,key_en置位
 40 //key_rst   1 1 0 1 1
 41 //key_rst_r   1 1 0 1 1
 42 //~key_rst  0 0 1 0 0
 43 //--------------------------
 44 //key_en    0 0 1 0 0
 45 
 46 //检测上升沿脉冲key_en = (~key_rst_r) & key_rst;
 47 //key_rst在0变为1时,key_en置位
 48 //key_rst       0 0 1 0 0
 49 //key_rst_r        0 0 1 0 0
 50 
 51 //key_rst       0 0 1 0 0
 52 //~key_rst_r        1 1 0 1 1
 53 //--------------------------
 54 //key_en        0 0 1 0 0
 55 /************************************************/
 56 reg[2:0] key_rst;
 57 always @(posedge clk or negedge rst_n)
 58     if(!rst_n) key_rst <= 3\'b111;
 59     else key_rst <= {add_in,sub_in,model_in};
 60     
 61 reg[2:0] key_rst_r;
 62 always @(posedge clk or negedge rst_n)
 63     if(!rst_n) key_rst_r <= 3\'b111;
 64     else key_rst_r <= key_rst;
 65     
 66 wire[2:0] key_en;
 67 assign key_en = key_rst_r & (~key_rst);
 68 /************************************************/
 69 //按键消抖动
 70 /************************************************/
 71 reg[19:0] cnt;
 72 always @(posedge clk or negedge rst_n)
 73     if(!rst_n) cnt <= 20\'d0;
 74     else if(key_en) cnt <= 20\'d0;
 75     else cnt <= cnt + 1\'b1;
 76 //每隔20ms就取按键上的值    
 77 reg[2:0] pin_status;
 78 always @(posedge clk or negedge rst_n)
 79     if(!rst_n) pin_status <= 3\'b111;
 80     else if(cnt == T20MS) pin_status <= {add_in,sub_in,model_in};
 81     
 82 reg[2:0] pin_status_r;
 83 always @(posedge clk or negedge rst_n)
 84     if(!rst_n) pin_status_r <= 3\'b111;
 85     else pin_status_r <= pin_status;
 86 //前20MS的值与后20MS的值
 87 wire[2:0]  pin_status_ctrl;
 88 assign pin_status_ctrl = pin_status_r & (~pin_status);
 89 
 90 /**************************************************************************************************/
 91 //60S计数器
 92 reg [30:0] cnt60s;
 93 always @(posedge clk or negedge rst_n)
 94     if(!rst_n) cnt60s <= 31\'d0;
 95     else if((cnt60s == T60S) || (!isCount)) cnt60s <= 31\'d0;
 96     else if(isCount)
 97         cnt60s <= cnt60s + 1\'b1;    
 98 /**************************************************************************************************/
 99 //模式控制
100 //00:时钟正常跑模式
101 //01:调分模式,在该模式时间计数器停止计数
102 //10: 调时模式,在该模式时间计数器停止计数
103 //11:秒表模式,在该模式时间计数器正常计数
104 reg[1:0] Time_model;
105 always @(posedge clk or negedge rst_n)
106     if(!rst_n) Time_model <= 2\'b00;
107     else if(pin_status_ctrl[0]) 
108         begin
109             if(Time_model == 2\'b11)
110                 Time_model <= 2\'b00;
111             else
112             Time_model <= Time_model + 1\'b1;
113         end
114 
115 /************************************************/
116 reg Display_Model;//时钟与秒表显示
117 reg isCount;//控制时间计数器
118 reg M_Start;//控制秒表计数器
119 reg M_Reset;//秒表复位
120 reg M_flag;//开关S1按第一次代表启动,紧接在按一次代表停止
121 reg [1:0] flag;//用来标志reg1是否到了2,到了2,reg2只能加到4
122 reg [1:0] reg1;//时的第一位:0~2
123 reg [3:0] reg2;//时的第二位:当第一位为0和1时,可以是0~9,当第一位为2时,只能是0~9,
124 reg [2:0] reg3;//分的第一位:只能是0~5
125 reg [3:0] reg4;//分的第二位:是0~9
126 always @(posedge clk or negedge rst_n)
127     if(!rst_n) begin
128         Display_Model <= 1\'b0;
129         isCount <= 1\'b0;
130         M_Start <= 1\'b0;
131         M_Reset <= 1\'b0;
132         M_flag <= 1\'b0;
133         reg1 <= 2\'d0;
134         reg2 <= 4\'d0;
135         reg3 <= 3\'d0;
136         reg4 <= 4\'d0;
137         flag <= 2\'d0;
138     end
139     else
140         case(Time_model)
141         //时钟正常开始跑
142             2\'b00:
143             begin    
144                 Display_Model <= 1\'b0;
145                 isCount <= 1\'b1;//启动计数
146                 if(cnt60s == T60S)
147                 begin
148                     reg4 <= reg4 + 1\'b1;
149                     if(reg4 == 4\'d9)
150                     begin
151                         reg4 <= 4\'d0;
152                         reg3 <= reg3 + 1\'b1;
153                         if(reg3 == 3\'d5)
154                         begin
155                             reg3 <= 3\'d0;
156                             if(reg1 == 2\'d2)
157                             begin
158                                 reg2 <= reg2 + 1\'b1;
159                                 if(reg2 == 4\'d3)
160                                 begin
161                                     reg2 <= 4\'d0;                
162                                     reg1 <= 2\'d0;                            
163                                 end
164                             end 
165                             else 
166                             begin
167                                 reg2 <= reg2 + 1\'b1;
168                                 if(reg2 == 4\'d9)
169                                 begin
170                                 reg2 <= 4\'d0;
171                                 reg1 <= reg1 + 1\'b1;
172                                 end
173                             end
174                         end
175                         
176                     end
177                 end
178             end
179             
180             //调分模式            
181             2\'b01:
182             begin 
183                 isCount <= 1\'b1;
184                 if(pin_status_ctrl[2])//
185                 begin
186                     reg4 <= reg4 + 1\'b1;
187                     if(reg4 == 4\'d9)
188                     begin
189                         reg4 <= 4\'d0;
190                         reg3 <= reg3 + 1\'b1;
191                         if(reg3 > 3\'d5)
192                             reg3 <= 3\'d0;
193                     end
194                 end
195                 else if(pin_status_ctrl[1])//
196                     begin
197                         reg4 <= reg4 - 1\'b1;
198                         if(reg4 == 4\'d0)
199                             begin
200                                 reg4 <= 4\'d9;
201                                 reg3 <= reg3 - 1\'b1;
202                                 if(reg3 == 3\'d5)
203                                     reg3 <= 3\'d0;
204                             end
205                     end
206             end
207 
208             //调时模式
209             2\'b10: 
210             begin
211                 isCount <= 1\'b1;
212                 if(pin_status_ctrl[2])//
213                 begin
214                     if(flag == 2\'d2)
215                     begin
216                         reg2 <= reg2 + 1\'b1;
217                         if(reg2 >= 4\'d3)
218                         begin
219                             reg2 <= 4\'d0;
220                             reg1 <= 2\'d0;
221                             flag <= 2\'d0;
222                         end
223                     end
224                     else
225                     begin
226                         reg2 <= reg2 + 1\'b1;
227                         if(reg2 == 4\'d9)
228                         begin
229                             flag <= flag + 1\'b1;
230                             reg2 <= 4\'d0;
231                             reg1 <= reg1 + 1\'b1;
232                             if(reg1 == 2\'d2)
233                             begin
234                                 reg1 <= 2\'d0;
235                             end
236                         end
237                     end
238                 end
239                 else if(pin_status_ctrl[1])//
240                     begin
241                         reg2 <= reg2 - 1\'b1;
242                         if(reg2 == 4\'d0)
243                             begin
244                                 reg2 <= 4\'d9;
245                                 reg1 <= reg1 - 1\'b1;
246                                 if(reg1 == 2\'d2)
247                                     reg1 <= 2\'d0;
248                             end
249                     end
250             end    
251             
252             2\'b11:begin
253                 isCount <= 1\'b1;//时间计数还得继续接着跑
254                 Display_Model <= 1\'b1;//显示秒表
255                 if(pin_status_ctrl[2])//启动秒表计数
256                 begin
257                     if(M_flag == 1\'b1) begin
258                         M_flag <= 1\'b0;
259                         M_Start <= 1\'b0;
260                     end
261                     else begin
262                         M_flag <= M_flag + 1\'b1;
263                         M_Start <= 1\'b1;
264                         M_Reset <= 1\'b0;
265                         
266                     end
267                 end
268                 else if(pin_status_ctrl[1])//复位并停止
269                 begin
270                     M_Start <= 1\'b0;
271                     M_flag <= 1\'b0;
272                     M_Reset <= 1\'b1;
273                 end
274             end
275         endcase
276 /************************************************/
277 assign Hour_Ten = reg1;
278 assign Hour_One = reg2;
279 assign Minute_Ten = reg3;
280 assign Minute_One = reg4;
281 /************************************************/
282 
283 endmodule

View Code

control_data.v

  1 module control_data(
  2                     //input 
  3                     clk,
  4                     rst_n,
  5                     Hour_Ten,
  6                     Hour_One,
  7                     Minute_Ten,
  8                     Minute_One,
  9                     
 10                     //output
 11                     H_data1,
 12                     H_data2,
 13                     H_data3,
 14                     H_data4
 15                     );
 16 input clk;
 17 input rst_n;
 18 input [1:0] Hour_Ten;
 19 input [3:0] Hour_One;
 20 input [2:0] Minute_Ten;
 21 input [3:0] Minute_One;
 22 output [6:0] H_data1;
 23 output [6:0] H_data2;
 24 output [6:0] H_data3;
 25 output [6:0] H_data4;
 26 /***********************************/
 27 parameter     SEG_NUM0     = 7\'h3f,//c0,
 28             SEG_NUM1     = 7\'h06,//f9,
 29             SEG_NUM2     = 7\'h5b,//a4,
 30             SEG_NUM3     = 7\'h4f,//b0,
 31             SEG_NUM4     = 7\'h66,//99,
 32             SEG_NUM5     = 7\'h6d,//92,
 33             SEG_NUM6     = 7\'h7d,//82,
 34             SEG_NUM7     = 7\'h07,//F8,
 35             SEG_NUM8     = 7\'h7f,//80,
 36             SEG_NUM9     = 7\'h6f;//90,
 37 /***********************************/
 38 //时钟数据编码        
 39 /***********************************/
 40 //数码管一要显示的列表数据(0~2)
 41 reg [6:0] data1_temp;
 42 always @(posedge clk or negedge rst_n)
 43     if(!rst_n)
 44         data1_temp <= 7\'h3f;
 45     else
 46         case(Hour_Ten)
 47             2\'d0:    data1_temp <= SEG_NUM0;
 48             2\'d1:    data1_temp <= SEG_NUM1;
 49             2\'d2:    data1_temp <= SEG_NUM2;
 50             default: data1_temp <= SEG_NUM0;
 51         endcase
 52 /***********************************/
 53 //数码管二要显示的列表数据(0~9)
 54 reg [6:0] data2_temp;
 55 always @(posedge clk or negedge rst_n)
 56     if(!rst_n)
 57         data2_temp <= 7\'h3f;
 58     else
 59         case(Hour_One)
 60             4\'d0:    data2_temp <= SEG_NUM0;
 61             4\'d1:    data2_temp <= SEG_NUM1;
 62             4\'d2:    data2_temp <= SEG_NUM2;
 63             4\'d3:    data2_temp <= SEG_NUM3;
 64             4\'d4:    data2_temp <= SEG_NUM4;
 65             4\'d5:    data2_temp <= SEG_NUM5;
 66             4\'d6:    data2_temp <= SEG_NUM6;
 67             4\'d7:    data2_temp <= SEG_NUM7;
 68             4\'d8:    data2_temp <= SEG_NUM8;
 69             4\'d9:    data2_temp <= SEG_NUM9;
 70             default: data2_temp <= SEG_NUM0;
 71         endcase
 72 /***********************************/
 73 //数码管三要显示的列表数据 (0~5)
 74 reg [6:0] data3_temp;
 75 always @(posedge clk or negedge rst_n)
 76     if(!rst_n)
 77         data3_temp <= 7\'h3f;
 78     else
 79         case(Minute_Ten)
 80             3\'d0:    data3_temp <= SEG_NUM0;
 81             3\'d1:    data3_temp <= SEG_NUM1;
 82             3\'d2:    data3_temp <= SEG_NUM2;
 83             3\'d3:    data3_temp <= SEG_NUM3;
 84             3\'d4:    data3_temp <= SEG_NUM4;
 85             3\'d5:    data3_temp <= SEG_NUM5;
 86             default: data3_temp <= SEG_NUM0;
 87         endcase
 88 /***********************************/
 89 //数码管四要显示的列表数据(1~9)
 90 reg [6:0] data4_temp;
 91 always @(posedge clk or negedge rst_n)
 92     if(!rst_n)
 93         data4_temp <= 7\'h3f;
 94     else
 95         case(Minute_One)
 96             4\'d0:    data4_temp <= SEG_NUM0;
 97             4\'d1:    data4_temp <= SEG_NUM1;
 98             4\'d2:    data4_temp <= SEG_NUM2;
 99             4\'d3:    data4_temp <= SEG_NUM3;
100             4\'d4:    data4_temp <= SEG_NUM4;
101             4\'d5:    data4_temp <= SEG_NUM5;
102             4\'d6:    data4_temp <= SEG_NUM6;
103             4\'d7:    data4_temp <= SEG_NUM7;
104             4\'d8:    data4_temp <= SEG_NUM8;
105             4\'d9:    data4_temp <= SEG_NUM9;
106             default: data4_temp <= SEG_NUM0;
107         endcase
108 /*****************************************/
109 assign H_data1 = data1_temp;
110 assign H_data2 = data2_temp;
111 assign H_data3 = data3_temp;
112 assign H_data4 = data4_temp;
113 /*****************************************/
114 endmodule

View Code

control_display.v

  1 module control_display(
  2                         //input 
  3                         clk,
  4                         rst_n,
  5                         H_data1,
  6                         H_data2,
  7                         H_data3,
  8                         H_data4,
  9                         
 10                         S_data1,
 11                         S_data2,
 12                         S_data3,
 13                         S_data4,
 14                         
 15                         Display_Model,
 16                         
 17                         //output
 18                         data,
 19                         data_dp
 20                         );
 21 input clk;
 22 input rst_n;
 23 //时钟模式要显示数据
 24 input [6:0] H_data1;
 25 input [6:0] H_data2;
 26 input [6:0] H_data3;
 27 input [6:0] H_data4;
 28 //秒表模式要显示数据
 29 input [6:0] S_data1;
 30 input [6:0] S_data2;
 31 input [6:0] S_data3;
 32 input [6:0] S_data4;
 33 input Display_Model;//0:时钟模式,1:秒表模式
 34 
 35 output [6:0] data;//不包括小数点
 36 output data_dp;
 37 /******************************************/
 38 parameter T5MS = 18\'d134_999;
 39 parameter T10MS = 19\'d269_999;
 40 parameter T20MS = 20\'d539_999;
 41 /****************************************************************/    
 42 reg [19:0]cnt_ms;
 43 always @(posedge clk or negedge rst_n)
 44     if(!rst_n)
 45         cnt_ms <= 20\'d0;
 46     else if(cnt_ms == T20MS)
 47         cnt_ms <= 20\'d0;
 48     else
 49         cnt_ms <= cnt_ms + 1\'b1;
 50     
 51 /****************************************************************/    
 52 //小数点显示
 53 reg [1:0] i;
 54 reg data_dp;
 55 always @(posedge clk or negedge rst_n)
 56     if(!rst_n)
 57         i <= 2\'d0;
 58     else
 59     case(i)
 60     2\'d0:
 61     if(cnt_ms != T5MS)
 62         data_dp = 1\'b0;
 63     else begin
 64         data_dp= 1\'b1;
 65         i <= i + 1\'b1;
 66     end
 67   
 68     2\'d1:
 69     if(cnt_ms != T10MS)
 70         data_dp = 1\'b1;
 71     else begin
 72         data_dp <= 1\'b0;
 73         i <= i + 1\'b1;
 74     end
 75     
 76     2\'d2:
 77     if(cnt_ms != T20MS)
 78         data_dp <= 1\'b0;
 79     else
 80         i <= 4\'d0;
 81     endcase
 82 /******************************************/
 83 //定时发送数据
 84 reg [17:0] cnt;    
 85 reg [1:0] num;//每隔5MS,num加1
 86 always @(posedge clk or negedge rst_n)
 87     if(!rst_n) begin
 88         cnt <= 18\'d0;
 89         num <= 2\'d0;
 90     end
 91     else if(cnt == T5MS) begin
 92         num <= num + 1\'b1;
 93         cnt <= 18\'d0;
 94     end
 95     else
 96         cnt <= cnt + 1\'b1;
 97 /******************************************/
 98 //通过Display_Model来确定是要送秒表数据还是时钟数据
 99 reg [6:0] data_temp;
100 always @(posedge clk or negedge rst_n)
101     if(!rst_n)
102         data_temp <= 7\'h3f;
103     else
104         case(num)
105             2\'d0:    data_temp <= Display_Model ? S_data1:H_data1;//给第一个数码管送数据
106             2\'d1:    data_temp <= Display_Model ? S_data2:H_data2;//给第二个数码管送数据
107             2\'d2:    data_temp <= Display_Model ? S_data3:H_data3;//给第二个数码管送数据
108             2\'d3:    data_temp <= Display_Model ? S_data4:H_data4;//给第二个数码管送数据
109         endcase
110 /******************************************/
111 assign data = data_temp;
112 /******************************************/
113 endmodule

View Code

miaobiao.v

  1 module miaobiao(
  2                     //input 
  3                     clk,
  4                     rst_n,
  5                     M_Start,
  6                     M_Reset,
  7                     
  8                     //ouput
  9                     S_data1,
 10                     S_data2,
 11                     S_data3,
 12                     S_data4
 13                 );
 14 input clk;
 15 input rst_n;
 16 input M_Start;//控制秒表计数器
 17 input M_Reset;//秒表复位
 18 output [6:0] S_data1;
 19 output [6:0] S_data2;
 20 output [6:0] S_data3;
 21 output [6:0] S_data4;
 22 
 23 /************************************************************/
 24 parameter     T_fenMiao     = 19\'d269_999;
 25 parameter     SEG_NUM0     = 7\'h3f,//c0,
 26             SEG_NUM1     = 7\'h06,//f9,
 27             SEG_NUM2     = 7\'h5b,//a4,
 28             SEG_NUM3     = 7\'h4f,//b0,
 29             SEG_NUM4     = 7\'h66,//99,
 30             SEG_NUM5     = 7\'h6d,//92,
 31             SEG_NUM6     = 7\'h7d,//82,
 32             SEG_NUM7     = 7\'h07,//F8,
 33             SEG_NUM8     = 7\'h7f,//80,
 34             SEG_NUM9     = 7\'h6f;//90,
 35 /************************************************************/
 36 //分秒计数器
 37 reg [18:0] Cnt_FenMiao;
 38 always @(posedge clk or negedge rst_n)
 39     if(!rst_n) Cnt_FenMiao <= 19\'d0;
 40     else if((Cnt_FenMiao == T_fenMiao) || (!M_Start)) Cnt_FenMiao <= 19\'d0;
 41     else if(M_Start)
 42         Cnt_FenMiao <= Cnt_FenMiao + 1\'b1;    
 43 /************************************************************/
 44 //分秒向秒进位
 45 reg [2:0] reg1;
 46 reg [3:0] reg2;
 47 reg [3:0] reg3;
 48 reg [3:0] reg4;
 49 always @(posedge clk or negedge rst_n)
 50     if(!rst_n) begin
 51         reg1 <= 3\'d0;
 52         reg2 <= 4\'d0;
 53         reg3 <= 4\'d0;
 54         reg4 <= 4\'d0;
 55     end
 56     else if(M_Reset) begin
 57         reg1 <= 3\'d0;
 58         reg2 <= 4\'d0;
 59         reg3 <= 4\'d0;
 60         reg4 <= 4\'d0;
 61     end
 62     else if(Cnt_FenMiao == T_fenMiao)
 63     begin
 64         if(reg4 == 4\'d9) begin
 65             reg4 <= 4\'d0;
 66             if(reg3 == 4\'d9) begin
 67                 reg3 <= 4\'d0;
 68                 if(reg2 == 4\'d9) begin
 69                     reg2 <= 4\'d0;
 70                     if(reg1 == 3\'d5)
 71                         reg1 <= 3\'d0;
 72                     else reg1 <= reg1 + 1\'b1;
 73                 end
 74                 else
 75                     reg2 <= reg2 + 1\'b1;
 76             end
 77             else
 78                 reg3 <= reg3 + 1\'b1;
 79         end
 80         else
 81             reg4 <= reg4 + 1\'b1;
 82     end
 83 /************************************************************/
 84 //数据编码
 85 /************************************************************/
 86 //数码管一要显示的列表数据(0~5)
 87 reg [6:0] S_data1_temp;
 88 always @(posedge clk or negedge rst_n)
 89     if(!rst_n) S_data1_temp <= 7\'h3f;
 90     else 
 91         case(reg1)
 92             3\'d0:    S_data1_temp <= SEG_NUM0;
 93             3\'d1:    S_data1_temp <= SEG_NUM1;
 94             3\'d2:    S_data1_temp <= SEG_NUM2;
 95             3\'d3:    S_data1_temp <= SEG_NUM3;
 96             3\'d4:    S_data1_temp <= SEG_NUM4;
 97             3\'d5:    S_data1_temp <= SEG_NUM5;
 98             default: S_data1_temp <= SEG_NUM0;
 99         endcase
100 /***********************************/
101 //数码管二要显示的列表数据(0~9)
102 reg [6:0] S_data2_temp;
103 always @(posedge clk or negedge rst_n)
104     if(!rst_n) S_data2_temp <= 7\'h3f;
105     else
106         case(reg2)
107             4\'d0:    S_data2_temp <= SEG_NUM0;
108             4\'d1:    S_data2_temp <= SEG_NUM1;
109             4\'d2:    S_data2_temp <= SEG_NUM2;
110             4\'d3:    S_data2_temp <= SEG_NUM3;
111             4\'d4:    S_data2_temp <= SEG_NUM4;
112             4\'d5:    S_data2_temp <= SEG_NUM5;
113             4\'d6:    S_data2_temp <= SEG_NUM6;
114             4\'d7:    S_data2_temp <= SEG_NUM7;
115             4\'d8:    S_data2_temp <= SEG_NUM8;
116             4\'d9:    S_data2_temp <= SEG_NUM9;
117             default: S_data2_temp <= SEG_NUM0;
118         endcase
119 /*****************************************/
120 //数码管三要显示的列表数据(0~9)
121 reg [6:0] S_data3_temp;        
122 always @(posedge clk or negedge rst_n)
123     if(!rst_n) S_data3_temp <= 7\'h3f;
124     else 
125         case(reg3)
126             4\'d0:    S_data3_temp <= SEG_NUM0;
127             4\'d1:    S_data3_temp <= SEG_NUM1;
128             4\'d2:    S_data3_temp <= SEG_NUM2;
129             4\'d3:    S_data3_temp <= SEG_NUM3;
130             4\'d4:    S_data3_temp <= SEG_NUM4;
131             4\'d5:    S_data3_temp <= SEG_NUM5;
132             4\'d6:    S_data3_temp <= SEG_NUM6;
133             4\'d7:    S_data3_temp <= SEG_NUM7;
134             4\'d8:    S_data3_temp <= SEG_NUM8;
135             4\'d9:    S_data3_temp <= SEG_NUM9;
136             default: S_data3_temp <= SEG_NUM0;
137         endcase
138 /***********************************/
139 //数码管四要显示的列表数据(0~9)
140 reg [6:0] S_data4_temp;
141 always @(posedge clk or negedge rst_n)
142     if(!rst_n) S_data4_temp <= 7\'h3f;
143     else
144         case(reg4)
145             4\'d0:    S_data4_temp <= SEG_NUM0;
146             4\'d1:    S_data4_temp <= SEG_NUM1;
147             4\'d2:    S_data4_temp <= SEG_NUM2;
148             4\'d3:    S_data4_temp <= SEG_NUM3;
149             4\'d4:    S_data4_temp <= SEG_NUM4;
150             4\'d5:    S_data4_temp <= SEG_NUM5;
151             4\'d6:    S_data4_temp <= SEG_NUM6;
152             4\'d7:    S_data4_temp <= SEG_NUM7;
153             4\'d8:    S_data4_temp <= SEG_NUM8;
154             4\'d9:    S_data4_temp <= SEG_NUM9;
155             default: S_data4_temp <= SEG_NUM0;
156         endcase
157 /*******************************************************/    
158 assign S_data1 = S_data1_temp;
159 assign S_data2 = S_data2_temp;
160 assign S_data3 = S_data3_temp;
161 assign S_data4 = S_data4_temp;
162 /*******************************************************/
163 endmodule

View Code

clock_top

  1 module clock_top(
  2             //input
  3             clk,
  4             rst_n,
  5             add_in,
  6             sub_in,
  7             model_in,
  8             
  9             //output
 10             data,
 11             select_wei,
 12             data_dp,
 13            );
 14 input clk;
 15 input rst_n;
 16 input add_in;
 17 input sub_in;
 18 input model_in;
 19 
 20 output [6:0] data;
 21 output [3:0] select_wei;
 22 output data_dp;
 23                 
 24 wire [1:0] Hour_Ten;
 25 wire [3:0] Hour_One;
 26 wire [2:0] Minute_Ten;
 27 wire [3:0] Minute_One;
 28 wire [6:0] H_data1,H_data2,H_data3,H_data4;
 29 wire [6:0] S_data1,S_data2,S_data3,S_data4;
 30 wire Display_Model;
 31 wire M_Start;
 32 wire M_Reset;
 33 
 34 control_wei        U1(
 35                     //input
 36                     .clk(clk),
 37                     .rst_n(rst_n),
 38                     
 39                     //output
 40                     .select_wei(select_wei),
 41                     );
 42                     
 43 setting        U2(
 44                 //input 
 45                 .clk(clk),
 46                 .rst_n(rst_n),
 47                 .add_in(add_in),//增加按钮
 48                 .sub_in(sub_in),//减去按钮
 49                 .model_in(model_in),//模式选择
 50                 
 51                 //output
 52                 .Hour_Ten(Hour_Ten),
 53                 .Hour_One(Hour_One),
 54                 .Minute_Ten(Minute_Ten),
 55                 .Minute_One(Minute_One),
 56                 .Display_Model(Display_Model),
 57                 .M_Start(M_Start),
 58                 .M_Reset(M_Reset),
 59             );
 60     
 61 control_data   U3(
 62                     //input 
 63                     .clk(clk),
 64                     .rst_n(rst_n),
 65                     .Hour_Ten(Hour_Ten),//from to U2
 66                     .Hour_One(Hour_One),//from to U2
 67                     .Minute_Ten(Minute_Ten),//from to U2
 68                     .Minute_One(Minute_One),//from to U2
 69                     
 70                     //output
 71                     .H_data1(H_data1),
 72                     .H_data2(H_data2),
 73                     .H_data3(H_data3),
 74                     .H_data4(H_data4)
 75                     );
 76                     
 77 control_display     U4(
 78                         //input 
 79                         .clk(clk),
 80                         .rst_n(rst_n),
 81                         .H_data1(H_data1),//from to U3
 82                         .H_data2(H_data2),//from to U3
 83                         .H_data3(H_data3),//from to U3
 84                         .H_data4(H_data4),//from to U3
 85                         .S_data1(S_data1),//from to U5
 86                         .S_data2(S_data2),//from to U5
 87                         .S_data3(S_data3),//from to U5
 88                         .S_data4(S_data4),//from to U5
 89                         .Display_Model(Display_Model),//from to U2
 90                         
 91                         //output
 92                         .data(data),
 93                         .data_dp(data_dp)
 94                         );
 95                     
 96 miaobiao         U5(
 97                     //input 
 98                     .clk(clk),
 99                     .rst_n(rst_n),
100                     .M_Start(M_Start),//from to U2
101                     .M_Reset(M_Reset),//from to U2
102                     
103                     //ouput
104                     .S_data1(S_data1),
105                     .S_data2(S_data2),
106                     .S_data3(S_data3),
107                     .S_data4(S_data4),
108                 );
109 endmodule

View Code

 

版权声明:本文为wen2376原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wen2376/p/3255324.html