找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1046|回复: 0
打印 上一主题 下一主题
收起左侧

FPGA三人抢答器核心代码

[复制链接]
跳转到指定楼层
楼主
ID:1087159 发表于 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显示-----------------------*/
        /*--------记录按键状态--------*/
        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变为0时,key_clr 的值变为高,维持一个时钟周期,模拟按键情况
        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翻转
                        if(led_swt[1]&led_swt[2])d0 <= ~d0;//倒计时触发灯
                        //两个按键同时按下也不会因为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;
                       
        /*-----------------------数码管显示-----------------------*/
        reg [31:0]tc;//时间计数器
        reg flag_1HZ;//计数使能标志位
        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
       
        //蜂鸣器节拍时钟信号
        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


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表