设计任务

1、四人通过按键抢答,最先按下按键的人抢答成功,此后其他人抢答无效,抢答成功的人对应的LED灯亮。
2、每次只有一人可获得抢答资格,一次抢答完后主持人通过复位按键复位,选手再从新抢答。
3、有重新开始游戏按键,游戏从新开始时每位选手有5分的初始分,答对加1分,答错扣1分,最高分不能超过9分,最低为0分。
4、每位选手和主持人共有30秒时间进行回答和加减分,在此期间,RGB为蓝色灯;超过30秒,RGB变为红色,即报警;未开始抢答,则RGB灯为绿色。
5、选手抢答成功时通过数码管显示其对应的分数。

代码分析

  1. 本次设计共有7个模块:
模块 功能
common.v 头文件
devide.v 用来对时钟进行分频
counter.v 计时30秒
debounce.v 按键消抖
segment.v 数码管显示
snatch.v 抢答,定义了抢答规则,并开始计时30s
score.v 分数,用来对选手加分减分等
qiangdaqi.v 顶层文件
  1. 设计代码
  • common.v
//*************************************************************
//
//*@File name: common.v
//
//*@File type: verilog
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-07 11:26:28
//
//*@Function : Some Macros.
//
//*************************************************************/* Used in unblocking */
/* Just to be convenient to watch the waves in RTL level */`define DEL 1/* Define your own macro here */
`define SIM 1
  • devide.v
// ********************************************************************
// File name    : divide.v
// Module name  : divide
// Author       :
// Description  : clock divider
// Module Function:任意整数时钟分频
// ********************************************************************module divide (  clk,rst_n,clkout);input     clk,rst_n;       //输入信号,其中clk连接到FPGA的C1脚,频率为12MHzoutput   clkout;          //输出信号,可以连接到LED观察分频的时钟parameter WIDTH   = 24;     //计数器的位数,计数的最大值为 2**WIDTH-1parameter  N   = 12000000;         //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出reg  [WIDTH-1:0] cnt_p,cnt_n;     //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器reg          clk_p,clk_n;     //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟//上升沿触发时计数器的控制always @ (posedge clk or negedge rst_n )   //posedge和negedge是verilog表示信号上升沿和下降沿//当clk上升沿来临或者rst_n变低的时候执行一次always里的语句beginif(!rst_n)cnt_p<=0;else if (cnt_p==(N-1))cnt_p<=0;else cnt_p<=cnt_p+1;             //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器end//上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%always @ (posedge clk or negedge rst_n)beginif(!rst_n)clk_p<=0;else if (cnt_p<(N>>1))          //N>>1表示右移一位,相当于除以2去掉余数clk_p<=0;else clk_p<=1;               //得到的分频时钟正周期比负周期多一个clk时钟end//下降沿触发时计数器的控制         always @ (negedge clk or negedge rst_n)beginif(!rst_n)cnt_n<=0;else if (cnt_n==(N-1))cnt_n<=0;else cnt_n<=cnt_n+1;end//下降沿触发的分频时钟输出,和clk_p相差半个时钟always @ (negedge clk)beginif(!rst_n)clk_n<=0;else if (cnt_n<(N>>1))  clk_n<=0;else clk_n<=1;                //得到的分频时钟正周期比负周期多一个clk时钟endassign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p;//条件判断表达式//当N=1时,直接输出clk//当N为偶数也就是N的最低位为0,N(0)=0,输出clk_p//当N为奇数也就是N最低位为1,N(0)=1,输出clk_p&clk_n。正周期多所以是相与
endmodule   
  • counter.v
