差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 上一修订版 两侧同时换到之后的修订记录 | ||
8._计时控制 [2017/03/23 09:31] zhijun [小结] |
8._计时控制 [2018/12/13 14:40] zhijun [Verilog代码] |
||
---|---|---|---|
行 18: | 行 18: | ||
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | ||
// ******************************************************************** | // ******************************************************************** | ||
- | // File name : debounce.v | + | // File name : counter.v |
- | // Module name : debounce | + | // Module name : counter |
// Author : STEP | // Author : STEP | ||
// Description : | // Description : | ||
行 30: | 行 30: | ||
// V1.0 |2017/03/02 |Initial ver | // V1.0 |2017/03/02 |Initial ver | ||
// -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
- | // Module Function:计时器 | + | // Module Function:24秒倒计时计数器 |
- | + | ||
- | module segment_counter | + | module counter |
( | ( | ||
- | clk , | + | clk , //时钟 |
- | rst , | + | rst , //复位 |
- | hold , | + | hold , //启动暂停按键 |
- | seg_led_1 , | + | seg_led_1 , //数码管1 |
- | seg_led_2 , | + | seg_led_2 , //数码管2 |
+ | led //led | ||
); | ); | ||
+ | |||
input clk,rst; | input clk,rst; | ||
input hold; | input hold; | ||
- | + | ||
- | output reg [8:0] seg_led_1,seg_led_2; | + | output [8:0] seg_led_1,seg_led_2; |
- | + | output reg [7:0] led; | |
- | reg clk_divided; | + | |
- | reg hold_flag; | + | wire clk1h; //1Hz时钟 |
- | reg back_to_zero_flag = 0; | + | wire hold_pulse; //按键消抖后信号 |
+ | reg hold_flag; //按键标志位 | ||
+ | reg back_to_zero_flag ; //计时完成信号 | ||
reg [6:0] seg [9:0]; | reg [6:0] seg [9:0]; | ||
- | reg [23:0] cnt; | + | reg [3:0] cnt_ge; //个位 |
- | reg [3:0] cnt_ge; | + | reg [3:0] cnt_shi; //十位 |
- | reg [3:0] cnt_shi; | + | |
- | + | ||
- | parameter PERIOD=12000000; //1秒 | + | |
- | + | ||
initial | initial | ||
begin | begin | ||
行 77: | 行 77: | ||
end | end | ||
- | always @ (posedge clk) begin // 用于分出一个1Hz的频率 | + | |
- | if (!rst == 1) begin | + | |
- | cnt <= 0; | + | // 启动/暂停按键进行消抖 |
- | clk_divided <= 0; end | + | debounce U2 ( |
- | else begin | + | .clk(clk), |
- | if (cnt < PERIOD-1) | + | .rst(rst), |
- | cnt <= cnt + 1; | + | .key(hold), |
- | else begin | + | .key_pulse(hold_pulse) |
- | cnt <= 0; | + | ); |
- | clk_divided <= ~clk_divided; end | + | // 用于分出一个1Hz的频率 |
- | end | + | divide #(.WIDTH(32),.N(12000000)) U1 ( |
- | end | + | .clk(clk), |
- | + | .rst_n(rst), | |
- | always @ (*) begin | + | .clkout(clk1h) |
- | if (!rst == 1) | + | ); |
- | back_to_zero_flag <= 1; | + | //按键动作标志信号产生 |
- | else if (((cnt_shi*10) + cnt_ge)==24) | + | always @ (posedge hold_pulse) |
+ | if(!rst==1) | ||
+ | hold_flag <= 0; | ||
+ | else | ||
+ | hold_flag <= ~hold_flag; | ||
+ | //计时完成标志信号产生 | ||
+ | always @ (*) | ||
+ | if(!rst == 1) | ||
+ | back_to_zero_flag <= 0; | ||
+ | else if(cnt_shi==0 && cnt_ge==0) | ||
back_to_zero_flag <= 1; | back_to_zero_flag <= 1; | ||
else | else | ||
back_to_zero_flag <= 0; | back_to_zero_flag <= 0; | ||
- | end | + | //24秒倒计时控制 |
- | + | always @ (posedge clk1h or negedge rst) begin | |
- | always @ (posedge hold) | + | if (!rst == 1) begin |
- | hold_flag <= ~hold_flag; | + | cnt_ge <= 4'd4; |
- | + | cnt_shi <= 4'd2; | |
- | always @ (posedge clk_divided or posedge back_to_zero_flag) begin | + | end |
- | if (back_to_zero_flag == 1) begin | + | else if(hold_flag == 1)begin |
- | cnt_ge <= 0; | + | cnt_ge <= cnt_ge; |
- | cnt_shi <= 0; end | + | cnt_shi <= cnt_shi; |
- | else if (cnt_ge == 9) begin | + | end |
- | cnt_ge <= 0; | + | else if(cnt_shi==0 && cnt_ge==0) begin |
- | cnt_shi <= cnt_shi + 1; end | + | cnt_shi <= cnt_shi; |
- | else if (hold_flag == 1) | + | |
cnt_ge <= cnt_ge; | cnt_ge <= cnt_ge; | ||
+ | end | ||
+ | else if(cnt_ge==0)begin | ||
+ | cnt_ge <= 4'd9; | ||
+ | cnt_shi <= cnt_shi-1;end | ||
else | else | ||
- | cnt_ge <= cnt_ge + 1; | + | cnt_ge <= cnt_ge -1; |
+ | end | ||
+ | //计时完成点亮led | ||
+ | always @ ( back_to_zero_flag)begin | ||
+ | if (back_to_zero_flag==1) | ||
+ | led = 8'b0; | ||
+ | else | ||
+ | led = 8'b11111111; | ||
end | end | ||
- | |||
- | always @ (cnt_ge) begin | ||
- | seg_led_1[8:0] <= {2'b00,seg[cnt_ge]}; | ||
- | end | ||
- | always @ (cnt_shi) begin | + | assign seg_led_1[8:0] = {2'b00,seg[cnt_ge]}; |
- | seg_led_2[8:0] <= {2'b00,seg[cnt_shi]}; | + | |
- | end | + | assign seg_led_2[8:0] = {2'b00,seg[cnt_shi]}; |
- | + | ||
+ | |||
endmodule | endmodule | ||