EDA课设智力竞赛抢答器设计

1 引言

无论是在学校、工厂、军队还是益智性电视节目, 都会举办各种各样的智力竞赛, 都会用到抢答器。目前市场上已有各种各样的智力竞赛抢答器, 但绝大多数是早期设计的, 以模拟电路、数字电路或者模拟电路与数字电路相结合的产品。这部分抢答器已相当成熟, 但功能越多的电路相对来说就越复杂, 且成本偏高, 故障高, 显示方式简单(有的甚至没有显示电路), 无法判断提前抢按按钮的行为, 不便于电路升级换代。本设计就是基于VHDL设计的一个智力竞赛抢答器尽量使竞赛真正达到公正、公平、公开。基于EDA技术设计的电子抢答器,以其价格便宜、安全可靠、使用方便而受到了人们的普遍欢迎。本文以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言VHDL为主要表达方式,以QuartusⅡ开发软件设计的电子抢答器,具有抢答鉴别与锁存功能以及10秒答题限时功能。

EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军到设计出IC版图或PCB版图的整个过程在计算机上自动处理完成。现在对EDA的概念或事等各个领域,都有EDA的应用。目前EDA 技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。EDA 设计可分为系统级、电路级和物理实现级。

1.1 设计的目的

本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,了解并掌握VHDL硬件描述语言的设计方法和思想,通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。通过对智力竞赛抢答器的设计,巩固和综合运用所学课程,理论联系实际,提高设计能力,提高分析、解决计算机技术实际问题的独立工作能力。本文以现场可编程逻辑器件(FPGA)为设计载体,以硬件描述语言VHDL为主要表达方式,以QuartusⅡ开发软件设计的电子抢答器,具有抢答鉴别与锁存功能以及10秒答题限时功能,应用二极管和数码显示管为主要部件来设计扫描显示器。通过课程设计深入理解VHDL语言的精髓和掌握

运用所学的知识,达到课程设计的目标。

1.2 设计的基本内容

本文是设计的一个四路智力竞赛抢答器,利用VHDL设计抢答器的各个模块,并使用EDA 工具对各模块进行仿真验证。智力竞赛抢答器的设计分为四个模块:鉴别锁存模块;答题计时模块;答题超时提醒模块以及显示模块。把各个模块整合后,通过电路的输入输出对应关系连接起来。设计成一个有如下功能的抢答器:

(1)设计一个四组(人)参加的智力竞赛抢答计时器,它具有四路抢答输入,主持人按下复位键后,系统复位进入抢答状态,计时显示初始值;

(2)某组首先按下抢答键,该路抢答信号,竞赛抢答器能够设别最先抢答的信号,锁定该信号,同时扬声器响起,参赛小组的序号在数码管上显示;

(3)主持人对抢答结果进行确认,给出倒计时计数允许信号,开始回答问题,计时显示器从初始值开始以秒为单位倒计时,计数至0时,停止计数,扬声器发出超时报警信号,以中止继续回答问题;

(4)当主持人给出倒计时计数禁止信号时,扬声器停止鸣叫;

(5)参赛者在规定时间内回答完问题,主持人给出倒计时计数禁止信号,以免扬声器鸣叫,按下复位键,又可开始新一轮的抢答;

2 VHDL及Quartus II软件介绍

2.1 硬件描述语言——VHDL

2.1.1 VHDL的简介

VHDL英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE 的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog 语言将承担起大部分的数字系统设计任务。

VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。VHDL比其它硬件描述语言相比有以下优点:

