新闻中心

EEPW首页>EDA/PCB>设计应用> 基于FPGA的抢答器设计与实现

基于FPGA的抢答器设计与实现

作者: 时间:2012-01-04 来源:网络 收藏

 图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。

fpga相关文章:fpga是什么


蜂鸣器相关文章:蜂鸣器原理

上一页 1 2 下一页

关键词:FPGA抢答器设计

评论


相关推荐

技术专区

关闭