久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于FPGA的搶答器 包含源碼、演示、文檔 [打印本頁]

作者: cc12138    時間: 2020-1-2 21:03
標題: 基于FPGA的搶答器 包含源碼、演示、文檔
設計要求:
據所學知識和試驗板的資源,使用Verilog HDL語言設計一個四路搶答器。
搶答器可供四組搶答,且有鑒別第一信號和鎖存功能,主持人按下復位鍵后開始搶答,并在數碼管顯示10秒的倒計時,當有人搶答時,數碼管計時消失,對應選手的LED燈將亮起,且蜂鳴器發出響聲,此時電路自鎖,其他選手搶答無效。
如果10秒內無人搶答,相應的LED燈亮起,表示此輪搶答作廢。
設計代碼及說明:
qiangda模塊:該模塊具備鑒別第一信號和鎖存的功能。精確的鑒別出第一信號之后將輸入端封鎖,使其他組的搶答無效。設置4個輸入端num1,num2,num3,num4(4個獨立按鍵),并設置pd8做主持人復位鍵rst。當rst=1,搶答開始,當rst=0時,搶答電路復位。

module qiangda(num1, num2, num3, num4, clk, rst_n, led1, led2, led3, led4,sec_h, beep);      
input num1, num2, num3, num4, clk, rst_n, sec_h;
output led1, led2, led3, led4, beep;
reg startflag=1, beepflag=0;
reg led1, led2, led3, led4, beep;

always@(posedge clk)
begin
//-------------復位操作,當復位鍵置0時,led1-4都不亮,蜂鳴器不叫--------
        if(rst_n==0)
           begin
                  startflag<=1;
                  led1=0;
                  led2=0;
                  led3=0;
                  led4=0;
                  beep<=0;
           end
//-------------搶答操作,共4種情況--------------------
        if(startflag==1&&!(sec_h==0))
                begin
                  if(num1==0)
                          begin
                                 startflag<=0;
                                 led1=1;
                                 beepflag<=1;
                          end
                  else if(num2==0)
                           begin
                                  startflag<=0;
                                  led2=1;
                                  beepflag<=1;
                           end
                  else if(num3==0)
                           begin
                                  startflag<=0;
                                  led3=1;
                                  beepflag<=1;
                           end
                  else if(num4==0)
                           begin
                                  startflag<=0;
                                  led4=1;
                                  beepflag<=1;
                           end
                 end
     if(beepflag==1)
            begin
                        beep<=1;
                        beepflag<=0;
            end
end

Endmodule

time_counter模塊:該模塊實現了10秒倒計時的計數功能,通過1000ms進位1秒,倒數10秒后可通過主持人的復位鍵重新復位計時。

