本帖最后由 zhangyuhua 于 2017-3-12 20:27 编辑
今天在学习制作一个倒计时系统时,学到了一个新的知识点。 一个按键具有两种功能作用。当按键首次被按下时,代表给FPGA发送了一个Start信号,系统开始计时;当再次按下此按键时,代表给FPGA发送了一个Stop信号,系统停止计时。(注释:key=1-------按键没被按下; key=0-------按键被按下 )模块信号列表:
信号名 | 位宽 | I/O | 备注 | sclk | 1 | input | 系统时钟(50M) | rst_n | 1 | input | 系统复位(低电平有效) | key | 1 | input | 按键(key=1表明按键没被按下;key=0表明按键被按下) | cnt | 4 | output | 计数 | 源代码和Modelsim仿真图如下:
//一个按键具有两种功能作用。(如:按一下表示开始(Start)信号,而再按一下表示停止(Stop)信号)
module one_have_two(
//System Signals
input sclk ,
input rst_n ,
//Interface
input key , //key=1----The key not is pressed
//key=0----The key is pressed
//Others
output reg [3:0] cnt
);
//========================================================================\
// **********Define Parameter and Internal Signals*******************
//========================================================================/
parameter END_CNT = 14 ;
wire add_cnt ;
wire end_cnt ;
reg flag ;
//========================================================================\
// **********Main Code*******************
//========================================================================/
//cnt
always @(posedge sclk or negedge rst_n)
begin
if(!rst_n)
cnt<='d0;
else if(add_cnt)
if(end_cnt)
cnt<='d0;
else cnt<=cnt+1'b1;
end
assign add_cnt=flag;
assign end_cnt=add_cnt && cnt==END_CNT;
//flag
always @(posedge sclk or negedge rst_n)
begin
if(!rst_n)
flag<=1'b0;
else if(key==1'b1 ) //The key not is pressed
flag<=1'b0;
else flag<=~flag; //The key is pressed
end
endmodule
|