//*************************************************************
//
//*@File name: counter.v
//
//*@File type: verilog
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-07 11:22:56
//
//*@Function : Count 30s
//
//*************************************************************
//
// Head files
`include "common.v"
//
// Module definition
module counter(clk        ,                rst_n      ,        start      ,       valid
);input                     clk   ;                  input                     rst_n ;  input                     start ;  output                    valid ;  reg                       valid ;//// Generate the 1Hz clockwire                      clkout_1hz;`ifdef SIM// 12Mhz in simulation mode, just to reduce sim timedivide #(.N(1)) devide_u1 (   .clk   ( clk    ) ,.rst_n ( rst_n  ) ,.clkout( clkout_1hz ) ); `else // 1Hz in real modedivide devide_u1(  .clk   ( clk    ) ,.rst_n ( rst_n  ) ,.clkout( clkout_1hz ) ); `endif///*Function Description://*  Detect the rise edge of clkout_1hz as enable signal//*  ///reg     clkout_1hz_q;wire    clkout_1hz_flag;always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginclkout_1hz_q <= #`DEL 1'b0;endelse beginclkout_1hz_q <= #`DEL clkout_1hz;endendassign clkout_1hz_flag = ( ~clkout_1hz_q ) && ( clkout_1hz );//// Delay of startreg start_dly;reg [4:0] cnt_1s;always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginstart_dly <= #`DEL 1'b0;endelse if( start ) beginstart_dly <= #`DEL 1'b1;endelse if( cnt_1s == 5'd29 ) beginstart_dly <= #`DEL 1'b0;endend      // // Count by 1salways @( posedge clk or negedge rst_n ) beginif( ~rst_n ) begincnt_1s <= #`DEL 5'd0;endelse if( start_dly ) beginif( clkout_1hz_flag ) begincnt_1s <= #`DEL cnt_1s + 1'b1;endendelse begincnt_1s <= #`DEL 5'd0;endend   //// Generate the end signal: validalways @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginvalid <= #`DEL 1'b0;endelse if( cnt_1s == 5'd29 ) beginvalid <= #`DEL 1'b1;endelse beginvalid <= #`DEL 1'b0;endend      endmodule
  • debounce.v