module time_counter( rst_n, clk, sec_h, sec_l, display_flag, led8);                                                                     
  parameter  CLK_CYCLE  =  20;
  parameter  T0         =  1000000;
  parameter  T0_VAL     =  T0/CLK_CYCLE;         

  input                    clk;
  input                    rst_n;

  output reg                led8;
  output reg[2:0]            sec_h;              //數碼管的十位
  output reg[3:0]            sec_l;              //數碼管的個位
  output                   display_flag;        //數碼管動態掃描標志位

  //-----------------------------------1ms延時------
  reg[15:0]                cnt;
  always@(posedge clk or negedge rst_n)
  begin
      if(rst_n == 1'b0)
          cnt <= (0);
      else  if(cnt < T0_VAL)
               cnt <= cnt + 1'b1;
           else
               cnt <= (0);
  end

  assign  delay_1ms    = (cnt == T0_VAL);       //1ms延時完成標志位
  assign  display_flag   = delay_1ms;           //數碼管動態掃描標志位

  //------------------------------------1s延時------
  reg[9:0]                mse;
  always@(posedge clk or negedge rst_n)
  begin
     if(rst_n == 1'b0)
        mse <= (0);
     else
       begin
         if(delay_1ms == 1'b1)
            begin
              if(mse < 10'd1000)
                 mse <= mse + 10'd1;
              else
                 mse <= (0);
            end
       end
  end

  wire  sec_l_flag = ((mse == 10'd999) && (delay_1ms == 1'b1));//1s延時完成標志位

  //------------------------------------秒個位數計數------
  always@(posedge clk or  negedge rst_n)    //時鐘和復位
  begin
  if(rst_n == 1'b0)     //復位后數碼管低位等于0
      sec_l <= 0;
  else
     begin
                  if(sec_l_flag ==1'b1)     //1s延時完成標志位等于1
                  begin
                         if(sec_h!=3'd0 && sec_l==0)     //高位不等于0并且低位等于0
                       sec_l<=9;                    //讓低位等于9
           else if(sec_l >4'd0)           //低位大于0
                   sec_l <= sec_l - 4'd1; //低位進行減一操作
                else
                   sec_l <= 0;            //低位等于0
        end
     end
  end

  wire    sec_h_flag = ((sec_l == 4'd0) && (sec_l_flag == 1'b1));    //sec_h_flag是秒個位數進位標志位

  //------------------------------------秒十位數計數------
  always@(posedge clk or negedge rst_n)   //時鐘和復位
  begin
     if(rst_n == 1'b0)                    //復位后,如果高位等于1,led8不亮
        begin
           sec_h <= 1;
                     led8=0;
             end
     else
        begin
           if(sec_h_flag == 1'b1)         //如果秒個位數進位標志位等于1
              begin
                if(sec_h > 0 && sec_l==0) //高位大于0且低位等于0
               sec_h <= sec_h - 3'd1;     //高位減1
            else
                             begin
                sec_h <= 3'd0;            //高位等于0
                                         led8=1;                   //led8燈亮
                                  end
           end
      end
end

endmodule
display模塊:該模塊包含了數碼管的編碼函數,數碼管動態顯示的計數器,數碼管的編碼輸出,并將模塊2的計數結果動態顯示在數碼管上。

module display(rst_n, clk, sec_h, sec_l, led1, led2, led3, led4, display_flag, seg, sel);   
  input            rst_n;              
  input            clk;               
  input                           led1, led2, led3, led4;
  input[2:0]       sec_h;              
  input[3:0]       sec_l;              
  input[3:0]       display_flag;      
  output reg[7:0]   seg;               
  output reg[3:0]   sel;

  function [7:0]    seg_data;
  input[3:0]       din;
  input           dp;
  begin
    case(din)
      4'd0  : seg_data = {7'b1111110,dp};
      4'd1  : seg_data = {7'b0110000,dp};
      4'd2  : seg_data = {7'b1101101,dp};
      4'd3  : seg_data = {7'b1111001,dp};
      4'd4  : seg_data = {7'b0110011,dp};
      4'd5  : seg_data = {7'b1011011,dp};
      4'd6  : seg_data = {7'b1011111,dp};
      4'd7  : seg_data = {7'b1110000,dp};
      4'd8  : seg_data = {7'b1111111,dp};
      4'd9  : seg_data = {7'b1111011,dp};
      4'd10 : seg_data = {7'b0000000,dp};
    endcase
  end
  endfunction

  //-------------------------------------數碼管動態顯示的計數器
  reg[1:0]  cnt;
  always @(posedge clk or negedge rst_n)
    begin
      if(rst_n == 1'b0)
         cnt <= (0);
      else if(display_flag == 1'b1)
              cnt <= cnt + 1'b1;
          else
              cnt <= cnt;
    end
  //-------------------------------------編碼輸出
  always @(posedge clk or negedge rst_n)
    begin
      if(rst_n == 1'b0)
         begin
           seg <=7'b0000000;     //執行復位按鍵后,清0
           sel <=4'b0000;
         end
      else
         begin
                     case(cnt)

           2'b00 :
           begin
                            if(led1==1||led2==1||led3==1||led4==1)
                                    begin
                                           seg<=7'b0000000;
                                           sel<=4'b0000;
                                    end
                            else
                seg <= seg_data(sec_l,1'b0);
                sel <= 4'b1000;
           end

           2'b01 :                     
           begin
                            if(led1==1||led2==1||led3==1||led4==1)
                                    begin
                                      seg<=7'b0000000;
                                           sel<=4'b0000;
                                    end
                            else
                seg <= seg_data({1'b0,sec_h},1'b0);
                sel <= 4'b0100;
           end

           endcase
              end
    end
  endmodule


main模塊:調用其他模塊實現整體功能

module main(num1, num2, num3, num4, led1, led2, led3, led4, led8, rst_n, clk,Pd0, Pd1, seg, sel,beep);

//參數定義
    parameter   CLK_CYCLE = 20;               
    parameter   T0       = 1000_000;         

//端口定義
    input       rst_n;
    input       clk;
        input       Pd0;
        input       Pd1;
        input            num1,num2,num3,num4;
    output      led1,led2,led3,led4,led8;   
        output[7:0]  seg;                     
    output[3:0]  sel;
    output beep;         

// 變量定義
    wire[2:0]   sec_h;
    wire[3:0]   sec_l;
    wire       display_flag;

//----------------模塊例化--------------------  
//例化qiangda模塊
qiangda u_qiangda (
                .rst_n          (   rst_n       ),
        .clk            (   clk         ),
                .led1           (   led1        ),
        .led2           (   led2        ),      
        .led3           (   led3        ),
                .led4           (   led4        ),
                .sec_h          (   sec_h       ),
                .num1          (   num1       ),      
        .num2          (   num2       ),
        .num3          (   num3       ),      
        .num4          (   num4       ),
                .beep           (   beep       ));

//例化time_counter模塊
time_counter #(
        .CLK_CYCLE      (   CLK_CYCLE   ),
        .T0             (   T0          ))

    u_time_counter (
        .rst_n          (   rst_n       ),
        .clk            (   clk         ),
        .sec_h          (   sec_h      ),
        .sec_l          (   sec_l       ),
        .display_flag     (   display_flag ),
                .led8                   (   led8       ));

//例化display模塊
    display u_display(
        .rst_n          (   rst_n       ),
        .clk            (   clk         ),
        .sec_h          (   sec_h      ),      
        .sec_l          (   sec_l       ),
        .display_flag     (   display_flag  ),
        .seg            (   seg         ),
                .led1           (   led1        ),
        .led2           (   led2        ),      
        .led3           (   led3        ),
                .led4                 (   led4        ),
        .sel             (   sel         ));

endmodule

硬件效果:
將設計好的代碼下載到試驗板里,實現了相應的功能,效果如圖
(1)搶答開始,倒計時進行中
(2)搶答時間到仍然沒有人搶答,裁判燈亮
(3)三號選手搶答成功,倒計時停止,對應的led燈亮


完整的Word格式文檔51黑下載地址:
文檔.doc (613.27 KB, 下載次數: 45)






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www久久久 | 欧美一区二区 | 国产一级免费视频 | 久久精品视频网 | 国产精品久久久久久久久久久久久 | 一起操在线 | 久久综合伊人77777蜜臀 | 亚洲日本国产 | 成人在线观看网站 | 超碰成人免费 | 97精品视频在线观看 | 亚洲精品欧美 | 一区二区免费视频 | 在线观看的av网站 | 亚洲一区二区国产精品 | 四虎wz| 成人影片在线 | 国产乱国产乱300精品 | 不卡中文字幕 | 毛片在线视频 | 免费黄色片视频 | 亚洲一区二区三区 | 插插插视频 | 国产福利视频在线观看 | 91一级片 | 亚洲激情在线播放 | 亚洲精品蜜桃 | 交换多p群乱高h文 | 欧美日韩亚洲一区 | 欧美日韩一区二区三区四区 | 国产一级二级 | 国产一级免费观看 | 成人免费视屏 | av大全在线观看 | 这里只有精品在线观看 | 日本黄色免费网站 | 九九精品在线视频 | 亚洲黄色精品 | 激情小说在线视频 | 一级免费视频 | 四色永久访问 |