《EDA课程设计报告-基于CPLD的智力竞赛抢答器(共26页).doc》由会员分享,可在线阅读,更多相关《EDA课程设计报告-基于CPLD的智力竞赛抢答器(共26页).doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上目录专心-专注-专业一、总体思路CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。 智力竞赛抢答器,分为5个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。选手抢答模块显示模块(抢答剩余时间、抢答选手号、选手得分)选手得分)加减分模块抢答启动模块蜂鸣器控制模块图(一)总体框图抢答启动模块包括:复位和记时,用于启动抢答和启动定时。输出信号给选手识别模块,并显示剩余时间。选手抢答模块具有识别与锁存功能,并输出选手号给显示模块。加减分模块用于存储各个
2、选手的分数,并输出给显示模块。蜂鸣器控制模块则对超时和抢答成功鸣声报警。显示模块用于输出抢答剩余时间、抢答模块、选手得分。二、各级模块设计1、抢答启动模块抢答启动模块由控制抢答启动的复位键和控制定时的两个定时启动键。定时时间为5秒和20秒两种,分别由两个键控制。主持人按下复位键启动抢答,并完成置数。定时启动键则在置数信号有效的情况下,读入定时初值,进行减1操作,开始倒计时。本模块程序:抢答启动LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 IS PORT(CLK
3、1,RST,START5,START20:IN STD_LOGIC; B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -输出定时初值 S_FLAG:OUT STD_LOGIC); -置数信号END ENTITY;ARCHITECTURE ONE OF START_5_20 ISSIGNAL DATAIN:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS (ST0,ST1,ST2); -定义状态SIGNAL C_ST:ST_TYPE;BEGINDATAIN=START5&START20; -两个输入信号放在一起判断 PROCES
4、S(RST,CLK1)BEGINIF RST=0 THEN -复位B=0000;A=0000;C_ST=ST0;S_FLAG IF DATAIN=01 THEN C_ST=ST1; -输入信号为01,转ST1状态S_FLAG=1; -置数信号有效B=0000;A=0101; -定时初值“05”ELSIF DATAIN=10 THEN C_ST=ST2; -输入信号为10,转ST1状态S_FLAG=1; -置数信号有效B=0010;A=0000; -定时初值“20” ELSE C_STIF DATAIN=11 THENC_ST=ST0;-防按键抖动,为11时才转ST0状态S_FLAG=0; -置
5、数信号无效 ELSE C_STIF DATAIN=11 THEN C_ST=ST0;S_FLAG=0;ELSE C_STC_ST=ST0;B=0000;A=0000;END CASE;END IF;END PROCESS;END ARCHITECTURE;定时控制LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC; B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); T
6、IMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT ISBEGINPROCESS(LOAD,L_CR,RST,CLK2)VARIABLE P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF LOAD=1 THENP1:=B;P0:=A; -指数信号有效,将B、A值读入P1、P0ELSIF L_CR=0 THEN -有选手抢答成功,L_CR输入为0,定时时间清0P1:=0000;P0:=000
7、0;TIMEOUT=0;SR1=1; ELSIF RST=0 THEN P1:=0000;P0:=0000;TIMEOUT=0;SR10 THENP1:=P1-1;P0:=1001; -若个位为0,十位减1,个位赋为9END IF;ELSE P0:=P0-1; -若个位不为0,个位直接减一IF P0=0000 AND P1=0000 THENTIMEOUT=0;SR1=1; -若时间到,输出锁存信号END IF;END IF;END IF;TIMEB=P1;TIMEA=P0;END PROCESS;END ARCHITECTURE;实现两个子模块组合LIBRARY IEEE;USE IEEE.
8、STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC; B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0); TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT ISBEGINPROCESS(LOAD,L_CR,RST,CLK2)VARIABLE
9、 P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF LOAD=1 THENP1:=B;P0:=A; -指数信号有效,将B、A值读入P1、P0ELSIF L_CR=0 THEN -有选手抢答成功,L_CR输入为0,定时时间清0P1:=0000;P0:=0000;TIMEOUT=0;SR1=1; ELSIF RST=0 THEN P1:=0000;P0:=0000;TIMEOUT=0;SR10 THENP1:=P1-1;P0:=1001; -若个位为0,十位减1,个位赋为9END IF;ELSE P0:=P0-1; -若个位不为0,个位直接减一IF P0=000
10、0 AND P1=0000 THENTIMEOUT=0;SR1=1; -若时间到,输出锁存信号END IF;END IF;END IF;TIMEB=P1;TIMEA=P0;END PROCESS;END ARCHITECTURE;抢答启动子模块仿真如下:图(二)抢答定时子模块仿真如下:图(三)整个模块仿真如下图:图(四)2、选手抢答模块选手有8名,在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,因为若出现检测上升沿或下降沿的语句,编译软件会认为所检测的信号为实体的时钟信号,而一个实体只允许用一个时钟信号控制。故可将本模块分为两部分:单个选手按键和判断抢答。将8位选手按键模
11、块和判断选手连接起来得到整个选手抢答模块。本模块程序如下:单个选手按键模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON1 ISPORT(LOCK , BUTTON , RST :IN STD_LOGIC; PRESSED:OUT STD_LOGIC);END ENTITY;ARCHITECTURE B1 OF BUTTON1 ISBEGINPROCESS(RST , BUTTON) -使用进程时刻监测RST、BUTTON信号BEGINIF RST=0 THENPRESSED=0; -复位ELSIF BUTTONEVENT AND
12、BUTTON=0 THENIF LOCK=1 THEN -键被按下并且LOCK信号无效PRESSED=1; -则输出信号给判断模块END IF;END IF;END PROCESS;END ARCHITECTURE;判断选手模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IDENTIFIER ISPORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC; P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); LOCK,SR1:OUT STD_LOGIC);END ENTITY
13、;ARCHITECTURE ONE OF IDENTIFIER ISSIGNAL P:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPP_NUM=0001;LOCK=0;SR1P_NUM=0010;LOCK=0;SR1P_NUM=0011;LOCK=0;SR1P_NUM=0100;LOCK=0;SR1P_NUM=0101;LOCK=0;SR1P_NUM=0110;LOCK=0;SR1P_NUM=0111;LOCK=0;SR1P_NUM=1000;LOCK=0;SR1P_NUM=0000;LOCK=1;SR1LOCK,B=P1,RST=RST,PRESSED=a1); U2
14、:BUTTON1 PORT MAP(LOCK=LOCK,B=P2,RST=RST,PRESSED=a2); U3:BUTTON1 PORT MAP(LOCK=LOCK,B=P3,RST=RST,PRESSED=a3); U4:BUTTON1 PORT MAP(LOCK=LOCK,B=P4,RST=RST,PRESSED=a4); U5:BUTTON1 PORT MAP(LOCK=LOCK,B=P5,RST=RST,PRESSED=a5); U6:BUTTON1 PORT MAP(LOCK=LOCK,B=P6,RST=RST,PRESSED=a6); U7:BUTTON1 PORT MAP(LO
15、CK=LOCK,B=P7,RST=RST,PRESSED=a7); U8:BUTTON1 PORT MAP(LOCK=LOCK,B=P8,RST=RST,PRESSED=a8); U9:IDENTIFIER PORT MAP(PP1=a1,PP2=a2,PP3=a3,PP4=a4,PP5=a5,PP6=a6, PP7=a7,PP8=a8,P_NUM=P_NUM,LOCK=LOCK_S,SR1=SR1);END ARCHITECTURE;单个选手按键模块仿真图如下:图(五)判断选手抢答模块仿真图如下:图(六)整个模块仿真图如下:图(七)3、加减分模块加减分模块分别由加5分按键与减5分按键控制,采
16、用状态识别机的方式来识别。抢答选手有8位,若每一个选手都分配一个寄存器来保存分数,每个人的分数有3位数,每个数用4位二进制表示,那么8个选手的分数需要12*8=96根线输出,加上其它的管脚,将可能超过一个FPGA芯片可用的管教数,编译时就会报错。故采用分组的方法把8个选手依次分成4组,每组两个人。分数以组的单位分配,抢答成功时只显示组的分数。本模块由三个子模块组成:组别判断子模块,加减分寄存器子模块,分数选择输出子模块。组别判断模块根据抢答成功的选手编号,判断出该选手属于哪组,并输出使能信号允许该组的分数寄存器进行加减操作。加减分寄存器用状态机来识别,状态机状态的转换由CLK信号来控制。只有在
17、EN信号有效的情况下,加分或减分按键的按下才会起作用。每次加5分或减5分。分数选择输出模块只显示当前抢答成功选手分数,使用3个7段数码管显示。本模块程序:组别判断LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODE IS PORT(CLK:IN STD_LOGIC; P_NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0); EN1,EN2,EN3,EN4:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF DECODE IS SIGNAL E:STD_LOGIC_VECTOR(3
18、 DOWNTO 0);BEGIN PROCESS(CLK) -引入时钟信号,协调各部分电路的工作BEGINIF CLKEVENT AND CLK=1 THEN CASE P_NUM ISWHEN 0001=EEEEEEEEE=0000; -其他情况则四个分数锁存器都不工作 END CASE;END IF; END PROCESS; EN4=E(3);EN3=E(2);EN2=E(1);EN1=E(0);END ARCHITECTURE;加减分寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;E
19、NTITY COUNTER1 IS PORT(CLK,EN:IN STD_LOGIC; ADD,SUB:IN STD_LOGIC; AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF COUNTER1 ISSIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS (ST0,ST1,ST2);SIGNAL C_ST:ST_TYPE;BEGINAIF A=01 THEN -A为“01”,说明ADD按下 C_ST=ST1; -下一状态转ST1,以等待按
20、键弹起IF P0=0101 THEN P0:=0000; -若个位为5,加5后变为0,高位进1IF P1=1001 THEN P1:=0000; -十位为9,进1为0,再向百位进1IF P2=1001 THENP2:=0000;-百位为9,进一为0ELSE P2:=P2+1;-百位不为9,百位加1END IF;ELSE P1:=P1+1; -十位不为9,加一END IF;ELSE P0:= 5; -个位不为5,个位变为5END IF; ELSIF A=10 THEN -A为“10”,说明SUB按下 C_ST=ST2; -下一状态转ST2,以等待按键弹起IF (P2/=0 OR P1/=0 OR
21、 P0/=0) THENIF P0=0000 THEN P0:=0101;-若个位为0,加5后变为5,高位借1IF P1=0000 THEN P1:=1001;-十位为0,借1后为9,向百位借1 P2:=P2-1; -十位向百位借1ELSE P1:=P1-1;-十位不为0,直接减1END IF;ELSE P0:=0000;-个位为5,则个位直接清0END IF; END IF; ELSE C_STIF A=11 THEN A为“11”,说明按键弹起C_ST=ST0; -回到ST0继续监视按键 ELSE C_STIF A=11 THEN A为“11”,说明按键弹起C_ST=ST0; -回到ST0
22、继续监视按键 ELSE C_STC_ST=ST0;END CASE;END IF;END IF;AA2=P2;AA1=P1;AA0D2=AA2;D1=AA1;D0D2=AA2;D1=AA1;D0D2=BB2;D1=BB1;D0D2=BB2;D1=BB1;D0D2=CC2;D1=CC1;D0D2=CC2;D1=CC1;D0D2=DD2;D1=DD1;D0D2=DD2;D1=DD1;D0D2=0000;D1=0000;D0=0000; END CASE; END PROCESS;END ARCHITECTURE;组别判断子模块仿真图如下:图(八)加减分寄存器仿真图如下:图(九)分数输出模块仿真图如
23、下:图(十)4、显示模块显示模块显示分3部分分别显示:抢答成功选手号,选手分数、倒计时时间。选手号有一个7段数码管显示,选手分数由三个7段数码管显示,倒计显示也由两个数码管显示。本模块程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY ISPORT(CLK:IN STD_LOGIC; SCORE2,SCORE1,SCORE0,P_NUMBER,TIMEB,TIMEA:IN STD_LOGIC_VECTOR(3 DOWNTO 0); BT,SG:OUT STD_L
24、OGIC_VECTOR(7 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF DISPLAY ISSIGNAL CNT8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P1:PROCESS(CLK) BEGINIF CLKEVENT AND CLK=1 THEN -时钟信号一来,显示下一位CNT8BT=;ABT=;ABT=;ABT=;ABT=;ABT=;ABT=;ABT=;ASGSGSGSGSGSGSGSGSGSGSGNULL;END CASE;END PROCE
25、SS;END ARCHITECTURE;显示模块仿真如下:图(十一)此图表示四号选手抢答成功,分数为 265,剩余时间为十七秒。5、蜂鸣器当定时时间带或有选手抢答成功时,SR1输出信号给蜂鸣器,时钟信号驱动蜂鸣器发声。本模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKER IS PORT(CLK1,SR1,CLK2:IN STD_LOGIC; S:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF SPEAKER ISTYP
26、E ST_TYPE IS (ST0,ST1);SIGNAL C_ST:ST_TYPE;SIGNAL A:STD_LOGIC;BEGIN PROCESS(CLK1) VARIABLE P:STD_LOGIC_VECTOR(7 DOWNTO 0);-P用于定时,使蜂鸣器发声持续BEGINIF CLK1EVENT AND CLK1=1 THENCASE C_ST ISWHEN ST0=IF SR1=1 THEN -SR1信号有上升沿P:=;C_ST=ST1;A=1;-蜂鸣器发声,开始定时 ELSE C_ST=ST0;AIF P/=0 THEN -定时还没到,等待P:=P-1;C_ST=ST1; EL
27、SEA=0; -定时到,蜂鸣器停止发声IF SR1=1 THEN C_ST=ST1; -等待系统复位 ELSE C_STC_ST=ST0;A=0;END CASE;END IF;END PROCESS;S=CLK2 AND A; -只有A为1时,蜂鸣器才发声END ARCHITECTURE;模块仿真图如下:图(十二)当SR1为上升沿时,S输出信号给蜂鸣器,并且持续一段时间。三、调试步骤1、我们写好程序保存好,点击按钮“Start compilation”对程序进行编译。编译成功后,新建波形文件,设置好输入输出引脚,生成仿真文件。各个子模块都编译成功生成波形文件,并生成了相应的符号。采用原理图设
28、计方法 实现总系统。首先新建文件FileNew,选择“Block Diagram/Schematic File”,打开原理图编辑窗口。接着在编辑窗口空白处右击选择“InsertSymbol”,找到已经创建的各个模块的符号所在的文件夹,选择符号。各个模块的符号创建好,选择 “InsertSymbol”后,在搜索栏输入“input”和“output”,插入相应的输入输出引脚。最后连接好原理图,保存并编译。2、进入调试阶段的首先分配好管脚,进入Quartus菜单栏中选择“Assignments”“Pin Planner”,根据实验箱中元件与CPLD芯片管脚的就近关系来选择管脚。3、选择试验箱右下角的
29、16个指拨开关的第一排为8个选手的抢答按键。第二排从左至右依次为加5分键、减5分键、复位键、20秒倒计时键 和5秒倒计时键。4、因为开关的按下的电平抖动非常大,所以当扫描按键的时钟频率过高时,会使电路出现错误动作。这里将用于数码管扫描显示的频率和扫描按键输入的频率都连到735Hz。用于倒计时的时钟频率应为1Hz。5、管脚分配完毕后,重新编译。将试验箱用USB线连接到电脑,并安装驱动程序。安装成功后,在Quartus菜单栏中“Tools”“Programmer”,准备下载程序到芯片上。检查“Hardware Setup”栏是否显示“USB”,是则表示实验箱与电脑连接成功,否则为失败,不能进行调试,需重新安装。点击“START”按钮,下载程序,下载完并调试。6、调试开关全部置“1”。按下复位键,开始抢答。此时数码管各个模块显示都为“0”。按下倒记时20秒键,启动记时,抢答开始。若3号选手于10秒钟时抢答成功,蜂鸣器发声,显示模块上显示为“3 000 10”。此时假如按下其他选手抢答键,显示模块不会显示,说明抢答电路已锁。假若3号选手答对了则加5分,此时数码管显示为“3 005 10”。答题完毕,再次按下复位键,准备下次抢答。如若按下记时按键,倒计时完结时仍然无人抢答,在显示管倒计时出显示为“00”时蜂鸣器发声,报警提示。
限制150内