// ********************************************************************
// File name    : debounce.v
// Module name  : debounce
// Description  :
// Module Function:按键消抖
// ********************************************************************
`include "common.v"
module debounce (clk,rst,key,key_pulse);parameter       N  =  1;         //要消除抖动的按键的数量input             clk;input             rst;input    [N-1:0]   key;           //输入的按键                    output  [N-1:0]   key_pulse;     //按键动作产生的脉冲一个时钟周期高电平   reg     [N-1:0]   key_rst_pre;   //定义一个寄存器型变量存储上一个触发时的按键值reg     [N-1:0]   key_rst;       //定义一个寄存器变量储存储当前时刻触发的按键值wire    [N-1:0]   key_edge;      //检测到按键由高到低变化时产生一个高脉冲//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中always @(posedge clk  or  negedge rst)beginif (!rst) beginkey_rst <= {N{1'b1}};       //初始化时给key_rst赋值全为1,{}中表示N个1key_rst_pre <= {N{1'b1}};endelse beginkey_rst <= key;             //第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_prekey_rst_pre <= key_rst;     //非阻塞赋值。相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值end    end//脉冲边沿检测。当key检测到下降沿时,key_edge产生一个时钟周期的高电平assign  key_edge = key_rst_pre & (~key_rst);reg    [17:0]    cnt;                       //产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器     //产生20ms延时,当检测到key_edge有效是计数器清零开始计数always @(posedge clk or negedge rst)beginif(!rst)cnt <= 18'h0;else if(key_edge)cnt <= 18'h0;elsecnt <= cnt + 1'h1;end  reg     [N-1:0]   key_sec_pre;                //延时后检测电平寄存器变量reg     [N-1:0]   key_sec;                    //延时后检测key,如果按键状态变低产生一个时钟的高脉冲。如果按键状态是高的话说明按键无效always @(posedge clk  or  negedge rst)beginif (!rst) key_sec <= {N{1'b1}};                else if (cnt==18'h3ffff)key_sec <= key;  endalways @(posedge clk  or  negedge rst)beginif (!rst)key_sec_pre <= {N{1'b1}};else                   key_sec_pre <= key_sec;             end      assign  key_pulse = key_sec_pre & (~key_sec);     endmodule
  • segment.v
// ********************************************************************
// File name    : segment.v
// Module name  : segment
// Description  : segment initial
// Module Function:数码管的译码模块初始化
// ********************************************************************module segment (seg_data_1,seg_data_2,seg_led_1,seg_led_2);input  [3:0] seg_data_1;  //数码管需要显示0~9十个数字,所以最少需要4位输入做译码input  [3:0] seg_data_2;  //小脚丫上第二个数码管output [8:0] seg_led_1;      //在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、Aoutput [8:0] seg_led_2;       //在小脚丫上第二个数码管的控制信号  MSB~LSB=DIG、DP、G、F、E、D、C、B、Areg [8:0] seg [9:0];         //定义了一个reg型的数组变量,相当于一个10*9的存储器,initial  beginseg[0] = 9'h3f;         //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字  0seg[1] = 9'h06;         //7段显示数字  1seg[2] = 9'h5b;         //7段显示数字  2seg[3] = 9'h4f;         //7段显示数字  3seg[4] = 9'h66;         //7段显示数字  4seg[5] = 9'h6d;         //7段显示数字  5seg[6] = 9'h7d;         //7段显示数字  6seg[7] = 9'h07;         //7段显示数字  7seg[8] = 9'h7f;         //7段显示数字  8seg[9] = 9'h6f;         //7段显示数字  9endassign seg_led_1 = seg[seg_data_1];      //连续赋值,这样输入不同四位数,assign seg_led_2 = seg[seg_data_2];      //就能输出对于译码的9位输出endmodule
  • snatch.v
//*************************************************************
//
//*@File name: snatch.v
//
//*@File type: verilog
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-07 21:00:41
//
//*@Function : Detect the key pressed
//
//*************************************************************
//
// Head files
`include "common.v"
//
//  Module definition
//
module snatch(clk    ,              rst_n  ,          key    ,  reload ,   // Connect to the 3rd switch led    ,    valid_dly,debug_key_pulse_reg,      debug_valid_dly,debug_lock,rgb
);//// Input and output signalsinput                     clk    ;                 input                     rst_n  ;              input      [3:0]          key    ;   input                     reload ;  output     [3:0]          led    ;        output     [2:0]          rgb    ;     output                    valid_dly    ;  reg        [3:0]          led    ;      reg        [2:0]          rgb    ;     reg                       valid_dly; //// Debug signaloutput     [3:0]          debug_key_pulse_reg    ;  output                    debug_valid_dly    ;        output                    debug_lock    ;   // // Key debounce instantiationwire [3:0] key_pulse;debounce #(.N(4)) debounce_u1(.clk      ( clk       ) ,.rst      ( rst_n     ) ,.key      ( key       ) ,.key_pulse( key_pulse )    );// // Used to store the key_pulse for longreg [3:0] key_pulse_reg;always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginkey_pulse_reg <= #`DEL 4'b0000;endelse if( |key_pulse & ~lock ) beginkey_pulse_reg <= #`DEL key_pulse;endelse if( reload ) beginkey_pulse_reg <= #`DEL 4'd0;endend      assign debug_key_pulse_reg = key_pulse_reg;// // Judge playeralways @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginled <= #`DEL 4'b1111;endelse if( key_pulse_reg[3] ) beginled <= #`DEL 4'b0111;endelse if( key_pulse_reg[2] ) beginled <= #`DEL 4'b1011;endelse if( key_pulse_reg[1] ) beginled <= #`DEL 4'b1101;endelse if( key_pulse_reg[0] ) beginled <= #`DEL 4'b1110;endelse beginled <= #`DEL 4'b1111;endend      // // Signal: lock// The key was pressed, the lock is valid// Then the value of key is invalid until the reload comingreg lock;always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginlock <= #`DEL 1'b0;endelse if( reload ) beginlock <= #`DEL 1'b0;endelse if( key_pulse_reg[3] || key_pulse_reg[2] || key_pulse_reg[1] || key_pulse_reg[0] ) beginlock <= #`DEL 1'b1;endelse beginlock <= #`DEL lock;endendassign debug_lock = ~lock;//// Detect the rise edge of lockreg     lock_q;wire    lock_flag;always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginlock_q <= #`DEL 1'b0;endelse beginlock_q <= #`DEL lock;endendassign lock_flag = ( ~lock_q ) && ( lock );// // Counter instantiation// When detect the rise edge of lock, then begin to countcounter counter_u1(.clk   ( clk       )     ,                .rst_n ( rst_n     )     ,        .start ( lock_flag )     ,       .valid ( valid     )        ); // // valid is a pulse signal, so there need a delay of validalways @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginvalid_dly <= #`DEL 1'b0;endelse if( valid ) beginvalid_dly <= #`DEL 1'b1;endelse if( reload ) beginvalid_dly <= #`DEL 1'b0;endend    assign debug_valid_dly = ~valid_dly;// // RGB display// if lock  == 0, green// if lock  == 1, blue// if valid == 1, redalways @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginrgb <= #`DEL 3'b111;endelse if( valid_dly ) begin rgb <= #`DEL 3'b011;endelse if( ~lock ) beginrgb <= #`DEL 3'b101;endelse if( lock ) beginrgb <= #`DEL 3'b110;endend      endmodule
  • score.v
