找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2090|回復: 0
打印 上一主題 下一主題
收起左側(cè)

FPGA三人搶答器核心代碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1087159 發(fā)表于 2023-7-4 12:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
module Top_Qiangdaqi(
        input clk,//主頻信號,50MHZ
        input rst_n,//低電平復位
        //input [2:0]kint,//按鍵輸入
        input PLA_A,PLA_B,PLA_C,//按鍵輸入
        //input key_ctrl,//主持人按鍵
        output led_d0=0,led_d1,led_d2,led_d3,
        output buzzer,//蜂鳴器
        output [5:0]seg_sel,
        output [7:0]seg_data
        );
       
        /*-----------------------按鍵信號鎖存,消抖,LED顯示-----------------------*/
        /*--------記錄按鍵狀態(tài)--------*/
        reg key_rst;
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n)key_rst <= 1'b1;//低電平復位,key_rst信號為1
                else key_rst <= PLA_C&PLA_B&PLA_A;//按鍵按下時,key_rst信號為0
        end
       
        reg key_rst_r;
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n)key_rst_r <= 1'b1;
                else key_rst_r <= key_rst;//上升沿將key_rst信號鎖存到key_rst_r里
        end
       
        /*--------添加20MS消抖--------*/
        wire key_clr=key_rst_r &(~key_rst);//key_rst由1變?yōu)?時,key_clr 的值變?yōu)楦?維持一個時鐘周期,模擬按鍵情況
        reg [19:0]c;//1KHZ---[15:0]clk_1k+[3:0]counter_delay
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n) c <= 20'd0;
                else if(key_clr) c <= 20'd0;
                else c <= c+1'b1;
        end
       
        reg [2:0] reg_key;
        always @(posedge clk or negedge rst_n)begin
        if(!rst_n) reg_key <= 3'b111;//低電平復位,三個按鍵全部賦高電平
                else if(c==20'hffffff)//滿20ms,將按鍵值鎖存到reg_key,20'hffffff=1111_1111_1111_1111_1111
                        reg_key <= {PLA_C,PLA_B,PLA_A};
        end
       
        //時鐘上升沿時將reg_key的信號鎖存到reg_key_r里
        reg [2:0]reg_key_r;
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n) reg_key_r <= 3'b111;
                else reg_key_r <= reg_key;
        end
       
        /*--------控制LED顯示--------*/
        wire [2:0] led_swt=reg_key_r[2:0]&(~reg_key[2:0]);
        reg d0;reg d1;reg d2;reg d3;
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n)begin//全亮
                        d0 <= 1'b0;
                        d1 <= 1'b0;
                        d2 <= 1'b0;
                        d3 <= 1'b0;
                end
                else begin//按鍵控制LED翻轉(zhuǎn)
                        if(led_swt[1]&led_swt[2])d0 <= ~d0;//倒計時觸發(fā)燈
                        //兩個按鍵同時按下也不會因為if語句對LED有干擾
                        if(led_swt[0]&(!led_swt[1])&(!led_swt[2])&led_d2==1'b0&led_d3==1'b0)d1 <= ~d1;
                        if(led_swt[1]&(!led_swt[0])&(!led_swt[2])&led_d1==1'b0&led_d3==1'b0)d2 <= ~d2;
                        if(led_swt[2]&(!led_swt[0])&(!led_swt[1])&led_d1==1'b0&led_d2==1'b0)d3 <= ~d3;
//                        if(led_swt[0]&led_d2==1'b0&led_d3==1'b0)d1 <= ~d1;
//                        if(led_swt[1]&led_d1==1'b0&led_d3==1'b0)d2 <= ~d2;
//                        if(led_swt[2]&led_d1==1'b0&led_d2==1'b0)d3 <= ~d3;
                end
        end
        assign led_d0=d0?1'b1:1'b0;
        assign led_d1=d1?1'b1:1'b0;
        assign led_d2=d2?1'b1:1'b0;
        assign led_d3=d3?1'b1:1'b0;
                       
        /*-----------------------數(shù)碼管顯示-----------------------*/
        reg [31:0]tc;//時間計數(shù)器
        reg flag_1HZ;//計數(shù)使能標志位
        always @(posedge clk or negedge rst_n)begin
                if(!rst_n)begin
                        tc <= 32'd0;
                        flag_1HZ <= 1'b0;
                end
                else if(tc>=32'd49_999_999)begin
                        tc <= 32'd0;
                        flag_1HZ <= 1'b1;//上升沿
                end
                else begin
                        tc <= tc+32'd1;
                        flag_1HZ <= 1'b0;
                end
        end
       
        //蜂鳴器節(jié)拍時鐘信號
        wire clk_8;
        clk_div U1(
                .clk(clk),
                .f(8),
                .clk_out(clk_8)
                );

        wire [3:0]count_0;
        wire t0;
        wire en;
        count_m10 U2(
                .clk(clk),
                .clk_8(clk_8),
                .rst_n(rst_n),
                .flag_1HZ(flag_1HZ),
                .clr(1'b0),
                .data(count_0),
                .t(t0),
                .buzzer(buzzer),
                .led_d0(led_d0),
                .led_d1(led_d1),
                .led_d2(led_d2),
                .led_d3(led_d3),
                .PLA_A(PLA_A),
                .PLA_B(PLA_B),
                .PLA_C(PLA_C),
                .en(en)
                );
               
//        wire [3:0]count_1;
//        wire t1;
//        count_m10 count10_m1(
//                .clk(clk),
//                .rst_n(rst_n),
//                .flag_1HZ(t0),
//                .clr(1'b0),
//                .data(count_1),
//                .t(t1)
//                );
//               
               
               
        //譯碼模塊
        wire[7:0] seg_data_0;
        seg_decoder U3(
                 .bin_data  (count_0),
                 .seg_data  (seg_data_0)
        );

               
        seg_scan U4(
                .clk(clk),
                .rst_n(rst_n),
                .en(en),
                .seg_sel(seg_sel),
                .seg_data(seg_data),
                .seg_data_0 ({1'b1,seg_data_0}),
                .led_d0 (led_d0),
                .led_d1 (led_d1),
                .led_d2 (led_d2),
                .led_d3 (led_d3)
                );
       
       
               
//        wire clk_1k,clk_1,clk_8;
//        wire [4:0]kout;
//        clk_div U1(
//                .clk(clk),
//                .f(1000),
//                .clk_out(clk_1k)
//                );
//               
//        clk_div U2(
//                .clk(clk),
//                .f(1),
//                .clk_out(clk_1)
//                );
//               

//        key_clr U4(.clk_1k(clk_1k),.kint(kint),.kout(key_out));
//        key_sel U5(.clk_1k(clk_1k),.clk_1(clk_1));
       
endmodule


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表