抢答器设计
1、实验平台2、实验目的2.1、实验内容
3、实验流程3.1、实验原理3.2、系统架构3.3、子功能模块设计3.3.1、中央控制模块模块框图信号定义设计文件
3.3.2、数码管驱动模块设计文件
3.3.3 LED驱动模块3.3.4、按键消抖模块
3.4仿真验证3.4、板级验证3.4.1、顶层文件
4、总结
1、实验平台
软件:PC、Quartus Prime 18.1、Modelsim 10.5b
硬件:Altera FPGA开发板(EP4CE6E22F17C8)
2、实验目的
1、掌握数码管动态刷新原理2、逻辑练习
2.1、实验内容
基于开发板上的8位8段数码管和4个机械按键,制作一个抢答器,相关要求如下:
1、 设置四个按键,其中三位选手A、B、C,主持人0;
2、 主持人具有清除所有状态权限
3、 每次抢答开始后,选手需要在10S做出选择,否测视为放弃,一旦某位选手按下按键后,另外两名选手按键将失效
4、 如果没有选手抢答,数码管显示10s倒计时,计时结束时,LED不停闪烁;同时,所有选手按键失效,直到主持人重新开始
5、 最左边显示显示倒计时,低三位从左至右分别表示选手ABC,当某位选手抢答后,将显示对应字符(A or B or C),同时倒计时暂停,直至主持人按下后,所有状态恢复,开启新一轮抢答。
3、实验流程
3.1、实验原理
根据开发板的原理图,可得到以下资料
数码管:本质上为一组发光二极管按照一定顺序排列而成,其显示原理与LED无异。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/39fc9a1d50bd4bab8bb48cf3704cf873.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7cd97883ad3c4f32957624c06d4f4f3f.png)
根据硬件原理图所示,发光二极管,所有的阳极都接通3.3V的正电压,也即—高电平,所以如果我们想要
发光二极管导通的话,需要在阴极接通低电平,就可以让LED亮起来。
3.2、系统架构
根据系统要求,可以得到以下框架分布
![在这里插入图片描述](https://img-blog.csdnimg.cn/0826ba7330ca45cb9a27e22ef3879529.png)
3.3、子功能模块设计
根据系统构建,可得到以下模块
3.3.1、中央控制模块
模块框图
![在这里插入图片描述](https://img-blog.csdnimg.cn/66a95392b81043f398997a4c33ea50ed.png)
信号定义
信号名端口类型数据位宽信号说明Clki1输入时钟信号,50MHzRst_ni1输入复位信号,低电平有效key_Ai1选手A按键key_Bi1选手B按键key_Ci1选手C按键key_0i1主持人按键Data_timeO1610s倒计时数据Led_enO1倒计时结束,使能LED闪烁
设计文件
/*================================================*\
Filename ﹕ctrl_mode.v
Author ﹕Adolph
Description ﹕中控模块,指令解析,数据显示控制
Called by ﹕responder.v
Revision History ﹕ 2022-6-20 15:20:43
Revision 1.0
Email﹕[email protected]
Company﹕
\*================================================*/
module ctrl_mode(
input clk ,
input rst_n ,
input [3:0] key_ctrl, //按键消抖信号
output [3:0] data ,
output reg [3:0] key_sta , //按键状态信号
output reg led_en
);
//parameter declarations
parameter TIME_S = 26'd50_000_000;
//internal reg / wire signals
reg [25:0] cnt_1s ;
wire add_1s ;
wire end_1s ;
reg latch_log;
reg [3:0] cnt_delay;//显示9-0
wire add_delay;
wire end_delay;
assign data = cnt_delay;
// assign led_en = end_delay;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
led_en = TIME_S - 'd1;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_delay = CNT_REF - 10'd1)begin
cnt_20us |