//*************************************************************
//
//*@File name: score.v
//
//*@File type: verilog
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-08 08:41:02
//
//*@Function : Describe the score of players
//
//*************************************************************
//
// Head files
`include "common.v"
//
//  Module definition
//
module score(clk       ,           rst_n     ,       add_score ,              sub_score ,     led       ,        lock      ,end_score         );//===========================================================//* Input and output signals//===========================================================input                     clk        ;             input                     rst_n      ;          input                     add_score  ;              input                     sub_score  ;      input                     lock       ;                input     [3:0]           led        ;        output    [3:0]           end_score  ;              wire      [3:0]           end_score  ;              //===========================================================//* Internal signals//===========================================================reg  [3:0] score_player[0:3];// // Switch debounce instantiationwire [1:0] switch_pulse;debounce #(.N(2)) debounce_u1(.clk      ( clk       ) ,.rst      ( rst_n     ) ,.key      ( {add_score,sub_score} ) ,.key_pulse( switch_pulse )    );wire add_score_flag, sub_score_flag;assign {add_score_flag, sub_score_flag} = switch_pulse;///*Function Description://*  Display the initial score//*  Add or sub one score at the same time///always @( posedge clk or negedge rst_n ) beginif( ~rst_n ) beginscore_player[0] <= #`DEL 4'd5;score_player[1] <= #`DEL 4'd5;score_player[2] <= #`DEL 4'd5;score_player[3] <= #`DEL 4'd5;endelse if( ~&led && ~lock ) begincase(1'b1)~led[0]:beginif( add_score_flag ) beginif( score_player[0] < 4'd9 ) beginscore_player[0] <= #`DEL score_player[0] + 1'b1;endendelse if( sub_score_flag ) beginif( |score_player[0] ) beginscore_player[0] <= #`DEL score_player[0] - 1'b1;endendend~led[1]:beginif( add_score_flag ) beginif( score_player[1] < 4'd9 ) beginscore_player[1] <= #`DEL score_player[1] + 1'b1;endendelse if( sub_score_flag ) beginif( |score_player[1] ) beginscore_player[1] <= #`DEL score_player[1] - 1'b1;endendend~led[2]:beginif( add_score_flag ) beginif( score_player[2] < 4'd9 ) beginscore_player[2] <= #`DEL score_player[2] + 1'b1;endendelse if( sub_score_flag ) beginif( |score_player[2] ) beginscore_player[2] <= #`DEL score_player[2] - 1'b1;endendend~led[3]:beginif( add_score_flag ) beginif( score_player[3] < 4'd9 ) beginscore_player[3] <= #`DEL score_player[3] + 1'b1;endendelse if( sub_score_flag ) beginif( |score_player[3] ) beginscore_player[3] <= #`DEL score_player[3] - 1'b1;endendendendcaseendend     assign end_score = &led ? 4'd0 : (~led[0] ? score_player[0] : (~led[1] ? score_player[1] :(~led[2] ? score_player[2] :(~led[3] ? score_player[3] : 4'd0))));endmodule
  • qiangdaqi.v
//*************************************************************
//
//*@File name: qiangdaqi.v
//
//*@File type: verilog top module
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-08 11:11:08
//
//*@Function :
//
//*************************************************************
//
//  Module definition
//
module qiangdaqi(clk       ,             rst_n     ,         switch    ,       key       ,          led       ,        rgb       ,seg_led_1       );//===========================================================//* Input and output signals//===========================================================//input                     clk       ;              input                     rst_n     ;           input     [2:0]           switch    ; input     [3:0]           key       ;output    [3:0]           led       ;output    [2:0]           rgb       ;output    [8:0]           seg_led_1 ;   ///*Function Description://* Module instantiation //*  ///snatch snatch_u1(.clk    ( clk    ),              .rst_n  ( rst_n  ),          .key    ( key    ),             .reload ( ~switch[2] ),   // Connect to the 3rd switch .led    ( led    ),      .valid_dly( valid_dly     ) ,.rgb    ( rgb    ));wire [3:0] end_score;score score_u1(.clk       ( clk       ),           .rst_n     ( rst_n     ),       .add_score ( switch[0] ),              .sub_score ( switch[1] ),.lock      ( valid_dly ),.led       ( led       ),        .end_score ( end_score )        );segment segment_u1(.seg_data_1  ( end_score )       ,.seg_data_2  (  )       ,.seg_led_1   ( seg_led_1  )       ,.seg_led_2   (  )         );endmodule
  1. 仿真文件
  • counter_tb.v
