六人抢答器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目: 六人抢答器
一、初始条件
QuartusⅡ软件微机实验箱
二、要求完成的主要任务
1、抢答台数为6,具有抢答开始后20秒倒计时,20秒倒计时后六人抢答显示超时,并报警。
2、能显示超前抢答台号并显示犯规报警。
3、系统复位后进入抢答状态,当有一路抢答按键按下,该路抢答信号将其余各路抢答信号封锁,同时铃声响起,直至该路按键松开,显示牌显示该路抢答台号。
三、时间安排
作课程设计任务布置、选题、查阅资料第1天
设计软件编程和仿真,验证设计的可行性和正确性第2-8天设计的硬件调试第9-10天机房检查设计成果,提交设计说明书及答辩第11天
指导教师签名:年月日系主任(或责任教师)签名:年月日
目录
摘要 (I)
ABSTRACT ................................................................................................................. I I
1 绪论 (1)
2 设计内容及要求 (2)
2.1设计的目的及主要任务 (2)
2.1.1设计的目的 (2)
2.1.2 设计任务及主要技术指标 (2)
2.2设计思想 (3)
3 设计原理及单元模块设计 (3)
3.1设计原理及方法 (3)
3.2按键模块设计 (4)
3.3抢答控制模块 (5)
3.4犯规控制模块 (6)
3.5倒计时模块 (7)
3.6报警模块 (8)
3.7数码显示模块 (9)
3.8顶层电路的设计 (10)
4电路的仿真及分析 (11)
5 硬件调试 (12)
6 心得体会 (13)
参考文献 (14)
附录一 (15)
附录二 (16)
附录三 (17)
摘要
近年来随着科技的飞速发展,QuartusⅡ的应用正在不断地走向深入。
本文介绍基于QuartusⅡ,并用VHDL语言设计来完成六人抢答器的方法。
大体思想是:利用VHDL语言设计出按键选择模块,倒计时模块,抢答控制模块,犯规控制模块,报警模块及数码显示模块等所需要的元件,将这些元件进行例化后,进行一定的连接形成六人抢答器系统。
该系统具有的功能是:开始抢答前,若有选手按动抢答键,则显示犯规选手编号且报警;当开始抢答后,若在20s内有选手按动抢答键,则能显示选手的编号且铃声响起,同时能禁止其他选手抢答,若在20s内没有选手按动抢答键,则显示超时且报警。
关键词:QuartusⅡ;VHDL;抢答器
Abstract
In recent years, with the rapid development of science and technology, the applications of Quartus Ⅱare continually deepening. This article introduces how to make an competitive answer machine that can be used by six selects based on Quartus Ⅱand VHDL language. The general idea is like following: First, use VHDL language to design the required components of button selection module, countdown module, answer control module, fouls control module, alarm module and digital display modules. Second,instantiate these components. Finally, line these components into a competitive answer machine. The system has the following functions: Before the beginning, if a selector pressed his button, then the alarm would ring and his number would be displayed on Digital Tube. Once begin, if there were one elector pressed his button within 20 seconds, then the alarm would ring and his number would be displayed on Digital Tube, at the same time, the others wouldn’t be responded. If nobody pressed his button within 20 seconds, then the alarm would ring and the Digital Tube would display the signal of delay.
Key words: VHDL; Quartus Ⅱ; competitive answer machine
1 绪论
随着微电子技术的发展,越来越多的的电子产品陆续问世。
数字技术的发展,使得数字产品的应用渗透了人们日常生活的各个方面。
多路数字定时抢答器被广泛用于生活中,在娱乐节目中,我们能经常看到它的身影。
在抢答题目中,多路抢答器能够保证每位选手的权利,做到公正,并且也给主持人带来许多方便。
人类社会已经进入信息化时代,信息社会的发展离不开电子产品的进步。
电子设计技术的发展的核心就是EDA技术。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必须对EDA技术提出新要求。
EDA代表了当今电子设计技术的最新发展方向,它的基本特征是:设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分。
VHDL是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持结构、数据流和行为3种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件描述语言的功能,整个自顶向下或自底向上的电路设计过程都可以用VHDL来完成。
另外,VHDL还有以下优点:VHDL的宽范围描述能力使它成为高层次设计的核心,将设计人员的工作重心转移到了系统功能的实现和调试上,只需要花较少的精力用于物理实现;VHDL可以用简洁明确的代码描述来进行复杂控制逻辑的设计,灵活且方便,而且也便于设计结果的交流、保存和重用;VHDL的设计不依赖于特定的器件,方便了工艺的转换。
VHDL是一个标准语言,为众多的EDA场上支持,因此移植性好[2]。
本设计基于QuartusⅡ,并用VHDL语言设计来完成六人抢答器。
大体思想是:利用VHDL语言设计出按键选择模块,倒计时模块,抢答控制模块,犯规控制模块,报警模块及数码显示模块等所需要的元件,将这些元件进行例化后,进行一定的连接形成六人抢答器系统。
该系统具有的功能是:开始抢答前,若有选手按动抢答键,则显示犯规选手编号且报警;当开始抢答后,若在20s内有选手按动抢答键,则能显示选手的编号且铃声响起,同时能禁止其他选手抢答,若在20s内没有选手按动抢答键,则显示超时且报警。
2 设计内容及要求
2.1 设计的目的及主要任务
2.1.1设计的目的
①根据设计要求,完成对六人抢答器的设计。
②进一步加强对QuartusⅡ的应用和对VHDL语言的使用。
2.1.2 设计任务及主要技术指标
①可同时供6名选手(或代表队)参赛,其编号分别是1到6,各用一个抢答按钮,按键的编号与选手的编号相对应。
②给节目主持人设置一个控制开关,用来控制系统的清零和抢答的开始。
③抢答器具有数据锁存和显示的功能。
抢答开始后,若有选手按动抢答按键,编号立即锁存,并在LED数码管上显示出选手的编号,同时扬声器给出音响提示,直至按键松开。
此外,要封锁输入电路,禁止其它选手抢答。
优先抢答选手的编号一直保持到主持人将系统清零为止。
④抢答器具有定时抢答的功能,设定抢答的时间为20秒。
当节目主持人启动“开始”键后,要求定时器立即从20秒进行减计时,并用显示器进行显示,当倒计时完毕且没有按键按下时,扬声器发出声响。
⑤参赛选手应在设定的时间内进行抢答,若系统清零后但抢答未开始时,若有选手抢答,则显示抢答台号,并报警。
2.2设计思想
本设计基于QuartusⅡ,并用VHDL语言设计来完成六人抢答器。
大体思想是:利用VHDL语言设计出按键选择模块,倒计时模块,抢答控制模块,犯规控制模块,报警模块及数码显示模块等所需要的元件,将这些元件进行例化后,进行一定的连接形成六人抢答器系统。
该系统具有的功能是:开始抢答前,若有选手按动抢答键,则显示犯规选手编号且报警;当开始抢答后,若在20s内有选手按动抢答键,则能显示选手的编号且铃声响起,同时能禁止其他选手抢答,若在20s内没有选手按动抢答键,则显示超时且报警。
3 设计原理及单元模块设计
3.1 设计原理及方法
根据层次化设计理论,该设计自顶向下可分为按键选择模块,倒计时模块,抢答控制模块,犯规控制模块,报警模块及数码显示模块,其系统框图如图1所示。
图1 六人抢答器系统框图
3.2 按键模块设计
本设计共用到了六个按键分别用来接收六个选手的信息,还有一个拨码开关用来接收主持人的信息。
由于按键所用开关为机械弹性开关,当机械开关被按下时不会马上稳定地接通,松开时不会马上稳定地断开,所以六个按键要接消抖模块。
即按键设计模块包含了六个按键、一个拨码开关和六个消抖模块。
消抖模块的设计思想是,利用信号通过D触发器时的时延,将三个顺次连接的D触发器的输出接入一个三输入与门,只有当键按下且稳定时才有输出为1,其余输出为0。
需要说明的是:时钟输入是经过分频的,分频后的时钟周期与按键的抖动时间相当。
具体电路如图2所示。
图2 消抖模块电路原理图
按照上图写出VHDL程序,将此程序仿真正确后,例化成元件,元件名为qdou,则由六个按键、一个拨码开关和六个消抖模块如图3所示。
其中六个选手对应的按键接口分别为d6、d5、d4、d3、d2和d1,对应的消抖模块名称分别为6、5、4、3、2和1。
这六个消抖模块的clock 端连在一起,接20MHZ的时钟激励,激励名称为clk。
在此设计中的其他模块所需处理的选手信息都是来自各消抖模块的输出。
另外,主持人控制的拨码开关不需连接消抖模块,且对其取名为host。
图3 按键选择模块
3.3抢答控制模块
该模块主要用到了以下两个子模块:信号封锁模块及信号输出模块。
本模块的电路图如图4所示。
在此图中,d4、d3、d2和d1及对应的消抖模块由于篇幅过大而没有画出,各消抖模块的输出端分别对应接到一个或门和dff1上,或门的输出端则接fs的clk输入端口。
信号封锁模块取名为fs,其作用原理是:当clr 端口输入为0时,输出q为0;当clr 端口输入为1 且clk有上升沿触发时,输出q为1。
信号输出模块取名为dff1,其作用原理是:当clr 端口输入为0时,输出dffq6至dffq1为0;当clr 端口输入为1 且clk有上升沿触发时,输出口dffq6至dffq1输出的值分别为d6至d1的值。
抢答控制模块的作用原理为:当主持人拨码开关置0时,fs及dff1的各输出端均为0。
当主持人拨码开关置1时,若没有按键按下时,各消抖模块的输出端均为0,于是或门的输出为0;一旦有键按下,各消抖模块的输出端有一个为1,于是或门的输出为1,fs的clk输入端口就有一个上升触发沿,输出q为1,
进而dff1的clk输入端口就有一个上升触发沿,六个选手的按键信息被输出。
此时,若再有选手按下按键,各部分的输出不会有所改变,即此选手的按键信息被封锁。
违规控制模块的作用原理为:当主持人拨码开关置1时,dff2的输出q各位为0。
当主持人拨码开关置0时,即还没有开始抢答时,若有按键按下时,对应消抖模块的输出端为1,于是此选手的编号便作为信息输出。
3.5
该模块的中心部分是由以下两个子模块构成:分频模块和倒计时模块。
分频模块的输出作为倒计时模块的时钟输入,信号输出模块dff1的各输出端口经一个或门连接到倒计时模块的暂停控制端,主持人的拨码开关输入连接到倒计时模块的初始化控制端。
分频模块取名为fenp1,其作用原理是:将频率为20MHZ的激励源经clk 端口输入后,输出频率为1HZ的方波。
倒计时模块取名为cnt20s,其作用原理是:clk端口输入为方波;当clr端口输入为0时,输出s和g合起来对应的数字为20,clr端口输入为1时,输出s和g合起来对应的数字则从20开始每个时钟脉冲减1;当stop 端口输入为0时,对输出无影响,当stop端口输入为1时,输出输出s和g合起来对应的数字不变;当倒计时到0秒时,输出y为0,其余时刻输出y为1。
倒计时模块的作用原理为:当主持人拨码开关置0时,输出s和g合起来对应的数字为20,输出y为1;当主持人拨码开关置1时,输出s和g合起来对应
的数字则从20开始每个时钟脉冲减1;若在倒计时到0秒之前,有选手进行抢答时,dff1的对应输出端为1,于是或门的输出为1,倒计时停止。
若在倒计时到0秒之前,没有选手进行抢答,则输出y为0。
倒计时模块的原理图如图6。
图6 倒计时模块的原理图
3.6报警模块
该模块的中心部分是由警铃子模块构成。
具体电路图如图7所示,其中的或门即是抢答控制模块中的或门。
警铃子模块的时钟输入端与20MHZ的时钟激励源相连,倒计时模块的输出y和或门的输出取非后连接到一个与门,此与门的输出连接到警铃子模块的输入使能端。
警铃子模块取名为ring,其作用原理是:clk1作为时钟脉冲激励端,当输入使能端en输入为0时,有一定频率的方波输出,当输入使能端en输入为1时,输出恒为0。
报警模块的作用原理为:当有选手进行抢答或倒计时到0秒时,en输入为0,ring有一定频率的方波输出;其余情况下,en输入为1,输出恒为0。
图7 报警模块原理图
3.7数码显示模块
该模块的中心部分是由两种译码子模块及一个选择输出子模块构成。
倒计时模块的十位和个位输出接译码器seg72,抢答控制模块及犯规控制模块的输出接译码器seg7。
经各译码器输出的信号接到选择输出子模块,20MHZ的时钟激励接分频器后接选择输出子模块的时钟端。
第一种译码子模块模块取名为seg7,其作用原理是:将按键信息转化为可用于七段译码管输入的段选信息。
例如,对应第二个选手的编码010000,它对应的七段译码管输出为2。
另一种译码子模块模块取名为seg72,其作用原理是:将时钟信息转化为可用于七段译码管输入的段选信息。
例如,对应时钟倒计时到15秒时,它对应的七段译码管输出为15。
选择输出子模块取名为xze4,其作用原理是:内部由00到11轮换计时,对于四个输入,每一时刻都对应有作为输出。
数码显示模块的作用原理为:倒计时的十位与个位、抢答选手编号、违规选手编号分别在不同时刻轮换输出,再由时刻输出端决定不同的数码管轮换发光,于是,由于视觉的暂留效应,以上各信息便可以同时在数码管上显示。
模块的原理图如图8。
图8 数码显示模块
3.8顶层电路的设计
根据以上各电路的分析,可以将按键选择模块,倒计时模块,抢答控制模块,犯规控制模块,报警模块及数码显示模块按照一定的顺序连接成一个总的六人抢答器系统,连接顺序可以参照图1,即六人抢答器的系统框图。
具体的顶层电路见附录一。
要注意的是,在连接好顶层电路后,在files菜单栏下,右击qda.bdf 选择Set As Top-Level Entity,再运行此顶层电路。
在顶层电路设计完毕之后,选择与当前项目文件欲设计实现的实际芯片进行编译适配,点击Assignment/Device,在弹出的对话框中的Cyclone族中选择芯片EPIC3T144C8,然后点击确定。
接下来,要设置各输入输出口的引脚。
点击Assignment/Device,在弹出的对话框中的location一栏中依次设置各引脚即可。
要注意的是,不用的引脚要设置为高阻态,以免某个引脚输出电压过高而引起实验箱的损坏。
4电路的仿真及分析
由于本实验的时间为秒级,所以程序的仿真不能出来结果。
为了能够得到仿真结果,将本设计中的有分频作用的模块去掉,则每一个时钟脉冲都会有对应的波形变化。
对应的可用于仿真的电路原理图如图9所示。
在此图中,六个选手的按键及主持人的拨码开关作为输入端,警铃的使能端输入信号及要显示的各位作为输出端。
图9 可用于仿真的电路原理图
如图10所示,主持人的输入端为host,六位选手的输入端分别对应d1至d6,倒计时的十位及个位输出分别为s和g,抢答成功的选手输出为qda,违规的选手输出为wg,警铃的使能端输入为ring,只有当ring为0时,警铃才发声,当ring为1时,警铃不发声。
在图10中,在系统复位后,即主持人的输入端为host为0时,倒计时的输出为000010和000000,经译码器seg7后输出为20,且不随时间而变,设置抢答开始前第二位选手违规抢答,则有输出端wg输出变为010000,经译码器seg7后,输出为2,且同时有警铃发声。
抢答开始后,即主持人的输入端为host为1时,倒计时开始,设置第四位选手首先抢答,于是警铃输入使能端变为0,即警
铃发声。
输出端qda变为000100,经译码器seg7后,输出为4,且不随时间而变,即若再有其他选手抢答,输出端qda。
图10 仿真波形图
5 硬件调试
仿真结果正确后,就可将文件下载到芯片中。
连接硬件系统后,通上电源,经QuartusⅡ中的“PROGRAMMER”菜单,调出编程器窗口。
一切就绪后,按下编程器窗口中的“START”按钮,设计的内容就开始下载到实验箱中。
在实验中,发现了几个问题。
第一个问题是,倒计时输出为FF,经检查后,发现译码器的设置有问题。
在设计中,抢答选手及违规选手的编号译码方法与倒计时的数字译码方法是不同的,在设计初期忽略了他们之间的不同,导致译码出错。
第二个问题是,显示的顺序有误,例如,倒计时的十位出现在各位的右边,不符合我们的观察习惯。
经检查后,发现倒计时模块软件的编写与顶层电路的连接不对。
将软件的设计改为与电路连接匹配后,倒计时的十位出现在各位的左边。
第三个问题是,当按键按下后,及抢答时间结束后,没有报警声。
经检查后,发现警铃模块的分频出现问题,即所分出输出波形的频率不在人耳的听觉范围之内。
将分频的输出频率增大至人耳的听觉范围之内后,可使警铃正常发声。
各错误及异常改正之后,实验箱工作正常。
6 心得体会
这次课程设计历时十多天,在这段日子中,我首先完成了电路图的设计,然后利用QuartusⅡ完成了电路图的原理图绘制及原理图中的各模块的编写。
对我而言,此次课程设计的过程中我遇到了许多挫折,如软件使用中的很多问题,但我认为挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆。
从拿到题目到具体设计,从学习到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,如对QuartusⅡ软件的应用还不够熟悉,以及其中很多功能应用还未有深刻理解,要通过不断的实用和查找资料来完善自己此方面的能力。
尤其是在经过硬件调试后,我发现自己在模块的设计过程中,出现了很多的错误,多是由于思考问题不够缜密所致。
今后,我一定要加紧自己的程序设计缜密性。
感谢学校给我们这次机会,在此次设计中,将以前所学的理论知识运用到实际的电路设计当中去,在电路的设计过程中,无形中便加深了对数字电路的了解及运用能力,对课本以及以前学过的知识有了一个更好的总结与理解,同时也锻炼了我的动手能力。
同时也感谢指导老师在设计过程中的辅导以及同学的帮助。
参考文献
[1]潘松,黄继业.EDA技术与VHDL.北京:清华大学出版社,2007.1.
[2]宋嘉玉,孙丽霞.EDA实用技术.北京:人民邮电出版社,2006.12.
[3]齐洪喜,陆颖.VHDL电路设计实用技术.北京:清华大学出版社,2004.5.
[4]刘艳萍,高振斌,李志军.EDA实用技术及应用.北京:国防工业出版社,2006.1.
[5]章彬宏.EDA应用技术.北京:北京理工大学出版社,2007.7.
[6]汉泽西.EDA技术及其应用.北京:北京航空航天大学出版社,2004.5.
[7]谭会生.EDA技术基础.长沙:湖南大学出版社,2004.8.
附录一
图11 整体设计原理图
附录二
表1 模块清单
附录三
七段译码器seg72的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity seg72 is
port(din:in std_logic_vector(3 downto 0); sout: out std_logic_vector(6 downto 0)); end seg72;
architecture ver3_arch of seg72 is
begin with din select
sout<="0111111"when"0000", "0000110"when"0001", "1011011"when"0010", "1001111"when"0011", "1100110"when"0100", "1101101"when"0101", "1111101"when"0110", "0000111"when"0111", "1111111"when"1000", "1101111"when"1001", "1101111"when others;
end ver3_arch;
警铃ring的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity ring is
port(clk1,en:in std_logic; fpq:out std_logic); end ring ;
architecture fp_arch of ring is
signal count1: std_logic_vector(24 downto 0);
begin process(clk1,en) begin
if(en='1')then fpq<='0'; elsif(clk1'event and clk1='1')then
if(count1=20000)then count1<=(others=>'0'); else count1<=count1+1;
if count1<10000 then fpq<='0'; else fpq<='1';
end if; end if;end if; end process; end fp_arch;
选择输出模块xz4的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity xz4 is
port(clk:in std_logic; in0,in1,in2,in3:in std_logic_vector(6 downto 0);
xze4out:out std_logic_vector(6 downto 0);
count:buffer std_logic_vector(1 downto 0)); end xz4;
architecture counter_arch of xz4 is
begin process(clk,count,in0,in1,in2,in3) begin
if(clk'event and clk='1')then if(count=3)then count<=(others=>'0');
else count<=count+1; end if; end if;
case count is
when"11"=>xze4out<=in0; when"10"=>xze4out<=in1; when"01"=>xze4out<=in2; when"00"=>xze4out<=in3; when others=>xze4out<=in0;
end case; end process; end counter_arch;
输出周期为一秒的方波的模块fenp1的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity fenp1 is
port(clk1:in std_logic;fpq:out std_logic); end fenp1;
architecture fp_arch of fenp1 is
signal count1: std_logic_vector(24 downto 0);
begin process(clk1) begin
if(clk1'event and clk1='1')then if(count1=19999999)then count1<=(others=>'0'); else count1<=count1+1; if count1<10000000 then fpq<='0';
else fpq<='1'; end if; end if; end if; end process; end fp_arch;
倒计时cnt20s的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity cnt20s is
port(clk,clr,stop:in std_logic; y:out std_logic; s,g:out std_logic_vector(3 downto 0)); end cnt20s;
architecture counter_arch of cnt20s is
signal outy,ss,gg:integer;
begin process(clk,clr,stop,ss,gg,outy) begin
if clr='0' then outy<=0;y<='1'; elsif(stop='1')then outy<=outy;
elsif(clk'event and clk='1')then if(outy=20)then outy<=20;y<='0';
else outy<=outy+1;y<='1'; end if; end if;
ss<=(20-outy)/10; gg<=(20-outy) rem 10;
s<=conv_std_logic_vector(ss,4); g<=conv_std_logic_vector(gg,4);
if(outy=20)then y<='0'; end if; end process; end counter_arch;
封锁模块fs的程序段如下:
library ieee; use ieee.std_logic_1164.all;
entity fs is port(clk,clr:in std_logic; q: out std_logic); end fs; architecture behave of fs is
begin process (clk,clr) begin
if (clr='0') then q<='0'; elsif (clk'event and clk='1') then q<='1';
end if; end process; end behave;
消抖模块的程序段如下:
library ieee; use ieee.std_logic_1164.all;
entity dffwyy1 is
port(d1:in std_logic; clk1:in std_logic; q1: out std_logic); end dffwyy1; architecture behave of dffwyy1 is
begin process (clk1,d1) begin
if (rising_edge(clk1)) then q1<=d1; end if; end process; end behave;
library ieee; use ieee.std_logic_1164.all;
entity dffwyy2 is
port(d2:in std_logic; clk2:in std_logic; q2: out std_logic); end dffwyy2;
architecture behave of dffwyy2 is begin process (clk2,d2) begin
if (rising_edge(clk2)) then q2<=d2; end if; end process; end behave;
library ieee; use ieee.std_logic_1164.all;
entity dffwyy3 is
port(d3:in std_logic; clk3:in std_logic; q3: out std_logic); end dffwyy3; architecture behave of dffwyy3 is begin process (clk3,d3) begin
if (rising_edge(clk3)) then q3<=d3; end if; end process; end behave;
library ieee; use ieee.std_logic_arith.all;use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity fp1 is
port(clkfp1:in std_logic; count1:buffer std_logic_vector(18 downto 0);
fpq1:out std_logic); end fp1;
architecture fp1_arch of fp1 is begin process(clkfp1) begin
if(clkfp1'event and clkfp1='1')then if(count1=200000)then count1<=(others=>'0'); else count1<=count1+1;
if count1<100000 then fpq1<='0'; else fpq1<='1'; end if; end if;
end if; end process; end fp1_arch;
library ieee; use ieee.std_logic_arith.all; use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity qdou is port(keyin,clock:in std_logic; key1:out std_logic); end qdou; architecture behave of qdou is
component dffwyy1
port(d1:in std_logic; clk1:in std_logic; q1: out std_logic); end component; component dffwyy2
port(d2:in std_logic; clk2:in std_logic; q2: out std_logic); end component; component dffwyy3
port(d3:in std_logic; clk3:in std_logic; q3: out std_logic); end component; component fp1 port(clkfp1:in std_logic; fpq1:out std_logic); end component; signal clk,qo1,qo2,qo3:std_logic;
begin u1:dffwyy1 port map(keyin,clk,qo1); u2:dffwyy2 port map(qo1,clk,qo2); u3:dffwyy3 port map(qo2,clk,qo3); u4:fp1 port map(clock,clk);
key1<=qo1 and qo2 and qo3; end behave;
犯规控制模块dff2的程序段如下:
library ieee; use ieee.std_logic_1164.all;
entity dff2 is port(d1,d2,d3,d4,d5,d6:in std_logic; en:in std_logic;
q: out std_logic_vector(5 downto 0)); end dff2;
architecture behave of dff2 is
signal dff2q1,dff2q2,dff2q3,dff2q4,dff2q5,dff2q6: std_logic;
begin process (en,d1,d2,d3,d4,d5,d6,dff2q1,dff2q2,dff2q3,dff2q4,dff2q5,dff2q6) begin if (en='1') then dff2q1<='0'; elsif (d1'event and d1='1') then dff2q1<='1'; end if; if (en='1') then dff2q2<='0'; elsif (d2'event and d2='1') then dff2q2<='1'; end if; if (en='1') then dff2q3<='0'; elsif (d3'event and d3='1') then dff2q3<='1'; end if;
if (en='1') then dff2q4<='0'; elsif (d4'event and d4='1') then dff2q4<='1'; end if;
if (en='1') then dff2q5<='0'; elsif (d5'event and d5='1') then dff2q5<='1'; end if;
if (en='1') then dff2q6<='0'; elsif (d6'event and d6='1') then dff2q6<='1'; end if;
q<=dff2q1&dff2q2&dff2q3&dff2q4&dff2q5&dff2q6;
end process; end behave;
抢答控制模块dff1的程序段如下:
library ieee; use ieee.std_logic_1164.all;
entity dff1 is
port(d1,d2,d3,d4,d5,d6:in std_logic; q: out std_logic_vector(5 downto 0);
clk,clr:in std_logic; dffq1,dffq2,dffq3,dffq4,dffq5,dffq6: buffer std_logic); end dff1; architecture behave of dff1 is
begin process (clk,clr,d1,d2,d3,d4,d5,d6,dffq1,dffq2,dffq3,dffq4,dffq5,dffq6) begin if (clr='0')then
dffq1<='0'; dffq2<='0'; dffq3<='0'; dffq4<='0'; dffq5<='0'; dffq6<='0';
elsif (rising_edge(clk)) then
dffq1<=d1; dffq2<=d2; dffq3<=d3; dffq4<=d4; dffq5<=d5; dffq6<=d6;
end if; q<=dffq1&dffq2&dffq3&dffq4&dffq5&dffq6; end process; end behave; 七段译码器seg7的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity seg7 is
port(din:in std_logic_vector(5 downto 0);
sout: out std_logic_vector(6 downto 0));end seg7;
architecture ver3_arch of seg7 is
begin
with din select
sout<="0000110"when"100000", "1011011"when"010000", "1001111"when"001000","1100110"when"000100", "1101101"when"000010","1111101"when"000001",
"1110001"when others;
end ver3_arch;
选择输入模块对应的分频器fp500的程序段如下:
library ieee; use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity fp500 is
port(clk1:in std_logic; fpq:out std_logic); end fp500;
architecture fp_arch of fp500 is
signal count1: std_logic_vector(24 downto 0);
begin
process(clk1)
begin
if(clk1'event and clk1='1')then if(count1=20000)then count1<=(others=>'0');
else count1<=count1+1; if count1<10000 then fpq<='0'; else fpq<='1';
end if; end if; end if; end process; end fp_arch;。