实现手表的计时功能:
1.具有start启动信号、pause暂停信号,可以自定义其触发机制。
2.具有时间更改接口,可以更改时、分、秒。
3.输出时、分、秒。
Verilog设计
模块端口定义:
module watch1(input   wire            clk         ,input   wire            rst_n       ,input   wire            start       ,   //input   wire            pause       ,   //input   wire            h_add       ,   //when it is 1, hour   will add 1(when changing the time, the current time do not count)input   wire            m_add       ,   //when it is 1, minute will add 1(when changing the time, the current time do not count)input   wire            s_add       ,   //when it is 1, second will add 1(when changing the time, the current time do not count)output  reg     [4:0]   hour        ,output  reg     [5:0]   minute      ,output  reg     [5:0]   second           // second+1 per period
);手表计时使能:
always@(posedge clk or negedge rst_n)if(!rst_n) running <= 1'b0;else if(pause && start)     //push the keys in the same time, the watch still runsrunning <= 1'b1;//running;keep the stateelse if(pause)     //running <= 1'b0;else if(start)     //running <= 1'b1;else ;或者:
always@(posedge clk or negedge rst_n)if(!rst_n) running <= 1'b0;else if(start_rise)     //push the key, the watch will run(higher priority)running <= 1'b1;else if(pause_rise)     //push the key, the watch will stoprunning <= 1'b0;// else if(start_fall)     //release the key, the watch will run//     running <= 1'b1;else ;小时:
always@(posedge clk or negedge rst_n)if(!rst_n) hour <= 'b0;else if(h_add) beginif(hour == CNT_23)hour <= 'b0;elsehour <= hour + 1'b1;endelse if(running & ~m_add & ~s_add ) begin    //when changing the time, the current time do not countif(second == CNT_59 && minute == CNT_59) beginif(hour == CNT_23)hour <= 'b0;elsehour <= hour + 1'b1;endelse ;endelse ;分钟:
always@(posedge clk or negedge rst_n)if(!rst_n) minute <= 'b0;else if(m_add) beginif(minute == CNT_59)minute <= 'b0;elseminute <= minute + 1'b1;endelse if(running & ~s_add & ~h_add ) begin    //when changing the time, the current time do not countif(second == CNT_59) beginif(minute == CNT_59)minute <= 'b0;elseminute <= minute + 1'b1;endelse ;endelse ;秒:
always@(posedge clk or negedge rst_n)if(!rst_n) second <= 'b0;else if(s_add) beginif(second == CNT_59)second <= 'b0;elsesecond <= second + 1'b1;endelse if(running & ~m_add & ~h_add ) begin    //when changing the time, the current time do not countif(second == CNT_59)second <= 'b0;elsesecond <= second + 1'b1;    // second+1 per periodendelse ;仿真波形
时钟进位:

启动&暂停:


或者:


顶层集成
//
module watch_top(input   wire            clk         ,input   wire            rst_n       ,input   wire            start_key   ,   //按键:开始计时(按下按键时均为0)input   wire            pause_key   ,   //按键:暂停计时input   wire            h_key       ,   //按键:时+1input   wire            m_key       ,   //按键:分+1input   wire            s_key       ,   //按键:秒+1output  wire    [4:0]   hour        ,   //时output  wire    [5:0]   minute      ,   //分output  wire    [5:0]   second          //秒(每时钟周期+1)
);// parameter ======================================================// wire =============================================================
wire start;
wire pause;
wire h_add;
wire m_add;
wire s_add;// reg =============================================================// assign =============================================================// always ==========================================================// instantiation ======================================================================
//
key_filter u_start_filter(.clk        (clk   ),.rst_n      (rst_n ),.key_in     (start_key),.key_flag   ( ),.key_out    (start),.key_cont   ()
);
key_filter u_pause_filter(.clk        (clk   ),.rst_n      (rst_n ),.key_in     (pause_key),.key_flag   ( ),.key_out    (pause),.key_cont   ()
);
//
key_filter u_h_filter(.clk        (clk   ),.rst_n      (rst_n ),.key_in     (h_key),.key_flag   ( ),.key_out    (),.key_cont   (h_add)
);
key_filter u_m_filter(.clk        (clk   ),.rst_n      (rst_n ),.key_in     (m_key),.key_flag   ( ),.key_out    (),.key_cont   (m_add)
);
key_filter u_s_filter(.clk        (clk   ),.rst_n      (rst_n ),.key_in     (s_key),.key_flag   ( ),.key_out    (),.key_cont   (s_add)
);
//
watch2 u_watch(.clk         (clk   ),.rst_n       (rst_n ),.start       (start ),   //.pause       (pause ),   //.h_add       (h_add ),   //when it is 1, hour   will add 1.m_add       (m_add ),   //when it is 1, minute will add 1.s_add       (s_add ),   //when it is 1, second will add 1.hour        (hour  ),.minute      (minute),.second      (second) 
);endmodule