module counter_tb();reg                 tb_clk  ;                       reg                 tb_rst_n;                reg                 tb_start;                wire                tb_valid;                // // Task of delaytask delay;input [31:0] num;beginrepeat(num) @(posedge tb_clk);#1;endendtask// // Generate tb_clockinitial begintb_clk = 0;endalways #10 tb_clk = ~tb_clk;// // Generate tb_reset initial begintb_rst_n = 1;delay(1);tb_rst_n = 0;delay(1);tb_rst_n = 1;end// // Dump fileinitial begin$dumpfile(" counter_tb.vcd ");$dumpvars();end// // Others signalsinitial begintb_start = 1'b0;// After resetdelay(3);tb_start = 1'b1;delay(1);tb_start = 1'b0;delay(40);$finish;end//// Instantiationcounter counter_u1(.clk   ( tb_clk   )     ,                .rst_n ( tb_rst_n )     ,        .start ( tb_start )     ,       .valid ( tb_valid )        );endmodule
  • snatch_tb.v
//*************************************************************
//
//*@File name: snatch_tb.v
//
//*@File type: testbench
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-07 21:12:51
//
//*@Function :
//
//*************************************************************
//
// Head files
// `include "common.v"
//
//  Module definition
//
module snatch_tb();reg                 tb_clk    ;                     reg                 tb_rst_n  ;              reg     [3:0]       tb_key    ;                     reg                 tb_reload ;               wire    [3:0]       tb_led    ;                     wire    [2:0]       tb_rgb    ;            task delay;input [31:0] num;beginrepeat(num) @(posedge tb_clk);#1;endendtaskinitial begintb_clk = 0;endalways #10 tb_clk = ~tb_clk;initial begintb_rst_n = 1;delay(1);tb_rst_n = 0;delay(1);tb_rst_n = 1;endinitial begin$dumpfile(" snatch_tb.vcd ");$dumpvars();endinitial begintb_key = 4'b1111;tb_reload = 1'b0;delay(5);         // rgb is greentb_key = 4'b1100; // 3delay(15);        // rgb is buletb_reload = 1'b1;delay(1);tb_reload = 1'b0;tb_key = 4'b0111; // 1delay(40);        // rgb is red, time outtb_reload = 1'b1;delay(1);tb_reload = 1'b0;tb_key = 4'b1010; // 1delay(20);        // rgb is bluetb_reload = 1'b1;delay(1);tb_reload = 1'b0;delay(5);         // rgb is green$finish;endsnatch snatch_u1(.clk   ( tb_clk    ) ,              .rst_n ( tb_rst_n  ) ,          .key   ( tb_key    ) ,             .reload( tb_reload ) ,   // Connect to the 3rd switch .led   ( tb_led    ) ,         .rgb   ( tb_rgb    )  );endmodule
  • score_tb.v
