如何用Verilog设计反应计时器?(标签-ar|关键词-input)

img


要求
1:输出端口的定义与题目所给的一样,如start,stop,clear等等。并且题目不要求随机的时间,固定时间4s即可,也就是说不需要随机数的产生
2.每一个输入与输出变量表示的什么意思,要用注释给出,例如input start;//输入信号start,表示测试开始
3.需要正确的test代码以及modelsim仿真结果的以及图片
4.代码层次分明,谢谢你。
5.芯片选择cycloneIV E, 引脚数144,内核速度等级 8,如下图
6.输入高电平使得数码管中的a,b,c,d,e,f,g亮

img


//`timescale 1ns / 1ns
`timescale 1us / 1us
module ts_speed_testbench();
reg            clk = 0;
reg            rst_n = 1;
reg    [5:0]    key;        //6 个按键
wire[6:0]    led_dat;    //{g,f,e,d,c,b,a} //7段LED 排列
wire        led_dp;        //dp 小数点
wire[7:0]    led_seg;    //数码管段位,最左是7,最右是 0
wire        led;
parameter CLK_PERIOD    = 20;            //50KHz 20us
//parameter CLK_PERIOD    = 20;            //50MHz 20ns
//parameter RDY_PERIOD    = 1000*1000;    //1ms
parameter RDY_PERIOD    = 1000;    //1ms
initial begin
                    clk        = 0;
                    rst_n    = 1;
                    key        = 6'b111111;    //6 个按键全部抬起
#(RDY_PERIOD*10)    rst_n    = 0;
#(RDY_PERIOD*10)    rst_n    = 1;
////////////////////////////////////////////////////////////////////////////
// 不到 4 秒按 STOP 显示 Err
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*3000)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 001 按下 [start] 4秒+300ms 等待后 STOP 显示 存储一条记录 300ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4300)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 002 按下 [start] 4秒+700ms 等待后 STOP 显示 存储一条记录 700ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4700)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 003 按下 [start] 4秒+990ms 等待后 STOP 显示 存储一条记录 990ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4990)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 004 按下 [start] 4秒+910ms 等待后 STOP 显示 存储一条记录 910ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4910)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 005 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 110ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4110)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 006 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 123ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4123)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 007 按下 [start] 4秒+222ms 等待后 STOP 显示 存储一条记录 222ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4222)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 008 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 333ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4333)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 009 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 444ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4444)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 010 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 555ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4555)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]

////////////////////////////////////////////////////////////////////////////
// 011 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 11ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4011)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]
////////////////////////////////////////////////////////////////////////////
// 012 按下 [start] 4秒+90ms 等待后 STOP 显示 存储一条记录 998ms
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[1]    = 0;            //按下 [start]
#(RDY_PERIOD)        key[1]    = 1;            //抬起 [start]
#(RDY_PERIOD*4998)    key[2]    = 0;            //按下 [stop]
#(RDY_PERIOD)        key[2]    = 1;            //抬起 [stop]

////////////////////////////////////////////////////////////////////////////
// 010 按下 [min]
#(RDY_PERIOD*10)    key[0]    = 0;            //按下 [clr]
#(RDY_PERIOD)        key[0]    = 1;            //抬起 [clr]
#(RDY_PERIOD*200)    key[3]    = 0;            //按下 [min]
#(RDY_PERIOD)        key[3]    = 1;            //抬起 [min]
#(RDY_PERIOD*200)    key[4]    = 0;            //按下 [max]
#(RDY_PERIOD)        key[4]    = 1;            //抬起 [max]
repeat(15)
begin
    #(RDY_PERIOD*200)    key[5]    = 0;            //按下 [brw]
    #(RDY_PERIOD)        key[5]    = 1;            //抬起 [brw]
end
#(RDY_PERIOD*1000)
$stop;


end
always #(CLK_PERIOD/2) clk = ~clk;    //100Hz

ts_speed    ts_u1
(
    .clk        (clk),        //50MHz,
    .rst_n        (rst_n),    //复位,低有效
    .key        (key),        //6 个按键
    .led_dat    (led_dat),    //{g,f,e,d,c,b,a} //7段LED 排列
    .led_dp        (led_dp),    //dp 小数点
    .led_seg    (led_seg),    //数码管段位,最左是7,最右是 0
    .led        (led)
);
endmodule