zoukankan      html  css  js  c++  java
  • 基于Verilog HDL 的数字时钟设计

    基于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
  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/wen2376/p/3255324.html
Copyright © 2011-2022 走看看