//*************************************************************
//
//*@File name: score_tb.v
//
//*@File type: testbench
//
//*@Version  : 0.0.1
//
//*@Author   : Zehua Dong, HITWH
//
//*@E-mail   : hitdongzh@163.com
//
//*@Date     : 2020-12-08 09:44:40
//
//*@Function :
//
//*************************************************************
//
// Head files
// `include "common.v"
//
//  Module definition
//
module score_tb();reg                 tb_clk       ;                  reg                 tb_rst_n     ;           reg                 tb_add_score ;               reg                 tb_sub_score ;               reg  [3:0]          tb_led       ;               wire [3:0]          tb_end_score ;               task delay;input [31:0] num;beginrepeat(num) @(posedge tb_clk);#1;endendtaskinitial begintb_clk = 0;endalways #10 tb_clk = ~tb_clk;initial begintb_rst_n = 1;delay(1);tb_rst_n = 0;delay(1);tb_rst_n = 1;endinitial begin$dumpfile(" score_tb.vcd ");$dumpvars();endinitial begintb_add_score = 1'b0;tb_sub_score = 1'b0;tb_led = 4'b1111;      // Display 0delay(3);tb_led = 4'b1011;      // Display 5  delay(5);tb_add_score = 1'b1;   // Display 6delay(2);tb_add_score = 1'b0;delay(5);tb_led = 4'b0111;      // Display 5delay(5);tb_sub_score = 1'b1;   // Display 4delay(2);tb_sub_score = 1'b0;delay(5);$finish;endscore score_u1(.clk      ( tb_clk       ) ,           .rst_n    ( tb_rst_n     ) ,       .add_score( tb_add_score ) ,              .sub_score( tb_sub_score ) ,     .led      ( tb_led       ) ,        .end_score( tb_end_score )         );endmodule
  • qiangdaqi_tb.v
module qiangdaqi_tb();reg                 tb_clk      ;                   reg                 tb_rst_n    ;            reg    [2:0]        tb_switch   ;                reg    [3:0]        tb_key      ;                wire   [3:0]        tb_led      ;                wire   [2:0]        tb_rgb      ;                wire   [8:0]        tb_seg_led_1;                task delay;input [31:0] num;beginrepeat(num) @(posedge tb_clk);#1;endendtaskinitial begintb_clk = 0;endalways #10 tb_clk = ~tb_clk;initial begintb_rst_n = 1;delay(1);tb_rst_n = 0;delay(1);tb_rst_n = 1;endinitial begin$dumpfile(" qiangdaqi_tb.vcd ");$dumpvars();endinitial begintb_switch = 3'd0;tb_key = 4'b1111;  // greendelay(3);tb_key = 4'b1001;  // 2haodelay(10);         // bluetb_switch = 3'b001;// 6 scoredelay(1);tb_switch = 3'b100;// reloaddelay(1);tb_switch = 3'b000;delay(5);tb_key = 4'b0111;  // 1haodelay(10);         // bluetb_switch = 3'b010; // 4 scoredelay(1);tb_switch = 3'b100;// reloaddelay(1);tb_switch = 3'b000;delay(5);tb_key = 4'b1110;  // 4haodelay(40);         // redtb_switch = 3'b100;// reloaddelay(1);tb_switch = 3'b000;delay(10);$finish;endqiangdaqi qiangdaqi_u1(.clk       ( tb_clk       ),             .rst_n     ( tb_rst_n     ),         .switch    ( tb_switch    ),       .key       ( tb_key       ),          .led       ( tb_led       ),        .rgb       ( tb_rgb       ),     .seg_led_1 ( tb_seg_led_1 )
);endmodule
  1. 仿真结果
  • modelsim编译结果是没问题的,有几个warning无伤大雅,用来调试的
  1. 上板
    工程是在QuartusII15.0中建立的
  • RTL视图

    • 顶层qiangdaqi视图

    • score视图

    • snatch视图

    • 引脚分配

  • 上板验证
    • 上电后
    • 正常抢答状态,rgb为蓝色,初始分数5分
    • 超过30秒后,rgb变为红色,此时加分减分按键不起作用


- 减一分

- 加一分

