抢答器在各类竞赛中的必备设备,有单路输入的,也有组输入办法,本规划以FPGA 为根底规划了有三组输入(每组三人),具有抢答计时操控,可以对各抢答小组成果进行相应加减操作的通用型抢答器;现行的抢答器中首要有两种:小规模数字逻辑芯片译码器和触发器来做,别的一种用单片机来做;小规模数字逻辑电路比较复杂,用单片机来做跟着抢答组数的添加有时分存在I/O 口缺乏的状况;本规划选用FPGA 来做增强了时序操控的灵活性,一起因为FPGA 的I/O 端口资源丰富,可以在本规划根底上稍加修正可以规划具有多组输入的抢答器。
功用描绘
本文规划了一个通用型电子抢答器:三个参赛队,每个队有三个成员,各自可手动按按钮请求抢答权;回到正确加1 分,答复过错减1 分,违规抢答减1分,不抢答不加分不扣分;用4 位LED 的左面2 位显现抢答组号及抢答计时时刻,右边2 位显现相应组的成果。
抢答器详细功用如下:
1、可一起进行三组每个小组三人的抢答, 用9 个按钮Group1_1,Group1_2,Group1_3,Group2_1,Group2_2,Group2_3,Group3_1,Group3_2,Group3_3 标明;
2、设置一个抢答操控开关Start,该开关由主持人操控;只要当主持人按下开端键才干抢答;在按开端按钮前抢答归于违规;
3、抢答器具有守时抢答功用,且一次抢答的时刻设定为30 秒。当主持人发动“开端”键后,用4 位LED 数码管左面两位显现30s 的倒计时;一起赤色LED灯亮,标明可以抢答。
4、抢答器具有锁存与显现功用。即选手按动按钮,锁存相应的组号,并在4 位LED 数码管的左面两位显现,一起用一个绿色LED 指示是否有选手抢答,假如是违规抢答还能用选手蜂鸣器报警提示。抢答实施优先锁存,优先抢答选手的相应组号和成果一向坚持到下一轮抢答开端。
5、参赛选手在设定的时刻内进行抢答,抢答有用,数码管左面两位显现 ”FX”,假如抢答违规矩显现 ”XF”(其间X 标明组号1~3),并坚持到下一轮抢答。假如抢答推迟时刻已到,无人抢答,本次抢答无效,体系回到主持人按开端前的等候状况,数码管上左面两位显现“FF”。
6、当抢答有用后,主持人可以依据抢答选手答复问题正确与否对选手相应组数的成果进行加减分操作,抢答违规也能减分操作,用4 位LED 数码管右边两位显现相应组数的成果。(注各组初始成果为10 分)
规划架构
本文以FPGA 为根底规划的电子抢答器,依据规划功用要求,改规划首要包含抢答输入键盘,数码管显现,报警及FPGA 最小体系。抢答器结构简图如图1所示。
1、FPGA 最小体系电路:FPGA 正常作业时的根本电路,由时钟和复位电路组成。
2、键盘输入电路:用3×3 矩阵键盘组成3 个组共9 个人的抢答按钮。一起包含Start, Add, Sub 三个由主持人操控的独自按钮。
3、显现模块:用移位寄存器74HC164 驱动4 位共阴数码管显现;数码管要显现的数据通过74HC164 串行数据端口输入。
4、报警及相关信息显现:蜂鸣器电路和LED 灯显现相关状况信息指示电路。
各模块详细描绘
1、FPGA 与各个模块的接口
本文以XC3S400 为根底规划的电子抢答器,抢答器实践上是一个人机接口的一个智能设备,该规划中用到的FPGA 外部I/O 口及其与外部各个模块衔接的网络标识如图2 所示。
图2.FPGA 的IO 接口
2、按键模块
因为按键是机械的动作,按键存在电平颤动,为了消除按键颤动引起的搅扰,需求等按键值到达安稳状况时才读取按键的值,也便是说要当按键按下一段时刻后,才读取按键值;本规划中抢答开端键(Start)、抢答后各组成果的加(Add)和减(Sub)按键是以单键的办法输入,按键推迟时刻为20ms,关于抢答组的按键是用3×3 阵列键盘完结,row=3’b001 以周期为5.08ms 进行循环左移扫描,扫描完三行的周期为15.24ms,这个便是说只要当两个按键之间的时刻距离在15.24ms 之内时才有或许存在一个按钮在比另一个按钮先按,而呼应后者;实践操作中,两人按键之间的距离大于这个时刻距离,因而,不会呈现过错呼应。一起每个按键后的推迟等候125.76ms 后此按键值才有用;通过实践测验,键盘具有消抖功用,可以正确检测按键值。按键电路图如图3 所示。
图3.按键电路
图注: Group1_1,Group1_2,Group1_3 别离标明榜首参赛小组的三个成员的按钮, 顺次类推Group2_1,Group2_2,Group2_3 和 Group1_1,Group1_2,Group1_3 别离代表第二和第三参赛小组的三个成员;Start、Add、Sub 别离代表抢答开端按键、对小组成果的加操作和减操作按钮!
3、显现模块
显现模块由4 位的LED 数码管显现抢答组数、是否违规抢答信息、按下抢答键后的抢答时刻、各组所得分数等信息;其间数码管左面2 位显现抢答组号及抢答计时时刻,右边2 位显现相应组的成果。数码管的驱动电路(译码电路)用两片74164 操控;电路图如图4 所示。
显现数据信息通过74164 的串行译码传送到数码管对应段,对应位显现;关于数码管显现的时序特别要注意:数码管是选用动态扫描办法显现,一切位扫描显现一次的频率必定要大于相应位数据改动的频率;一起当数码管关于数据改动的一起必定要把相应数据送到数码管进行显现,即数据改动和数据显现要同步;此规划中4 位数码管动态扫描频率位190Hz,而数码管要显现的抢答组数、抢答组的成果等信息的改动频率都是秒级,即几秒钟或许几分钟改动一次,满意数码管显现要求。
图4.显现电路
注:数码管为共阴数码管,其间pin6,pin8,pin9,pin12 顺次为位码,其他为段码;
4、时钟复位
此模块用于生成FPGA 体系时钟和复位电路,选用有源晶振和低电平复位。体系时钟选用50MHz,可以满意电路规划要求,电路如图5 所示。
图5.时钟复位电路
5、报警模块
报警首要用于呼应当没有按开端键之前违规抢答信号;即当违规时蜂鸣器响;一起还添加了一个赤色用于显现当按下开端键的信号;即当主持人按下开端按键时,赤色LED 灯亮;一起用一个绿色LED 灯指示有选手按抢答按钮,选手按键抢答,绿色LED 闪耀一次。电路图如图6 所示。
图6.报警和指示
软件代码描绘
软件规划首要选用verilog HDL 言语进行规划,选用状况机对抢答器的各个进程进行操控,规划中选用了层次化和模块化的思维,即顶层模块只要一个操控抢答器的主状况机和模块例化,然后别离用子模块完结数码管显现,成果多路选择器,成果的处理模块,按下抢答开端键后的推迟等候模块,按键模块等。程序流程图如图7 所示。
图7.程序流程图
图注: 显现“FF+成果”中FF 标明无效状况,成果标明上一次抢答的那个小组的成果;显现“FX+成果”标明抢答小组答题完并进行评分操作后的组号和成果;显现“XF+成果”标明违规抢答的那个小组组号及减1分后的成果信息(X 标明1,2,3)。这儿“+”是为了区分组号和成果信息,数码管并不显现加号,下同。
用Verilog HDL 别离编写各个模块,然后在ISE 环境下运转程序,调试成功。最终生成的顶层模块的方块图如图8 所示。
图8.顶层模块图
图注:Line(2:0)和row(2:0)别离标明参赛小组按键的输入阵列信号和输出扫描阵列信号;start_key,add_key, sub_key,别离代表抢答开端指令,对各组成果的加、减操作指令;dp,error,push_key 别离标明开端键按下后的信号,违规抢答信号以及参赛组有人按键的呼应信号;hc_cp,hc_si 标明显现译码芯片74HC164 的串行时钟和数据信号。
问题与处理
1、状况机问题
在全体调试的时分,当主持人按开端按钮后,程序就死在那里,不能接纳抢答信息,因为抢答键盘已独自调试成功,因而怀疑是操控抢答进程的状况机除了问题,指示进入开端状况的赤色LED灯一向亮着,阐明程序确实死在开端状况。再次归纳的进程中发现正告提示:状况机的状况量的赋值过错,把二进制标识“b”误写为“h”,这样因为状况机数据宽度小于时刻数据数据长度,主动取较小位数据;如state_start = 4‘b0010误写为state_start = 4’h0010,实践便是state_start = 4’b0000,这必定与前面状况抵触;一起调试进程中也遇到过复位时没有把状况机复位到初始状况的状况。通过此次规划,领会认识到状况机在实践操控中的重要性,今后规划中要学会看归纳布线进程中正告信息。
2、信号同步的问题
在抢答器按下开端键后有一个等候抢答30s 的推迟时刻,当30s 完结后假如三个小组都没有人按抢答键,那么此次竞赛抢答无效,体系主动回到主持人按开端前的体系等候状况;当计时完结30s 后生成一个高电平的脉冲信号(pulse),因为此脉冲信号高电平持续时刻是整个体系的体系时钟(clk),这个时钟周期小于状况机的时钟周期(clk_4),直接用状况机的时钟是检测不到此脉冲信号,需求把此脉冲信号同步到与状况机时钟同步。
选用的办法是:首先用一个锁存器(pulse_reg)锁存此脉冲信号(锁存器时钟也为体系时钟),通过锁存器的输出值和原脉冲信号寄存器值就可以检测到脉冲由低电平0 到高电平1 的跳变沿,相同用一个与体系时钟同步的锁存器(flag)锁存这个跳变沿,当呈现这个跳变沿时flag=1;而为了让状况机时钟(clk_4)检测到flag 信号,一起要在状况机时钟检测到后要把flag 清零,为下一次检测作预备,这时可以当状况机时钟(clk_4)检测到flag=1’b1 后,一起生成一个flag的清零信号(flag_rst)flag_rst=1’b1;当flag_rst 为1 时把flag 清零。
调试信号同步的部分程序如下:
reg flag_rst; //生成flag_rst 信号
always @ (posedge clk_4 or negedge rst_n)
begin
if(!rst_n)
begin
flag_rst = 1‘b0;
end
else
begin
if(flag == 1’b0)
flag_rst = 1‘b0;
else
begin
flag_rst = 1’b1;
end
end
end
always @ (posedge clk)
begin
pulse_reg = pulse;
end
reg flag; //flag 用来检测pulse 上升沿
always @ (posedge clk)
begin
if(!rst_n)
flag = 1’b0;
else
begin
if((pulse_reg == 1‘b0)(pulse == 1’b1))
flag = 1‘b1;
else if(flag_rst == 1’b1)
flag = 1‘b0;
end
end
reg flag_reg; //生成与clk_4 同步的用于检测脉冲上升沿信号的flag 信号
always @ (posedge clk_4)
begin
flag_reg = flag;
end
用modesim6.0 仿真波形如下:
图9.信号的同步的仿真波形
从仿真波形中可以看出当pulse 高电平时的下一个时钟flag = 1’b1;为了让时钟clk_4 可以检测到flag = 1’b1,就让flag 一向保存到clk_4 上升沿呈现,然后在clk_4 上升沿把flag 的复位信号flag_rst 置1;然后flag, flag_rst都清零。改动pulse 脉冲呈现的时刻或许clk_4 的频率都能检测到pulse 的高电平。通过信号同步后,状况机可以检测抢答计时完30s 后生成的一个脉冲信号然后回到初状况。
时序规划是数字电路电路的首要作业,在规划中必定要理解信号怎么传递,在何时赋值,何时信号值需求改动等,这样才干更好的规划。在需求改动寄存器值的时刻没有对寄存器进行操作,会形成成果的过错。
规划成果
依据抢答器功用要求,规划程序包含的子模块,并编写Verilog 代码,在硬件电路上调试运转成功。
操作进程:开端时对,整个体系复位(默许每组成果为10 分),数码管显现“FF+10”。在主持人宣布开端抢答的Start 之后,参赛队员就可以按自己前面的抢答按钮,一起用数码管左面两位计时抢答时刻30s,假如在30s 内各组都无人抢答,则此次抢答无效,体系主动回到开端前的初状况(数码管显现“FF+成果”),等候下一次操作;主持人可依据答复争夺与否,以及是否违规抢答,决议加减分(Add 为加分操控,Sub 为减分操控),加减操作后体系又回到开端前的等候状况。规划中,哪个组抢答,就显现哪个组的信息。假如抢答没有违规(按开端后抢答)则显现器左面两位显现“FX”;反之,则显现“XF”,X 代表组号1,2,3。依照操作办法,以第1 组抢答为例在VX_SP306 开发平台上运转看看数码管显现及整个进程:
1、在体系复位后显现“FF+10”;
2、等候主持人按开端状况;
3、主持人按开端按钮前第1 组抢答,显现“1F+10”,减1 分操作后显现“1F+09”;回到过程2;
4、主持人按开端按钮后,显现“30+10”;30 每秒钟减1 直到00;
5、在30s 内第1 组抢答,显现“F1+10”,主持人依据答复状况进行加、减分操作,显现“F1+分数”;然后回到过程2;
6、假如在30s 内没有人抢答,显现“FF+10”,回到过程2。