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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3102|回復: 0
收起左側

基于FPGA的搶答器 包含源碼、演示、文檔

[復制鏈接]
ID:680019 發表于 2020-1-2 21:03 | 顯示全部樓層 |閱讀模式
設計要求:
據所學知識和試驗板的資源,使用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)搶答開始,倒計時進行中
圖片3.png
(2)搶答時間到仍然沒有人搶答,裁判燈亮
圖片2.png
(3)三號選手搶答成功,倒計時停止,對應的led燈亮
圖片1.png

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av影音资源| 国产一级特黄aaa大片评分 | 激情一区二区三区 | 黄色日批视频 | 99re热精品视频国产免费 | a国产视频| 久久久久久美女 | 亚洲精品乱码久久久久久黑人 | 中文字幕精品一区久久久久 | 男人天堂99 | 第一福利社区1024 | 中文字幕av中文字幕 | 成人精品一区二区三区中文字幕 | 久久久久久久久久久久久久av | 国产精品一区二区欧美黑人喷潮水 | 亚洲国产成人av | www.亚洲视频 | 国产高清一二三区 | 第一区在线观看免费国语入口 | 七七婷婷婷婷精品国产 | 精品一区二区三区电影 | 国产精品九九 | 美国一级片在线观看 | 日韩久久精品 | 欧美 日韩 视频 | 黄a免费看| 日韩一区二区在线看 | 午夜在线免费观看视频 | 中文字幕av第一页 | 青久草视频 | 午夜a级理论片915影院 | 黄色大全免费看 | 播放一级黄色片 | 亚洲成人黄色 | 亚洲福利在线观看 | 91在线精品秘密一区二区 | 亚洲一区二区三区在线视频 | 激情网站在线观看 | 亚洲综合小视频 | 久久久成人一区二区免费影院 | 一区中文字幕 |