学号~~~~~~~~~~~~~~ 密级 公开
北京师范大学本科毕业论文
基于QuartusII的四组智力抢答器的设计
与仿真
学 院 名 称:电子工程学院 专 业 名 称:电子设计 学 生 姓 名:~~~ 指 导 教 师:~~ 教授
二○一三年五月
郑 重 声 明
本人呈交的学位论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于培养单位。
本人签名: 日期:
摘要
本设计实现了四组智力抢答器的逻辑功能,主要由抢答鉴别模块、计分模块、7段译码显示模块、顶层模块等部分组成。采用VHDL语言编写代码,并在Quartus II6.0环境进行编译仿真,通过分析仿真结果,可以很好的完成抢答器的预定功能和要求。 关键词:
VHDL;Quartus II6.0;抢答器
ABSTRACT
This design implements the logic function of the four-group intelligence Responder. It is mainly composed of the identification module of answering machine, scoring module, 7-segment decode display module, top-level module and so on. The whole code is described in the VHDL Hardware Description Language, and carried on the compiling and testing in the Quartus||6.0. By analyzing the results of simulation ,it shows that the answering machine has meet the expected functions and requirements . Key words: VHDL;Quartus II6.0;Responder
目录
第1章 绪论 ....................................................... 1
1.1研究背景.................................................... 1 1.2研究目的.................................................... 1
第2章 EDA简介 ................................................... 3
2.1 EDA技术介绍................................................ 3 2.2 VHDL简介................................................... 3 2.3 Quartus II简介............................................. 4 2.4 可编译逻辑器件 FPGA/CPLD简介............................... 5
第3章 四组智力抢答器的设计 .................................... 6
3.1系统设计要求................................................ 6 3.2顶层模块的设计.............................................. 6 3.3抢答判别模块的设计......................................... 10 3.4计分模块的设计............................................. 13 3.5 7段LED显示驱动模块的设计................................. 14
第4章 四组智力抢答器的仿真结果 ............................. 16
4.1顶层模块的仿真结果......................................... 16 4.2 抢答判别模块的仿真结果 .................................... 16 4.3 计分模块的仿真结果 ........................................ 17 4.4 7段LED显示驱动模块的仿真结果............................. 17
总 结 ............................................................. 19 参考文献 ......................................................... 20 致 谢 ............................................................. 21 附 录 ............................................................. 22
第1章 绪论
1.1研究背景
人类社会进入到高度发达的信息化社会,信息社会的发展离不开电子产品的进步。现代电子产品在性能提高、复杂度增大的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要原因就是生产制造技术和电子设计技术的发展。前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管;后者的核心就是EDA技术。没有EDA技术的支持,想要完成上述超大规模集成电路的设计制造是不可想象的,但是面对当今飞速发展的电子产品市场,设计师需要更加实用、快捷的EDA工具,使用统一的集体化设计,改变传统的设计思路,将精力集中到设计构想、方案比较和寻找优化设计等方面,需要以最快的速度,开发出性能优良、质量一流的电子产品,对EDA技术提出了更高的要求。传统的EDA设计方法采用自底向上的设计方法,一般先按电子系统的具体功能要求进行功能划分,然后对每个子模块画出真值表,用卡诺图进行手工逻辑简化,写出布尔表达式,画出相应的逻辑线路图,再据此选择元器件,设计电路板,最后进行实测与调试,由于无法进行硬件系统功能仿真,如果某一过程存在错误,查找和修改十分不便,所以这是一种费时、费力的设计方法,而现代电子设计技术(EDA)是自顶向下且先进高效的。在电子产品的设计理念、设计方式、系统硬件构成、设计的重用性、知识产权、设计周期等方面,EDA技术具有一定的优势[1]。所以本次设计的抢答器抛弃了传统的设计方法,选择了采用主流的EDA技术进行设计。
1.2研究目的
智力竞赛是“快乐学习”这一教育模式的典范,它采用在规定的一段时间内抢答和必答等方式,在给人们的生活带来乐趣的同时,也使参与者和观众在愉悦的氛围中学到一些科学知识和生活知识,因此很受大家的喜欢。但是,在这类比赛中,对于谁先谁后抢答,在何时抢答,如何计算答题时间等等问题,若是仅凭主持人的主观判断,就很容易出现误判。所以,我们就需要一种具备自动锁存,置位,清零等功能智能抢答器来解决这些问题。
1
智能竞赛抢答器是一种应用十分广泛的设备,在各种竞赛、抢答场合中,它都能客观、迅速地判断出最先获得发言权的选手。早期的抢答器只是由三个三极管、可控硅、发光管等器件组成的,能通过发光管的指示辨认出选手号码。现在大多数智能抢答器都是由单片机或数字集成电路构成的,并且新增了许多功能,如选手号码显示,抢按前或抢按后的计时,选手得分显示等功能[2]。
2
第2章 EDA简介
20世纪末,电子技术获得飞速的发展,作为现代电子设计的核心EDA扮演的角色也越来越重要。由于电子领域的变化可谓是日新月异,所以本章就简单的介绍一下EDA技术和EDA中几个重要的名词。
2.1 EDA技术介绍
电子设计技术的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作,即IC设计、电子电路设计和PCB设计。EDA技术已有30年的发展历程,大致可分为三个阶段。70年代为计算机辅助设计(CAD)阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作。80年代为计算机辅助工程(CAE)阶段。与CAD相比,CAE除了有纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计。CAE的主要功能是:原理图输入,逻辑仿真,电路分析,自动布局布线,PCB后分析。90年代为电子系统设计自动化(EDA)阶段。
高层次设计是一种“自顶向下”的全新设计方法,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。然后,用综合优化工具生成具体门电路的网络表,其对应的物理实现级可以是印刷电路板或专用集成电路[3]。由于设计的主要仿真和调试过程是在高层次上完成的,这既有利于早期发现结构设计上的错误,避免设计工作的浪费,又减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
2.2 VHDL简介
VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。
3
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点:VHDL 语言功能强大、设计方式多样、VHDL 语言具有强大的硬件描述能力、VHDL 语言具有很强的移植能力、VHDL 语言的设计描述与器件无关、 语言程序易于共享和复用[4]。
2.3 Quartus II简介
EDA给出的实验和设计多是基于Quartus Ⅱ的,其应用方法和设计流程对于
其他流行的EDA工具而言具有一定的典型性和一般性,所以对此作一些介绍。
Quartus Ⅱ 是Altera提供的FPGA/CPLD开发集成环境,Altera是世界上最大的可编程逻辑器件供应商之一。Quartus Ⅱ 在21世纪初推出,是Altera前一代FPGA/CPLD集成开发环境MAX+plus Ⅱ的更新换代品,其界面友好,使用快捷。
Altera的Quartus Ⅱ提供了完整的多平台设计环境,能满足各种特定设计的需要,也是单芯片可编程系统(SOPC)设计的综合环境和SOPC开发的基本设计工具,并为Altera DSP开发包进行系统模型设计提供了集成综合环境。Quartus Ⅱ设计工具完全支持Verilog,VHDL的设计流程,其内部嵌有Verilog,VHDL逻辑综合器。Quartus Ⅱ也可以利用第三方的综合工具,如Leonardo Spectrum,Synplify Pro,DC-FPGA,并能直接调用这些工具,如ModelSim。此外,Quartus Ⅱ与MATLAB和DSP Builder结合,可以进行基于FPGA的DSP系统开发,是DSP硬件系统实现的关键EDA工具。
Quartus Ⅱ包括模块化的编译器。编译器包括的功能模块有分析/综合器(Analyzersis&Synthesis),适配器(Fitter),时序分析器(Timing Analyer),
4
设计辅助模块(Design Assistant),EDA网表文件生成器(EDA Netlist Writer)等。此外Quartus Ⅱ还包括十分有用的LPM(Library of Parameterized Modules)模块,他们是复杂或高级系统构建的重要组成部分,也可以是Quartus Ⅱ中与普通设计文件一起使用[5]。
Quartus Ⅱ编译器支持的硬件描述语言有VHDL,Verilog,System Verilog及AHDL[6]。
2.4 可编译逻辑器件 FPGA/CPLD简介
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是
在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块[7]。
系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。 根据对抢答器的功能要求,把要设计的系统划分FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD[8]。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。
5
第3章 四组智力抢答器的设计
3.1系统设计要求
一般来说,设计一台智力抢答器,必须能够准确判断出第一位抢答者,并且通过数显、蜂鸣这些途径能让人们很容易得知谁是抢答成功者,让抢答者在规定时间内答题,主持人根据答题结果实行增减分的操作,并将分数显示在屏幕上,评出最终赢家。所以我们在设计智力抢答器的模块需要满足鉴别、计分、数显等功能,具体设计要求如下:
设计一个四组智力抢答器系统,每组有一个对应的按钮,编号分别为A,B,C,D。在主持人的主持下,参赛者通过抢先按下抢答按钮获得答题资格。当某一组按下按钮并获得答题资格后,LED显示出改组编号,并有抢答成功显示,同时锁定其他组的抢答器,使其他组抢答无效。
如果主持人在未按下开始按钮前,已有人按下抢答按钮,属于违规,并显示违规组的编号,同时蜂鸣器发音提示,其他按钮无效。
获得回答资格后,若改组回答的问题正确,则加一分,否则减一分。抢答器设有复位开关,有主持人控制。
根据抢答器的设计要求,可以使用多个不同的单元模块,并通过顶层模块对子模块单元的调用来得到抢答系统。这些单元模块包括抢答判决模块、计分模块和7段LED显示驱动模块。
3.2顶层模块的设计
顶层模块的实体中需要定义清零信号输入端(CLR)、抢答许可控制输入端(EN)、四组抢答输入端(分别为A,B,C,D)、计分脉冲输入端(ADD_SUB_SIGN)、加/减分控制输入端(CONT_SIGN)、A组得分结果显示输出端(AA2_DISP、AA1_DISP、AA0_DISP)、B组得分结果显示输出端(BB2_DISP、BB1_DISP、BB0_DISP)、C组得分结果显示输出端(CC2_DISP、CC1_DISP、CC0_DISP)、D组得分结果显示输出端(DD2_DISP、DD1_DISP、DD0_DISP)、成功抢答组号显示输出端(T_DISP)、提前抢答报警输出端(F_DISP)和抢答成功提示灯(LED_A、LED_B、LED_C、LED_D)[9]。顶层模块程序编写如下:
6
Library ieee;
Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; ENTITY TOP IS
Port( CLR:in std_logic; EN:in std_logic; A,B,C,D:in std_logic; ADD_SUB_SIGN:IN STD_LOGIC; CONT_SIGN:IN BIT; LED_A:OUT STD_LOGIC; LED_B:OUT STD_LOGIC; LED_C:OUT STD_LOGIC; LED_D:OUT STD_LOGIC;
T_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); F_DISP:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); AA2_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); AA1_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); AA0_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); BB2_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); BB1_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); BB0_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); CC2_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); CC1_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); CC0_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); DD2_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); DD1_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); DD0_DISP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); END TOP;
ARCHITECTURE EX OF TOP IS
7
COMPONENT QDPB IS PORT(CLR:IN STD_LOGIC; EN:IN STD_LOGIC; A,B,C,D:IN STD_LOGIC; LED_A:OUT STD_LOGIC; LED_B:OUT STD_LOGIC; LED_C:OUT STD_LOGIC; LED_D:OUT STD_LOGIC;
T_LED:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); F_LED:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END COMPONENT QDPB; COMPONENT CONT IS PORT(
ADD_SUB_SIGN:IN STD_LOGIC; CONT_SIGN:IN BIT;
CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0); AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); BB2,BB1,BB0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CC2,CC1,CC0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DD2,DD1,DD0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END COMPONENT CONT; COMPONENT LED_DRIV IS
PORT(DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );
END COMPONENT LED_DRIV;
SIGNAL T_LED:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL AA2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0);
8
SIGNAL AA1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL AA0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
U0:QDPB PORT MAP(CLR=>CLR, EN=>EN, A=>A, B=>B, C=>C,D=>D, LED_A=>LED_A, LED_B=>LED_B, LED_C=>LED_C, LED_D=>LED_D, T_LED=>T_LED, F_LED=>F_DISP); U1:CONT PORT MAP(ADD_SUB_SIGN=>ADD_SUB_SIGN, CONT_SIGN=>CONT_SIGN,CHOS=>T_LED,
AA2=>AA2_POINTS,AA1=>AA1_POINTS,AA0=>AA0_POINTS, BB2=>BB2_POINTS,BB1=>BB1_POINTS,BB0=>BB0_POINTS, CC2=>CC2_POINTS,CC1=>CC1_POINTS,CC0=>CC0_POINTS, DD2=>DD2_POINTS,DD1=>DD1_POINTS,DD0=>DD0_POINTS); U2: LED_DRIV PORT MAP(DIN=>T_LED,DOUT=>T_DISP); U3: LED_DRIV PORT MAP(DIN=>AA2_POINTS,DOUT=>AA2_DISP); U4: LED_DRIV PORT MAP(DIN=>AA1_POINTS,DOUT=>AA1_DISP); U5: LED_DRIV PORT MAP(DIN=>AA0_POINTS,DOUT=>AA0_DISP); U6: LED_DRIV PORT MAP(DIN=>BB2_POINTS,DOUT=>BB2_DISP); U7: LED_DRIV PORT MAP(DIN=>BB1_POINTS,DOUT=>BB1_DISP); U8: LED_DRIV PORT MAP(DIN=>BB0_POINTS,DOUT=>BB0_DISP); U9: LED_DRIV PORT MAP(DIN=>CC2_POINTS,DOUT=>CC2_DISP); U10: LED_DRIV PORT MAP(DIN=>CC1_POINTS,DOUT=>CC1_DISP);
9
U11: LED_DRIV PORT MAP(DIN=>CC0_POINTS,DOUT=>CC0_DISP); U12: LED_DRIV PORT MAP(DIN=>DD2_POINTS,DOUT=>DD2_DISP); U13: LED_DRIV PORT MAP(DIN=>DD1_POINTS,DOUT=>DD1_DISP); U14: LED_DRIV PORT MAP(DIN=>DD0_POINTS,DOUT=>DD0_DISP); END EX;
系统输入信号是复位信号CLR,允许抢答信号EN,计分脉冲信号ADD_SUB_SIGN,计分加/减信号CONT_SIGN;系统输出信号是各组的抢答成功指示灯LED_A、LED_B、LED_C、LED_D,显示成功抢答组号T_LED,显示报警提前抢答的组号F_LED。A组计分显示信号:AA2,AA1,AA0、B组计分显示信号:BB2,BB1,BB0、C组计分显示信号:CC2,CC1,CC0、D组计分显示信号:DD2,DD1,DD0;
当CLR为低电平,EN为高电平,ADD_SUB_SIGN为时钟信号,CONT_SIGN为高电平。如果A组抢答成功则T_LED显示A组组号。A组回答正确A组计分显示信号进行加一分否则减一分。
当CLR为低电平,EN为高电平,ADD_SUB_SIGN=‘1’。如果B组抢答成功则T_LED显示B组组号。B组回答正确B组计分显示信号进行加一分否则减一分。 当CLR为低电平,EN为高电平,ADD_SUB_SIGN=‘1’。如果C组抢答成功则T_LED显示C组组号。C组回答正确C组计分显示信号进行加一分否则减一分。
当CLR为低电平,EN为高电平,ADD_SUB_SIGN=‘1’。如果D组抢答成功则
T_LED显示D组组号。D组回答正确A组计分显示信号进行加一分否则减一分[10]。
3.3抢答判别模块的设计
抢答判别模块具有第一轮抢答判别和锁存功能,其程序流程图如图3.1所示。主持人允许参赛小组进行抢答时,最先按下抢答按钮的小组将获得抢答权限。获得抢答权限的同时通过锁存功能,即使其他小组再按下抢答按钮也无效,并且模块输出相应的组号和信号指示。如果参赛小组在没有获得主持人允许抢答的前提下而按了抢答按钮时,模块中对改组将输出报警信号。
10
图3.1 抢答判别模块程序流程图
使用VHDL编写程序时,在实体中定义清零信号(CLR)、允许抢答信号(EN)、四组抢答按钮(A,B,C,D)、抢答成功指示灯(LED_A、LED_B、LED_C、LED_D)、显示成功抢答组号(T_LED)和报警提前抢答组号(F_LED)。
在结构体的功能说明语句中,应定义一个暂存报警信号(F_LED_STATE),暂存A,B,C,D四组状态信号(STATES),以及暂存抢答成功组号的指示灯状态(LED_STATE)。
在结构体的功能描述语句中,首先使用IF语句判断清除信号是否有效,若有效,则将F_LED、LED_STATE、和T_LED的内容清除,然后用ELSIF语句判断主持人是否按下允许抢答,EN=‘0’表示主持人没有同意小组抢答;EN=‘1’表示主持人允许小组抢答[11]。使用CASE语句描述小组抢答情况。抢答判别模块程序编写如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY QDPB IS
PORT(CLR:IN STD_LOGIC; EN:IN STD_LOGIC; A,B,C,D:IN STD_LOGIC; LED_A:OUT STD_LOGIC;
11
LED_B:OUT STD_LOGIC; LED_C:OUT STD_LOGIC; LED_D:OUT STD_LOGIC;
T_LED:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); F_LED:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END QDPB;
ARCHITECTURE ONE OF QDPB IS
SIGNAL F_LED_STATE:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL STATES:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL LED_STATE:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
STATES<=A&B&C&D; PROCESS(CLR,EN,STATES) BEGIN
IF CLR='1' THEN T_LED<=\"0000\"; LED_STATE<=\"0000\"; F_LED<=\"0000\"; ELSIF EN='0' THEN CASE STATES IS
WHEN \"1000\"=>F_LED<=\"1000\"; WHEN \"0100\"=>F_LED<=\"0100\"; WHEN \"0010\"=>F_LED<=\"0010\"; WHEN \"0001\"=>F_LED<=\"0001\"; WHEN OTHERS=>NULL; END CASE; ELSIF EN='1' THEN F_LED<=\"0000\"; CASE STATES IS
12
WHEN \"1000\"=>LED_STATE<=\"1000\"; WHEN \"0100\"=>LED_STATE<=\"0100\"; WHEN \"0010\"=>LED_STATE<=\"0010\"; WHEN \"0001\"=>LED_STATE<=\"0001\"; WHEN OTHERS=>NULL; END CASE;
LED_A<=LED_STATE(3); LED_B<=LED_STATE(2); LED_C<=LED_STATE(1); LED_D<=LED_STATE(0); T_LED<=LED_STATE; END IF; END PROCESS; END ONE;
当鉴别模块的清零信号CLR为高电平时,无论A、B、C、D四组参赛者谁按下抢答按钮,系统输出均为零,同时组别显示端T_LED输出信号也显示为零;当清零信号CLR为低电平时,A、B、C、D四组参赛者谁先按下抢答按钮,组别显示端T_LED就显示该组别的号码。当允许抢答信号EN为低电平时,A,B,C,D四组参赛者抢答F_LED则会显示出抢答组号,该组视为提前抢答。当允许信号EN为高电平时,A,B,C,D四组参赛者谁先按下抢答按钮,组别显示就显示该组别号码T_LED则会显示出抢答组号,该组视为抢答成功[12]。
3.4计分模块的设计
计分模块的运行方式是按照十进制进行加减,即当时钟出现上升沿时就进行加一或者减一的操作[13]。
记分模块为哪组进行记分取决于鉴别模块的输入信号CHOS,当CHOS=1000时表示A组最先抢答,则在此模块中为A组记分,F_LED=‘0000’,T_LED=‘1000’,AA0_DISP,AA1_DISP,AA2_DISP进行加一减一操作。当CHOS=0100时表示B组最先抢答,则在此模块中为B组记分,F_LED=‘0000’,T_LED=‘0100’,BB0_DISP,BB1_DISP,BB2_DISP进行加一减一操作当CHOS=0010时表示C组最先
13
抢答,则在此模块中为C组记分,F_LED=‘0000’,T_LED=
‘0010’,CC0_DISP,CC1_DISP,CC2_DISP进行加一减一操作当CHOS=0001时表示D组最先抢答,则在此模块中为D组记分F_LED=‘0000’,T_LED=‘0001’,DD0_DISP,DD1_DISP,DD2_DISP进行加一减一操作。
计分模块用于小组计分情况,其流程图如图3.2所示。
图3.2 计分模块程序流程图
在计分模块中使用VHDL编写程序时先用IF语句判断计分脉冲信号(ADD_SUB_SIGN)是否有效,若有效再用IF语句判断是加分还是减分,然后使用CASE语句进行计分小组的选择[14]。选择计分小组后,使用多层IF语句进行计分。计分模块的程序编写在附录。
3.5 7段LED显示驱动模块的设计
该模块实际上是一个译码器,作用是用来显示组别、成绩,其主要原理是四位二进制BCD编码转换成七段二进制数字,以阿拉伯数字的形式输出在数码管上,使观众能够更直观的看到结果[15]。 7段LED显示驱动模块程序如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY LED_DRIV IS
14
PORT(DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ); END LED_DRIV;
ARCHITECTURE THREE OF LED_DRIV IS BEGIN PROCESS(DIN) BEGIN CASE DIN IS
WHEN \"0000\"=>DOUT<=\"0111111\"; WHEN \"0001\"=>DOUT<=\"0000110\"; WHEN \"0010\"=>DOUT<=\"1011011\"; WHEN \"0011\"=>DOUT<=\"1001111\"; WHEN \"0100\"=>DOUT<=\"1100110\"; WHEN \"0101\"=>DOUT<=\"1101101\"; WHEN \"0110\"=>DOUT<=\"1111101\"; WHEN \"0111\"=>DOUT<=\"0000111\"; WHEN \"1000\"=>DOUT<=\"1111111\"; WHEN \"1001\"=>DOUT<=\"1101111\"; WHEN OTHERS=>NULL; END CASE; END PROCESS; END THREE;
当输入信号是‘0000’是其输出信号为‘0000110’译码管显示为‘0’上述输出为从0至9的译码管显示输出。
15
第4章 四组智力抢答器的仿真结果
4.1顶层模块的仿真结果
利用QuartusII进行编译,综合,仿真,时序图如图4.1所示:
图4.1顶层模块的仿真图
系统输入信号是复位信号CLR,允许抢答信号EN,计分脉冲信号
ADD_SUB_SIGN,计分加/减信号CONT_SIGN;系统输出信号是各组的抢答成功指示灯LED_A、LED_B、LED_C、LED_D,显示成功抢答组号T_LED,显示报警提前抢答的组号F_LED。由仿真图得出当CLR为低电平,EN为高电平,ADD_SUB_SIGN为时钟信号,CONT_SIGN为高电平,A组提前抢答则AA_DISP显示为‘0111111’则说明A组抢答犯规。B组D组没有加入输入信号所以没有输出结果,C组抢答成功则CC_DISP显示‘1011011’。
4.2 抢答判别模块的仿真结果
利用QuartusII进行编译,综合,仿真,时序图如图4.2所示:
图4.2 抢答鉴别模块仿真图
16
系统输入信号是各组的抢答按钮A、B、C、D,复位信号CLR,允许抢答信号EN。系统的输出信号是各组的抢答成功指示灯LED_A、LED_B、LED_C、LED_D,显示成功抢答组号T_LED,显示报警提前抢答的组号F_LED。
由仿真图得出当允许抢答信号EN=‘0’,CLR=‘0’时,A组抢答则表示抢答犯规F_LED=‘1000’当允许抢答信号EN=‘0’,CLR=‘0’时,B组抢答则表示抢答犯规F_LED=‘0100’,C组抢答则表示抢答犯规F_LED=‘0010’,D组抢答则表示抢答犯规F_LED=‘0001’。
4.3 计分模块的仿真结果
利用QuartusII进行编译,综合,仿真,时序图如图4.3所示:
4.3 计分模块仿真图
系统输入信号是计分脉冲信号ADD_SUB_SIGN,加/减分控制信号CONT_SIGN,选择计分小组信号CHOS;系统输出信号是A组计分显示信号:AA2,AA1,AA0、B组计分显示信号:BB2,BB1,BB0、C组计分显示信号:CC2,CC1,CC0、D组计分显示信号:DD2,DD1,DD0;由仿真图得当积分脉冲信号是时钟信号,加/减分控制信号COT_SIGN为‘1’时A组抢答成功CHOS=‘1000’并且A组回答正确则A组加一分AA0=‘0001’;B组抢答成功CHOS=‘0100’并且B组回答正确则B组加一分BB0=‘0001’;C组抢答成功CHOS=‘0010’并且C组回答正确则C组加一分CC0=‘0001’;D组抢答成功CHOS=‘0001’并且D组回答正确则D组加一分AA0=‘0001’。
4.4 7段LED显示驱动模块的仿真结果
利用QuartusII进行编译,综合,仿真,时序图如图4.4所示:
17
4.4 7段译码管显示驱动模块仿真
系统输入信号是DIN; 系统输出信号是DOUT; 由仿真图得:
当DIN= \"0000\" , 当DIN= \"0001\" , 当DIN= \"0010\" , 当DIN= \"0011\" , 当DIN= \"0100\" , 当DIN= \"0101\" , 当DIN= \"0110\" , 当DIN= \"0111\" , 当DIN= \"1000\" ,当DIN= \"1001\" ,
输出\"0111111\此时数码管显示0; 输出\"0000110\此时数码管显示1; 输出\"1011011\此时数码管显示2; 输出\"1001111\此时数码管显示3; 输出\"1100110\此时数码管显示4; 输出\"1101101\此时数码管显示5; 输出\"1111101\此时数码管显示6; 输出\"0000111\此时数码管显示7; 输出\"1111111\此时数码管显示8;
输出\"1101111\此时数码管显示9; 18
DOUT DOUT DOUT DOUT DOUT DOUT DOUT7 DOUT7 DOUT7 DOUT7
总 结
按照任务要求,我们设计出的抢答器具备抢答鉴别、计分、数码管显示、报警提示等多种功能。本抢答器能够准确判断出第一位抢答者,并且通过数显途径能让人们很容易得知谁是抢答成功者。根据不同比赛的需要,主持人可以预设一定的回答限制时间,让抢答者在规定时间内答题,主持人根据答题结果评出最终赢家。
设计制作过程中遇到的问题及解决方案: 1.VHDL语法使用不规范:
当我们编写软件程序的时,遇到了编译错误。细心阅读QuartusII错误提示和所编写的程序后发现是因为VHDL语法使用错误。最后经过翻阅EDA课本,熟悉相关语法后将其改正。
2.引脚锁定不完整,最终编译无法通过:
处理了之前出现的几个问题后,在最后编译时未通过。细致查看了错误提示,发现是个别管脚未锁定的原因。我们最终把各个管脚锁定号码一一检查了一遍,从而通过了编译。
本设计有以下几个可以改进的地方:
1.预使本抢答器具有计分功能,可以使用引脚更多的CPLD芯片,即使用更多的数码管来实时显示每个抢答选手的得分情况。
2.在现有设计基础上使用无线电或红外技术,还可以使本项目升级为无线智能抢答器。
19
参考文献
[1]潘松,黄继业. EDA技术实用教程.第二版[M].北京:科学出版社,2005. [2]龚尚福.微机原理与接口技术.第二版[M]. 西安:西安电子科技大学出版社,2008.
[3]边计年,薛宏熙. 用VHDL设计电子线路[M].北京:清华大学出版社,2000 [4]李伟英,谢完成.基于EDA技术的抢答器的设计与实现[M].西安:西安电子科技大学出版社, 2008.8(11).
[5]谭会生,瞿遂存.EDA技术综合应用实例与分析[M].西安:西安电子科技大学出版社, 2004.
[6]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计[M].西安:西安电子科技大学出版社,1997
[7]常青,陈辉煌.可变成专用集成电路及其应用与设计实践经验[M].北京:国防工业出版社,1998
[8] 张千里,陈光英.网络安全新技术[M].北京:人民邮电出版社,2003 [9]江国强. EDA技术与应用(第3版)[M].北京:电子工业出版社 ,2010. [10]宋烈武. EDA技术与实践教程[M].西安:电子工业出版社, 2009. [11] 聂辉. CPLD数字频率计系统的研究与设计[M].重庆:重庆科技学院学报(自
然科学版) , 2005,
[12] 宋泽明,陈文楷. 基于VHDL的有限状态机设计[M].北京:北京工业大学学报 , 2005,
[13] 藏春华,电子线路设计与应用[M].北京:高等教育出版社,2004. [14] 徐志军 EDA技术与PLD设计[M]. 北京:人民邮电出版社, 2006. [15] 陈忠平,高金定.基于Quartus Ⅱ的FPGA/CPLD设计与实践[M].北京:电子工业出版社,2005.
20
致谢
在本人的写作过程中,张妍老师给予了大力的帮助和指导,在此深表感谢!同时也感谢其他帮助和指导过我的老师和同学。感谢在整个论文写作过程中帮助过我的每一位人。
在论文题目制定时,她首先肯定了我的题目大方向,但是同时又帮我具体分析使我最后选择《基于QuartusII的四组智力抢答器的设计与仿真》这个具体目标,让我在写作时有了具体方向。在论文提纲制定时,我的思路不是很清晰,经过老师的帮忙,让我具体写作时思路顿时清晰。在完成初稿后,老师认真查看了我的文章,指出了我存在的很多问题。在此十分感谢张老师的细心指导,才能让我顺利完成毕业论文。
21
附 录
计数模块VHDL源程序: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CONT IS PORT(
ADD_SUB_SIGN:IN STD_LOGIC; CONT_SIGN:IN BIT;
CHOS:IN STD_LOGIC_VECTOR(3 DOWNTO 0); AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); BB2,BB1,BB0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CC2,CC1,CC0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DD2,DD1,DD0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END CONT;
ARCHITECTURE TWO OF CONT IS
SIGNAL AA2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL AA1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL AA0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL BB0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CC0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD2_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD1_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DD0_POINTS:STD_LOGIC_VECTOR(3 DOWNTO 0);
22
BEGIN
PROCESS(ADD_SUB_SIGN,CONT_SIGN,CHOS) BEGIN
IF(ADD_SUB_SIGN'EVENT AND ADD_SUB_SIGN='1')THEN IF CONT_SIGN='1' THEN CASE CHOS IS WHEN \"1000\"=> IF(AA2_POINTS=\"1001\" AA0_POINTS=\"1001\") THEN AA0_POINTS<=\"0000\"; AA1_POINTS<=\"0000\"; AA2_POINTS<=\"0000\"; ELSIF(AA2_POINTS/=\"1001\" AA0_POINTS=\"1001\") THEN
AA0_POINTS<=\"0000\";
AA1_POINTS<=\"0000\";
AA2_POINTS<=AA2_POINTS+'1';
ELSIF(AA2_POINTS/=\"1001\" AND AA1_POINTS/=\"1001\" AND AA0_POINTS=\"1001\") THEN
AA0_POINTS<=\"0000\"; AA1_POINTS<=AA1_POINTS+'1'; AA2_POINTS<=AA2_POINTS; ELSE
AA0_POINTS<=AA0_POINTS+'1'; AA1_POINTS<=AA1_POINTS; AA2_POINTS<=AA2_POINTS; END IF; WHEN \"0100\"=>
23
AND AA1_POINTS=\"1001\" AND
AND AA1_POINTS=\"1001\" AND
IF(BB2_POINTS=\"1001\" AND BB1_POINTS=\"1001\" AND BB0_POINTS=\"1001\")THEN BB0_POINTS<=\"0000\";
BB1_POINTS<=\"0000\"; BB2_POINTS<=\"0000\"; ELSIF(BB2_POINTS/=\"1001\" BB0_POINTS=\"1001\") THEN
BB0_POINTS<=\"0000\";
BB1_POINTS<=\"0000\";
BB2_POINTS<=BB2_POINTS+'1';
ELSIF(BB2_POINTS/=\"1001\" AND BB1_POINTS/=\"1001\" AND BB0_POINTS=\"1001\") THEN
BB0_POINTS<=\"0000\"; BB1_POINTS<=BB1_POINTS+'1'; BB2_POINTS<=BB2_POINTS; ELSE
BB0_POINTS<=BB0_POINTS+'1'; BB1_POINTS<=BB1_POINTS; BB2_POINTS<=BB2_POINTS; END IF; WHEN \"0010\"=>
IF (CC2_POINTS=\"1001\" AND CC1_POINTS=\"1001\" AND CC0_POINTS=\"1001\")THEN CC0_POINTS<=\"0000\";
CC1_POINTS<=\"0000\"; CC2_POINTS<=\"0000\"; ELSIF(CC2_POINTS/=\"1001\" CC0_POINTS=\"1001\") THEN
CC0_POINTS<=\"0000\";
24
AND BB1_POINTS=\"1001\" AND
AND CC1_POINTS=\"1001\" AND
CC1_POINTS<=\"0000\";
CC2_POINTS<=BB2_POINTS+'1';
ELSIF(CC2_POINTS/=\"1001\" AND CC1_POINTS/=\"1001\" AND CC0_POINTS=\"1001\") THEN
CC0_POINTS<=\"0000\"; CC1_POINTS<=CC1_POINTS+'1'; CC2_POINTS<=CC2_POINTS; ELSE
CC0_POINTS<=CC0_POINTS+'1'; CC1_POINTS<=CC1_POINTS; CC2_POINTS<=CC2_POINTS; END IF; WHEN \"0001\"=> IF
(DD2_POINTS=\"1001\"
AND
DD1_POINTS=\"1001\"
AND
DD0_POINTS=\"1001\")THEN DD0_POINTS<=\"0000\";
DD1_POINTS<=\"0000\"; DD2_POINTS<=\"0000\"; ELSIF(DD2_POINTS/=\"1001\" DD0_POINTS=\"1001\") THEN
DD0_POINTS<=\"0000\";
DD1_POINTS<=\"0000\";
DD2_POINTS<=DD2_POINTS+'1';
ELSIF(DD2_POINTS/=\"1001\" AND DD1_POINTS/=\"1001\" AND DD0_POINTS=\"1001\") THEN
DD0_POINTS<=\"0000\"; DD1_POINTS<=DD1_POINTS+'1';
25
AND DD1_POINTS=\"1001\" AND
DD2_POINTS<=DD2_POINTS; ELSE
DD0_POINTS<=DD0_POINTS+'1' ; DD1_POINTS<=DD1_POINTS; DD2_POINTS<=DD2_POINTS; END IF;
WHEN OTHERS=>NULL; END CASE; ELSE
CASE CHOS IS WHEN \"1000\"=>
IF(AA2_POINTS=\"0000\" AND AA1_POINTS=\"0000\" AND AA0_POINTS=\"0000\")THEN AA0_POINTS<=\"1001\"; AA1_POINTS<=\"1001\"; AA2_POINTS<=\"1001\"; ELSIF(AA2_POINTS/=\"0000\" AA0_POINTS=\"0000\")THEN AA0_POINTS<=\"1001\"; AA1_POINTS<=\"1001\"; AA2_POINTS<=AA2_POINTS-'1'; ELSIF(AA2_POINTS/=\"0000\" AA0_POINTS=\"0000\")THEN AA0_POINTS<=\"1001\"; AA1_POINTS<=AA1_POINTS-'1'; AA2_POINTS<=AA2_POINTS; ELSE
AA0_POINTS<=AA0_POINTS-'1'; AA1_POINTS<=AA1_POINTS; AA2_POINTS<=AA2_POINTS; END IF ;
26
AND AA1_POINTS=\"0000\" AND
AND AA1_POINTS/=\"0000\" AND
因篇幅问题不能全部显示,请点此查看更多更全内容