4人抢答器----基于Step MAX10小脚丫开发板相关推荐

  1. 8路抢答器(普中科技开发板)

    #include <reg51.h> //#include <keyscan.h> //#include <display.h>#define uchar unsi ...

  2. 单片机4人抢答器程序C语言,基于单片机的4人抢答器.pdf

    基于单片机的4人抢答器 本文由wosulewen贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机 查看. 福建工程学院国脉信息学院 目录 摘要----------- ...

  3. 51单片机八人抢答器c语言,抢答器 - 基于51单片机 - 8人有程序较完整.doc

    抢答器 - 基于51单片机 - 8人有程序较完整 课程题目: 基于单片机---8路抢答器 学 院: 职业技术学院 专 业: 电子信息科学与技术 年 级: 091 学 号: 0920020088 学生姓 ...

  4. 数字式竞赛抢答器(基于Quartus的原理图设计)FPGA

    数字式竞赛抢答器(基于Quartus的原理图设计)FPGA 一. 设计思路 二. 实现过程 1. 第一信号鉴别锁存模块 + 犯规电路 (1) 使用器件 74175,带公共时钟和复位四D触发器 (2) ...

  5. 三人表决器与八人抢答器实验

    三人表决器与八人抢答器实验 三人表决器实验报告 一.实验目的 1.辨识数字IC功能说明. 2.测试数字集成门电路,掌握输出故障排除.使用注意事项. 3.掌握逻辑函数搭建三人表决器. 二.实验资源 1. ...

  6. PLC-四人抢答器设计

    四人抢答器 一.实验目的 1.熟练掌握AB的PLC编程软件CCW的使用 2.加深对PLC编程原理的理解 3.了解PLC的实际使用过程 二.实验内容及要求 1.实验内容: 设计一个四人抢答器,当主持人按 ...

  7. 74ls175四人抢答器电路图_四人抢答器电路设计.doc

    四人抢答器电路设计 课程设计说明书 题 目: 四人抢答器电路设计 课程名称: 数字电子技术 学 院: 电子信息与电气工程学院 学生姓名: 裴雷雨 学 号: 20110201011 专业班级: 自动化2 ...

  8. 单片机六位抢答器c语言程序,单片机八人抢答器程序设计

    有一个<单片机八人抢答器程序设计>的题目. 设计要求: 利用 KEIL 软件编制控制程序. 利用 PROTEUS 仿真软件,绘制单片机控制系统: P1 口接 8 个按钮,编号为1.2.3. ...

  9. 八人抢答器讲解_八人抢答器

    有一个<单片机八人抢答器程序设计>的题目.设计要求:利用 KEIL 软件编制控制程序.利用 PROTEUS 仿真软件,绘制单片机控制系统:P1 口接 8 个按钮,编号为1.2.3....7 ...

  10. 三人抢答器逻辑电路图_数字电子技术实验(3三人抢答器电路设计).ppt

    第三次实验要求 1.三人抢答器电路设计 三人抢答器参考电路1 三人抢答器参考电路2 三人抢答器参考电路3 三人抢答器参考电路4 三人抢答器参考电路5 2."111 1000 1001 101 ...

最新文章

  1. 21HTML5新特性
  2. oracle 的替代变量和
  3. linux命令scp
  4. Java transient关键字使用小记
  5. 使用过滤器模式,让客户关怀中的代码更加干净整洁
  6. 辞旧迎新,胖了几斤?数据告诉你,这种东西你就不该吃
  7. jQuery学习之四---Ajax请求
  8. Unity2020.1中如何安装DOTS的Entities包?
  9. lambda 根据属性去重_扩展lamda表达中distinct按照字段去除重复
  10. 腾讯AI Lab开源800万中文词的NLP数据集 | 资源
  11. 如何用c语言调用c++做成的动态链接库
  12. 如何实现python连续输入
  13. 控制台或者dll中CreateWindow 出错
  14. 算法笔记_面试题_14. strStr 长字符串中查找短字符串
  15. heavy dark--读《《暗时间》》
  16. ESP8266串口转wifi/wifi转串口模块
  17. Axure中级教程:管理后台内容模板(中继器全交互详解)
  18. python浪漫代码表白npy_python – Cython使用MemoryView时关于NPY_NO_DEPRECATED_API的Numpy警告...
  19. 七牛服务器提供的压缩图片的方法
  20. 怎么判断噎到没噎到_宝宝噎着的表现是什么 宝宝噎着症状

热门文章

  1. 独孤求败 —— 什么才是一个完整机器学习项目流程? 适合九成以上的场景
  2. Unity3D中使用Projector生成阴影
  3. 智能门锁电路图_智能门锁结构拆解,我们一起来看看
  4. 知云文献翻译打不开_科研福音,论文翻译神器系列!
  5. win10微软账户无法连接服务器,Win10系统Microsoft微软帐户无法登陆的解决方法
  6. 电气火灾监控系统在地铁供配电系统中的应用
  7. Python 转义字符表
  8. loj3059/bzoj5494/洛谷P5294 [HNOI2019]序列 单调栈+主席树
  9. 《Processing SPARQL queries over distributed RDF graphs》——读书笔记
  10. Registration based Few-Shot Anomaly Detection