当前位置:首页 > EDA课程设计--VHDL四路智力抢答器
VHDL四路智力抢答器EDA课程设计
一、任务与目的
1.1熟练掌握EDA工具软件Quartus的使用
1.2 熟悉使用VHDL硬件描述语言描述数字电路 1.3学会使用VHDL进行大规模集成电路设计
1.4学习使用CPLD/FPGA实验系统硬件验证电路设计的正确性 1.5初步掌握EDA技术并具备一定的可编程逻辑芯片的开发能力
二、设计题目与要求
2.1设计题目
四路智力竞赛抢答器 2.2设计要求
1.按所布置的题目要求,每一位学生独立完成全过程 2.分模块层次化的设计;
3.各功能模块的底层文件必须用VHDL语言设计,顶层文件可以用VHDL语言设计,也可以用原理图设计。 2.3设计内容
设计一个可容纳四组参赛者同时抢答的数字抢答器。主持人可控制系统发的清零和抢答的开始,控制电路可实现最快抢答选手按键抢答的判别和锁定功能,并禁止后续其他选手抢答。抢答选手确定后给出选手编号的显示,抢答选手的编号显示保持到系统被清零为止,若提前抢答则对相应的抢答组发出警告。
*扩展内容:增加答题限时的功能,在确定了抢答成功有效后,有主持人按下答题限时功
能键,开始9s的倒计时。在计时结束后,超时提示LED闪烁。在主持人按下clear开关时限时复位。
三、功能分析
四路智力竞赛抢答器按功能设计分为三个模块
1. 抢答锁存模块,在主持人发出抢答指令后(start=’1’),若有参赛者按下抢答按钮,则
显示器显示抢答组别,同时电路处于自锁状态,使其它组的抢答器不起作用。主持人可以用清零按钮进行清零(clr=’0’).若抢答指令未发出(start=’0’),而有参赛者按下抢答按钮,则发出警告信号(alm=1).
2. 显示功能模块,在参赛者抢答信号(组别)发出后,对参赛者信号进行译码,然后用
7段数码管显示出来。
3. 计时模块,在确定了抢答成功有效后,有主持人按下答题限时功能键,开始9s的倒
计时。在计时结束后,超时提示LED亮。在主持人按下clear开关时限时复位。(扩展模块)
四、设计思路分析,设计方案合理性分析与选择。
设计方案有两种:1.直接写一个程序,包括所要求的功能,
2.按功能模块分别写程序,然后用原理图联系起来. 方法1步骤简单,容易修改,对于多功能模块的设计,容易会造成思路混乱. 方法2对于多功能模块设计,思路清晰,但步骤较为复杂,且修改较为麻烦.
本次由于功能模块较多,我们采用方法二分模块设计。 此抢答器的输入信号有:各组抢答按钮A0,B0,C0,D0(低电平有效),清零端clr(低电平有效),抢答指令端start(高电平有效).时钟信号CLK。限时功能键time.
输出信号有:抢答信号(A,B,C,D)数码管显示信号(ao,bo,co,do,eo,fo,go),警告信号alm。时钟模块数码管显示信号at,bt,ct,dt,et,ft,gt.
五、源程序
LIBRARY IEEE;--抢答锁存模块+显示功能模块。 USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY QIANGDAQI IS
PORT(CLK,A0,B0,C0,D0:IN STD_LOGIC; start,clear:IN STD_LOGIC;
alm,A,B,C,D:OUT STD_LOGIC;
aO,bO,cO,dO,eO,fO,gO:OUT STD_LOGIC); END QIANGDAQI;
ARCHITECTURE behav OF QIANGDAQI IS
SIGNAL d_out7:STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL D1,D2,D3,D4:STD_LOGIC; BEGIN
PRO1: PROCESS(CLK,A0,B0,C0,D0,start,clear,D1,D2,D3,D4) BEGIN IF clear='0' D1<='0';D2<='0';D3<='0';D4<='0';A<='0';B<='0';C<='0';D<='0';alm<='0';ELSE IF (start='1') THEN
IF CLK'EVENT AND CLK='1' THEN IF (A0='0')AND NOT(D2='1' OR D3='1' OR D4='1') THEN D1<='1'; ELSIF( B0='0')AND NOT(D1='1' OR D3='1' OR D4='1') THEN D2<='1'; ELSIF( C0='0')AND NOT(D1='1' OR D2='1' OR D4='1') THEN D3<='1'; ELSIF( D0='0')AND NOT(D1='1' OR D2='1' OR D3='1') THEN D4<='1'; END IF; END IF; ELSIF CLK'EVENT AND CLK='1' THEN --警告 IF (A0='0')AND NOT(D2='1' OR D3='1' OR D4='1') THEN alm<='1'; ELSIF( B0='0')AND NOT(D1='1' OR D3='1' OR D4='1') THEN alm<='1'; ELSIF( C0='0')AND NOT(D1='1' OR D2='1' OR D4='1') THEN alm<='1'; ELSIF( D0='0')AND NOT(D1='1' OR D2='1' OR D3='1') THEN alm<='1'; END IF; END IF; A<=D1;B<=D2; C<=D3;D<=D4; END IF;
END PROCESS;
PRO2:process(D1,D2,D3,D4)--显示电路
THEN variable ASG:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF D1='1' THEN ASG:=\ ELSIF D2='1' THEN ASG:=\ ELSIF D3='1' THEN ASG:=\ ELSIF D4='1' THEN ASG:=\ ELSE ASG:=\ END IF; CASE ASG IS WHEN \显示0 WHEN \显示1 WHEN \显示2 WHEN \显示3 WHEN \显示4 WHEN OTHERS => d_out7 <=\ END CASE; aO<=d_out7(0); bO<=d_out7(1); cO<=d_out7(2); dO<=d_out7(3); eO<=d_out7(4); fO<=d_out7(5); gO<=d_out7(6); END PROCESS; END behav;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- LIBRARY IEEE; --计时功能模块+显示模块 USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY JISHI IS
PORT(CLK:IN STD_LOGIC; clr,time1:IN STD_LOGIC; alm2:OUT STD_LOGIC;
at,bt,ct,dt,et,ft,gt:OUT STD_LOGIC); END JISHI;
ARCHITECTURE behav OF JISHIIS
SIGNAL G:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL D:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNALdout:STD_LOGIC_VECTOR(6 D OWNTO 0); SIGNAL CLK1: STD_LOGIC; BEGIN
pro1:PROCESS(CLK,D,CLK1)--分频电路,CLK用250hz
BEGIN IF CLK'EVENT AND CLK='1' THEN IF D<249 THEN D<=D+1; ELSE D<=(OTHERS=>'0');CLK1<=NOT CLK1; END IF; END IF; END PROCESS;
Pro2:PROCESS(CLK1,time1)--计时电路1
VARIABLE G1:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
IF clr='0' THEN G1:=\ ELSIF time1 ='0' THEN G1:=\ ELSIF CLK1'EVENT AND CLK1='1' THEN IF NOT(G1=\ IF G1>0 THEN G1:=G1-1; END IF; ELSE alm2<='1'; END IF; END IF; G<=G1; END PROCESS;
pro3:PROCESS(G)--显示电路 BEGIN CASE G IS WHEN \显示0 WHEN \显示1 WHEN \显示2 WHEN \显示3 WHEN \显示4 WHEN \显示5 WHEN \显示6 WHEN \显示7 WHEN \显示8 WHEN \显示9 WHEN OTHERS =>NULL; END CASE; at<=dout(0); bt<=dout(1); ct<=dout(2); dt<=dout(3); et<=dout(4); ft<=dout(5); gt<=dout(6);
共分享92篇相关文档