(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。

(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。

(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。

(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。

(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,

也不必管理最终设计实现的目标器件是什么,而进行独立的设计。

2.1.2 VHDL语言的特点

应用VHDL进行系统设计,有以下几方面的特点。

(1)功能强大

VHDL具有功能强大的语言结构。它可以用明确的代码描述复杂的控制逻辑设计。并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。VHDL是一种设计、仿真和综合的标准硬件描述语言。

(2)可移植性

VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。此外,通过更换库再重新综合很容易移植为ASIC设计。

(3)独立性

VHDL的硬件描述与具体的工艺技术和硬件结构无关。设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。

(4)可操作性

由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。

(5)灵活性

VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。使其在任何大系统的设计中,随时可对设计进行仿真模拟。所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。

2.2 Quartus II软件的应用

Quartus II是Altera公司的第四代可编程逻辑器件集成开发环境,提供从设计输入到器件编程的全部功能。Quartus II可以产生并识别EDIF网表文件、VHDL 网表文件和Verilog HDL网表文件,为其它EDA工具提供了方便的接口;可以在Quartus II集成环境中自动运行其它EDA工具。

利用Quartus II软件的开发流程可概括为以下几步:设计输入、设计编译、设计定时分析、设计仿真和器件编程。

(1)设计输入

Quartus II软件在File菜单中提供"New Project Wizard…"向导,引导设计者完成项目的创建。当设计者需要向项目中添加新的VHDL文件时,可以通过"New"选项选择添加。

(2)设计编译

Quartus II编译器完成的功能有:检查设计错误、对逻辑进行综合、提取定时信息、在指定的Altera系列器件中进行适配分割,产生的输出文件将用于设计仿真、定时分析及器件编程。

①首先确定软件处于Compile Mode,可以通过Processing菜单进行选择。

②在Processing菜单中选择Compiler Settings项。可以进行器件选择、模式设定、综合和适配选项设定及设计验证等。

③单击Processing菜单下的"Start Compilation" 项,开始编译过程。

④查看编译结果,我们可以得到详细的编译报告。

(3)设计定时分析

单击Project菜单下的"Timing Settings…"选项,可以方便地完成时间参数的设定。Quartus II软件的定时分析功能在编译过程结束之后自动运行,并在编译报告的Timing Analyses文件夹中显示。其中我们可以得到最高频率fmax、输入寄存器的建立时间tSU、引脚到引脚延迟tPD、输出寄存器时钟到输出的延迟tCO 和输入保持时间tH等时间参数的详细报告,从中可以清楚地判定是否达到系统的定时要求。

(4)设计仿真

Quartus II软件允许设计者使用基于文本的向量文件(.vec)作为仿真器的激励,也可以在Quartus II软件的波形编辑器中产生向量波形文件(.vwf)作为仿真器的激励。波形编辑方式与MAX+PLUS II软件的操作相似。在Processing菜单下选择"Simulate Mode"选项进入仿真模式,选择"Simulator Settings…"对话框进行仿真设置。在这里可以选择激励文件、仿真模式(功能仿真或时序仿真)等,单击"Run Simulator "即开始仿真过程。

(5)器件编程

设计者可以将配置数据通过MasterBlaster或ByteBlasterMV通信电缆下载到器件当中,通过被动串行配置模式或JTAG模式对器件进行配置编程,还可以在JTAG模式下给多个器件进行编程。利用Quartus II软件给器件编程或配置时,首先需要打开编程器(在New菜单选项中选择打开Chain Description File),在编程器中可以进行编程模式设置(Mode下拉框)、硬件配置(Programming Hardware对话框)及编程文件选择(Add File…按钮),将以上配置存盘产生.cdf

文件,其中存储了器件的名称、器件的设计及硬件设置等编程信息。当以上过程正确无误后,单击Start按钮即可开始对器件进行编程配置。

3 系统设计组成

3.1抢答器的组成原理

因为设计的是四路抢答器,所以系统的输入信号有:各组的抢答按钮A 、B 、C 、D ,系统复位信号RST ,系统时钟信号CLK ,计时确认端S ,计时禁止信号STOP ;系统的输出信号有:任一组抢答成功并锁存显示该组号码的数码管显示信号输出口PLAYER ,任一组抢答成功并锁存后的提示主持人确认扬声器信号VOICE ,抢答成功组答题允许信号ALLOW ,答题倒计时的数码管显示信号COUNT 。 根据以上的分析,我们可将整个系统分为四个主要模块:鉴别锁存模块,答题计时模块, 答题超时提醒模块以及显示模块。

3.2抢答器模块的设计

抢答器中各个模块由VHDL 实现后,利用EDA 工具对各模块进行了时序仿真(Timing Simulation ),其目的是通过时序可以更清楚的了解程序的工作过程。

3.2.1鉴别锁存设计

鉴别锁存模块的关键是准确判断出第一抢答者并将其锁存,实现的方法可使用软件进行编程。在得到第一信号后将输入封锁,使其它组的抢答信号无效。形成第一抢答信号后,通过软件设置数码显示电路,使其显示第一抢答者的组别,控制扬声器发出音响,并等待主持人按下确认键来启动答题计时电路。

主持人复位RST 抢答信号 图3.1 系统框图

鉴别锁存电路可以由VHDL程序来实现,以下是一断鉴别锁存的VHDL程序:

signal wave :std_logic;

signal i :std_logic;

signal j :std_logic;

signal k :std_logic;

begin

process(clk,rst,s,stop)

variable tem1:std_logic_vector(6 downto 0);

variable tem2:integer range 0 to 11;

begin

if(rst='1') then

tem1:="1111111";

tem2:=0;

j<='0';

i<='0';

allow<='0';

voice<='0';

wave<='0';

k<='1';

elsif(clk'event and clk='1') then

if(a='1'and b='0' and c='0'and d='0' and j='0') then tem1:="0110000";i<='0';j<='1';voice<='1';

elsif(a='0'and b='1' and c='0'and d='0' and j='0') then tem1:="1101101";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='1'and d='0' and j='0') then tem1:="1111001";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='0'and d='1' and j='0') then tem1:="0110011";i<='0';j<='1';voice<='1';

end if; player<=tem1;end process;

鉴别锁存电路由VHDL程序实现后,可以根据数码管显示判断抢答成功组号的,其仿真图如图3.2.1所示。

图3.2.1 鉴别锁存仿真图

各组的抢答按钮A、B、C、D分别对应着各组号码1、2、3、4。由图可知按下抢答按钮的顺序依次为A、B、C、D。经过程序的判决,抢答成功的数码管显示信号输出口PLAYER显示为二进制的“0110000”,即十进制的“1”。所以抢答成功的第一组。

3.2.2答题计时设计

答题计时模块的任务是当主持人启动确认键时开始计时,如果在规定的时间内答完题则答题有效,如果在规定的时间内没有完成,则答题无效。计时器从规定的时间倒计时,计时为零时计时结束。答题有无效作凭主持人来判断。

计时电路可以由VHDL程序来实现,以下是计时的VHDL程序:

signal wave :std_logic;

signal i :std_logic;

signal j :std_logic;

signal k :std_logic;

begin

process(clk,rst,s,stop)

variable tem1:std_logic_vector(6 downto 0);

variable tem2:integer range 0 to 11;

begin

if(rst='1') then

tem1:="1111111";

tem2:=0;

j<='0';

i<='0';

allow<='0';

voice<='0';

wave<='0';

k<='1';

elsif(clk'event and clk='1') then

if((s='1' or i='1') and k='1') then

i<='1';

voice<='0';

allow<='1';

tem2:=tem2+1;

if(tem2=11) then

voice<='1';

allow<='0';

k<='0';

end if;

end if;

if(stop='1') then

voice<='0';

k<='0';

allow<='0';

end if;

end if;

case tem2 is

when 0 => count<="1110111";

when 1 => count<="1111011";

when 2 => count<="1111111";

when 3 => count<="1110000";

when 4 => count<="1011111";

when 5 => count<="1011011";

when 6 => count<="0110011";

when 7 => count<="1111001";

when 8 => count<="1101101";

when 9 => count<="0110000";

when 10 => count<="1111110";

when others => null;

end case;

end process;

答题计时电路由VHDL程序实现后,其仿真图如图3.2.2所示。

当小组开始答题时,答题倒计时的数码管显示信号COUNT会从初始值开始以秒为单位倒计时,计数至0时,停止计数。

3.2.3答题超时提醒设计

计时显示器从初始值开始以秒为单位倒计时,计数至0时,停止计数,扬声器发出超时报警信号,以中止继续回答问题。当主持人再按下禁止键时,扬声器停止报警。

图3.2.2 答题计时仿真图

答题超时提醒可以由VHDL程序来实现,以下是提醒的VHDL程序:signal wave :std_logic;

signal i :std_logic;

signal j :std_logic;

signal k :std_logic;

begin

process(clk,rst,s,stop)

variable tem1:std_logic_vector(6 downto 0);

variable tem2:integer range 0 to 11;

begin

if(rst='1') then

tem1:="1111111";

tem2:=0;

j<='0';

i<='0';

allow<='0';

voice<='0';

wave<='0';

k<='1';

elsif(clk'event and clk='1') then

if((s='1' or i='1') and k='1') then

i<='1';

voice<='0';

allow<='1';

tem2:=tem2+1;

if(tem2=11) then

voice<='1';

allow<='0';

k<='0';

end if;

end if;

if(stop='1') then

voice<='0';

k<='0';

allow<='0';

end if;

end if;

case tem2 is

when 0 => count<="1110111";

when 1 => count<="1111011";

when 2 => count<="1111111";

when 3 => count<="1110000";

when 4 => count<="1011111";

when 5 => count<="1011011";

when 6 => count<="0110011";

when 7 => count<="1111001";

when 8 => count<="1101101";

when 9 => count<="0110000";

when 10 => count<="1111110";

when others => null;

end case;

end process;

超时提醒显示由VHDL程序实现后,其仿真图如图3.2.3所示。

当计数器倒计时到0时,超时报警信号即扬声器信号VOICE变为高电平。此时主持人按下禁止键,扬声器则会停止报警。

3.2.4显示设计

此模块将计分电路中的计分结果通过扫描并显示出来于屏幕上。抢答者和观众则通过显示屏幕上的信息来决定下一步的操作。四路抢答器的显示由数码管、二极管以及扬声器组成。数码管用来显示抢答成功的组序号和作为计数器的倒计时显示。二极管用来提醒小组当前应进行的操作。扬声器用来告诉小组违规行为。

显示模块可以由VHDL程序来实现,以下是显示的VHDL程序:

signal wave :std_logic;

signal i :std_logic;

signal j :std_logic;

signal k :std_logic;

begin

process(clk,rst,s,stop)

variable tem1:std_logic_vector(6 downto 0);

variable tem2:integer range 0 to 11;

图3.2.3超时提醒仿真图

begin

if(rst='1') then

tem1:="1111111";

tem2:=0;

j<='0';

i<='0';

allow<='0';

voice<='0';

wave<='0';

k<='1';

elsif(clk'event and clk='1') then

if(a='1'and b='0' and c='0'and d='0' and j='0') then tem1:="0110000";i<='0';j<='1';voice<='1';

elsif(a='0'and b='1' and c='0'and d='0' and j='0') then tem1:="1101101";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='1'and d='0' and j='0') then tem1:="1111001";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='0'and d='1' and j='0') then tem1:="0110011";i<='0';j<='1';voice<='1';

end if;

player<=tem1;

if((s='1' or i='1') and k='1') then

i<='1';

voice<='0';

allow<='1';

tem2:=tem2+1;

if(tem2=11) then

voice<='1';

allow<='0';

k<='0';

end if;

end if;

if(stop='1') then

voice<='0';

k<='0';

allow<='0';

end if;

end if;

case tem2 is

when 0 => count<="1110111";

when 1 => count<="1111011";

when 2 => count<="1111111";

when 3 => count<="1110000";

when 4 => count<="1011111";

when 5 => count<="1011011";

when 6 => count<="0110011";

when 7 => count<="1111001";

when 8 => count<="1101101";

when 9 => count<="0110000";

when 10 => count<="1111110";

when others => null;

end case;

end process;

显示模块由VHDL程序实现后,其仿真图如图3.2.4所示。

四路抢答器的显示由数码管、二极管以及扬声器组成。数码管用来显示抢答成功的组序号和作为计数器的倒计时显示。二极管用来提醒小组当前应进行的操作。扬声器用来告诉小组违规行为。

图3.2.4显示模块仿真图

4 结束语

通过一周的紧张工作,最后完成了我的设计任务——基于VHDL的智力竞赛抢答器设计。通过本次课程设计的学习,我深深的体会到设计课的重要性和目的性所在。本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。希望学校以后多安排一些类似的实践环节,让同学们学以致用。

在设计中要求我要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。在应用VHDL的过程中让我真正领会到了其并行运行与其他软件顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。

参考文献

[1]Voknei A.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5

[2]潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2005.2

[3]焦素敏.《EDA应用技术》.清华大学出版社,2002.4

附录

library ieee;

use ieee.std_logic_1164.all;

entity qiang is

port(clk,rst,s,stop :in std_logic;

a,b,c,d :in std_logic;

voice,allow :out std_logic;

player,count :out std_logic_vector(6 downto 0));

end qiang;

architecture da of qiang is

signal wave :std_logic;

signal i :std_logic;

signal j :std_logic;

signal k :std_logic;

begin

process(clk,rst,s,stop)

variable tem1:std_logic_vector(6 downto 0);

variable tem2:integer range 0 to 11;

begin

if(rst='1') then

tem1:="1111111";

tem2:=0;

j<='0';

i<='0';

allow<='0';

voice<='0';

wave<='0';

k<='1';

elsif(clk'event and clk='1') then

if(a='1'and b='0' and c='0'and d='0' and j='0') then tem1:="0110000";i<='0';j<='1';voice<='1';

elsif(a='0'and b='1' and c='0'and d='0' and j='0') then tem1:="1101101";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='1'and d='0' and j='0') then tem1:="1111001";i<='0';j<='1';voice<='1';

elsif(a='0'and b='0' and c='0'and d='1' and j='0') then tem1:="0110011";i<='0';j<='1';voice<='1';

end if;

player<=tem1;

if((s='1' or i='1') and k='1') then

i<='1';

voice<='0';

allow<='1';

tem2:=tem2+1;

if(tem2=11) then

voice<='1';

allow<='0';

k<='0';

end if;

end if;

if(stop='1') then

voice<='0';

k<='0';

allow<='0';

end if;

end if;

case tem2 is

when 0 => count<="1110111"; when 1 => count<="1111011"; when 2 => count<="1111111"; when 3 => count<="1110000"; when 4 => count<="1011111"; when 5 => count<="1011011"; when 6 => count<="0110011"; when 7 => count<="1111001"; when 8 => count<="1101101"; when 9 => count<="0110000"; when 10 => count<="1111110"; when others => null;

end case;

end process;

end da;

相关主题
相关文档
最新文档