EDA抢答器课程设计.docx
《EDA抢答器课程设计.docx》由会员分享,可在线阅读,更多相关《EDA抢答器课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
EDA抢答器课程设计
湖南工程学院
课程设计
课程名称嵌入式系统
课题名称基于CPLD的智力竞赛抢答器
专业电子信息工程
班级电子信息0703
学号************
姓名李涛
指导教师陈爱萍
2010年12月20日
湖南工程学院
课程设计任务书
课程名称:
嵌入式系统
题目:
基于CPLD的智力竞赛抢答器
专业班级:
电子信息0703
******
*******
审批:
任务书下达日期2010年12月20日
设计完成日期2010年12月31日
设计内容与设计要求
CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。
有关知识可参见相关教材或参考书。
一.设计内容
1.设计一智力竞赛抢答器,可同时供8名选手参加比赛。
2.给节目主持人设置一个控制开关,控制系统清零和抢答开始。
3.抢答器具有锁存功能和显示功能。
抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示选手编号,同时扬声器响,禁止其他选手抢答。
4.抢答器具有抢答定时功能,时间由主持人确定。
5.参赛选手在设定的时间内抢答有效,定时器停止工作。
6.如果定时时间到,无人抢答,本次抢答无效,系统报警,并封锁输入电路,禁止超时抢答,定时器显示00。
7.为每组设计一个计分电路,0~999分,可加分,也可减分。
二、设计要求:
1、设计思路清晰,给出整体设计框图;
2、设计各单元电路,完成其功能仿真和编译并生成低层模块;
3、完成顶层设计并编译通过;
4、完成设计下载并调试电路;
5、写出设计报告;
主要设计条件
1.提供EDA实验室;
2.提供EL实验箱和CPLD芯片;
3.提供设计软件
说明书格式
1.课程设计封面;
2.任务书;
3.说明书目录;
4.设计总体思路,基本原理和框图(顶层电路图);
5.单元电路设计(各次级模块电路图);
6.设计仿真;
7.编程下载;
8.总结与体会;
9.附录;
10.参考文献。
进度安排
星期一、二:
下达设计任务书,介绍课题内容与要求;
查找资料,确定总体设计方案和单元电路设计;
星期三~第二周星期一:
单元电路设计与仿真,硬件下载;
第二周星期二、三:
硬件下载;
第二星期四、五:
书写设计报告,打印相关图纸;答辩
参考文献
1.康华光主编.电子技术基础(数字部分),高等教育出版社。
2.阎石主编.电子技术基础(数字部分),清华大学出版社。
3.陈大钦主编,电子技术基础实验,高等教育出版社。
4.彭介华主编,电子技术课程设计指导,高等教育出版社。
5.张原编著,可编程逻辑器件设计及应用,机械工业出版社。
6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。
7.刘洪喜,陆颖编著.VHDL电路设计实用教程清华大学出版社
一、原理及总体框架………………………………………………1
二、各级模块设计及仿真…………………………………………1
1、抢答启动模块……………………………………………………1
(1)按键识别子模块………………………………………………1
(2)倒计时子模块…………………………………………………4
2、选手抢答模块……………………………………………………7
(1)单个选手按键子模块…………………………………………7
(2)判断抢答选手子模块…………………………………………9
3、加减分模块………………………………………………………12
(1)组别判断子模块………………………………………………12
(2)加减及寄存器子模块…………………………………………13
(3)分数选择输出模块……………………………………………16
4、显示模块…………………………………………………………17
5、蜂鸣器模块………………………………………………………19
三、实验箱的调试…………………………………………………20
四、总结与体会……………………………………………………22
五、参考文献………………………………………………………24
六、整机原理图……………………………………………………24
一、原理及总体框架
抢答器原理是根据所要设计的系统功能,将整个系统划分成几个主要模块,再将每个模块细分成几个子模块,直到最底层的小模块容易编程实现为止。
只需对底层元件编程实现,最后将各模块连接起来组成所需的系统。
对于一个抢答器系统,可将其分为五个模块:
选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。
整体框图如下:
其中抢答启动模块具有启动抢答及启动定时功能,输出使能信号给选手识别模块,以及抢答剩余时间给显示模块;选手识别模块完成锁存抢答信号的功能,并输出选手号给显示模块;蜂鸣器对抢答成功以及超时鸣声报警;显示模块对输入的数据进行显示。
二、各级模块设计
1、抢答启动模块
启动模块除了有启动的功能外,还有启动定时的功能。
定时时间分为5秒和20秒两种,使用两个按键对应两种限时抢答。
将本模块再划分为2个子模:
一个模块完成按键识别的功能,另一模块完成倒计时功能。
1)按键识别子模块
按键的识别即对输入信号进行电平变化检测,电平发生跳变就认为是键被按下。
但VHDL程序中一个结构体内不能同时对两个信号进行电平跳变的检测,所以对本模块的程序设计采用状态机来实现,并使用统一的时钟信号来扫描按键的电平状态。
模块图如下:
对START5和START20两个按键定义三种状态,START5按下为ST1状态,此时两个按键“START5&START20”输入电平为“01”;START20按下为ST2状态,此时电平为“10”;两个都没按下为ST0状态,此时电平为“11”。
状态转换图如图所示。
本模块程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSTART_5_20IS
PORT(CLK1,RST,START5,START20:
INSTD_LOGIC;
B,A:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出定时初值
S_FLAG:
OUTSTD_LOGIC);--置数信号
ENDENTITY;
ARCHITECTUREONEOFSTART_5_20IS
SIGNALDATAIN:
STD_LOGIC_VECTOR(1DOWNTO0);
TYPEST_TYPEIS(ST0,ST1,ST2);--定义状态
SIGNALC_ST:
ST_TYPE;
BEGIN
DATAIN<=START5&START20;--两个输入信号放在一起判断
PROCESS(RST,CLK1)
BEGIN
IFRST='0'THEN--复位
B<="0000";A<="0000";C_ST<=ST0;S_FLAG<='0';
ELSIFCLK1'EVENTANDCLK1='1'THEN
CASEC_STIS
WHENST0=>IFDATAIN="01"THEN
C_ST<=ST1;--输入信号为01,转ST1状态
S_FLAG<='1';--置数信号有效
B<="0000";A<="0101";--定时初值“05”
ELSIFDATAIN="10"THEN
C_ST<=ST2;--输入信号为10,转ST1状态
S_FLAG<='1';--置数信号有效
B<="0011";A<="0000";--定时初值“30”
ELSEC_ST<=ST0;--输入信号为11,保持ST0状态
ENDIF;
WHENST1=>IFDATAIN="11"THEN
C_ST<=ST0;--防按键抖动,为11时才转ST0状态
S_FLAG<='0';--置数信号无效
ELSEC_ST<=ST1;--按键没弹起,继续等待
ENDIF;
WHENST2=>IFDATAIN="11"THENC_ST<=ST0;S_FLAG<='0';
ELSEC_ST<=ST2;
ENDIF;
WHENOTHERS=>C_ST<=ST0;B<="0000";A<="0000";
ENDCASE;
ENDIF;
ENDPROCESS;
ENDARCHITECTURE;
本模块仿真波形如图所示。
图4按键识别模块仿真波形
2)倒计时子模块
倒计时需要1Hz的脉冲输入,每来一个上升沿,进行一次减一运算,将结果输出到TIMEB、TIMEA;置数信号LOAD输入有效,读入B、A端口的数据;输入L_CR信号与选手识别模块连接,当选手抢答成功后,L_CR信号为0,将倒计时清0.;若倒计时到,没有选手抢答,则在SR1输出1使扬声器发声。
同时输出信号给选手抢答模块,禁止选手抢答。
本模块程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDE_COUNTIS
PORT(CLK2,LOAD,L_CR,RST:
INSTD_LOGIC;
B,A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
TIMEB,TIMEA:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
TIMEOUT,SR1:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTURETWOOFDE_COUNTIS
BEGIN
PROCESS(LOAD,L_CR,RST,CLK2)
VARIABLEP1,P0:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFLOAD='1'THEN
P1:
=B;P0:
=A;--指数信号有效,将B、A值读入P1、P0
ELSIFL_CR='0'THEN--有选手抢答成功,L_CR输入为0,定时时间清0
P1:
="0000";P0:
="0000";TIMEOUT<='0';SR1<='1';
ELSIFRST='0'THENP1:
="0000";P0:
="0000";TIMEOUT<='0';SR1<='0';
ELSIF(CLK2'EVENTANDCLK2='1')THEN
IFP0="0000"THEN
IFP1>0THEN
P1:
=P1-1;P0:
="1001";--若个位为0,十位减1,个位赋为9
ENDIF;
ELSEP0:
=P0-1;--若个位不为0,个位直接减一
IFP0="0000"ANDP1="0000"THEN
TIMEOUT<='0';SR1<='1';--若时间到,输出锁存信号
ENDIF;
ENDIF;
ENDIF;
TIMEB<=P1;TIMEA<=P0;
ENDPROCESS;
ENDARCHITECTURE;
程序中,因为每次减一后的时间值需要保存,用于下次继续减一,所以程序中使用了不完整的IF语句引入寄存器,用于保存每次减一后的时间值。
P1、P0定义为变量而不是信号的原因是,变量的赋值是即时的,减一后可以马上进行判断;若定义为信号,不能即时进行判断,并且减一操作后的赋值要经过一个δ延时,程序不好控制。
本模块仿真波形如图所示:
图6倒计时模块仿真波形
用元件例化语句将以上两个子模块组合,得到整个抢答启动模块。
如下图所示:
两个子模块组合的程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSTARTERIS
PORT(CLK1,CLK2,L_CR,RST,START5,START20:
INSTD_LOGIC;
TIMEB,TIMEA:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
TIMEOUT,SR1:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTURETHREEOFSTARTERIS
COMPONENTSTART_5_20IS--调用元件START_5_20声明
PORT(CLK1,RST,START5,START20:
INSTD_LOGIC;
B,A:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
S_FLAG:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTDE_COUNTIS--调用元件DE_COUNT声明
PORT(CLK2,LOAD,L_CR,RST:
INSTD_LOGIC;
B,A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
TIMEB,TIMEA:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
TIMEOUT,SR1:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALm,n:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALp:
STD_LOGIC;--对应图7中的中间信号
BEGIN--按照图7将两个元件连接起来
U1:
START_5_20PORTMAP(CLK1=>CLK1,START5=>START5,START20=>START20,
RST=>RST,B=>m,A=>n,S_FLAG=>p);
U2:
DE_COUNTPORTMAP(CLK2=>CLK2,B=>m,A=>n,LOAD=>p,RST=>RST,
L_CR=>L_CR,TIMEB=>TIMEB,TIMEA=>TIMEA,
TIMEOUT=>TIMEOUT,SR1=>SR1);
ENDARCHITECTURE;
2、选手抢答模块
在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,所以将本模块划分为两个子模块:
单个选手按键模块和判断抢答选手模块。
最后将8个选手按键模块和1个判断抢答选手模块连接起来,得到整个选手抢答模块。
1)单个选手按键子模块
按键输入相当于该实体的时钟信号,键被按下,等于来一个脉冲,输出信号给判断模块进行选手号的判断。
只要有选手抢答成功,相关模块会输出信号使8个按键模块的LOCK信号有效,禁止其他选手抢答。
如图所示。
本模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYBUTTON1IS
PORT(LOCK,BUTTON,RST:
INSTD_LOGIC;
PRESSED:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREB1OFBUTTON1IS
BEGIN
PROCESS(RST,BUTTON)--使用进程时刻监测RST、BUTTON信号
BEGIN
IFRST='0'THEN
PRESSED<='0';--复位
ELSIFBUTTON'EVENTANDBUTTON='0'THEN
IFLOCK='1'THEN--键被按下并且LOCK信号无效
PRESSED<='1';--则输出信号给判断模块
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTURE;
图9倒计时模块仿真波形
2)判断抢答选手子模块
本子模块接收8个按键子模块的输出信号,如收到1号子模块输出的高电平,则输出选手号“0001”;并发出信号使扬声器发声并控制8个按键子模块使它们的LOCK信号有效,禁止其他选手抢答。
本子模块端口设置如图所示。
本子模块程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYIDENTIFIERIS
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:
INSTD_LOGIC;
P_NUM:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
LOCK,SR1:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREONEOFIDENTIFIERIS
SIGNALP:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
P<=PP8&PP7&PP6&PP5&PP4&PP3&PP2&PP1;--8个输入放在一起判断
PRO1:
PROCESS(P)--输入若发生变化,马上启动进程进行判断
BEGIN
CASEPIS
WHEN"00000001"=>P_NUM<="0001";LOCK<='0';SR1<='1';--1号选手
WHEN"00000010"=>P_NUM<="0010";LOCK<='0';SR1<='1';--2号选手
WHEN"00000100"=>P_NUM<="0011";LOCK<='0';SR1<='1';--3号选手
WHEN"00001000"=>P_NUM<="0100";LOCK<='0';SR1<='1';--4号选手
WHEN"00010000"=>P_NUM<="0101";LOCK<='0';SR1<='1';--5号选手
WHEN"00100000"=>P_NUM<="0110";LOCK<='0';SR1<='1';--6号选手
WHEN"01000000"=>P_NUM<="0111";LOCK<='0';SR1<='1';--7号选手
WHEN"10000000"=>P_NUM<="1000";LOCK<='0';SR1<='1';--8号选手
WHENOTHERS=>P_NUM<="0000";LOCK<='1';SR1<='0';
ENDCASE;
ENDPROCESS;
ENDARCHITECTURE;
图11判断抢答选手模块仿真波形
所以将以上两个子模块用元件例化语句连接起来,组成整个选手抢答模块,如下图所示。
实现程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYBUTTONIS
PORT(P1,P2,P3,P4,P5,P6,P7,P8,RST,LOCK:
INSTD_LOGIC;
P_NUM:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
LOCK_S,SR1:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREBB1OFBUTTONIS
COMPONENTBUTTON1IS--调用元件BUTTON1声明
PORT(LOCK,B,RST:
INSTD_LOGIC;
PRESSED:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTIDENTIFIERIS--调用元件IDENTIFIER声明
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:
INSTD_LOGIC;
P_NUM:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
LOCK,SR1:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALa1,a2,a3,a4,a5,a6,a7,a8:
STD_LOGIC;--定义图12中的中间信号
BEGIN--按照图12将两个元件连接起来
U1:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P1,RST=>RST,PRESSED=>a1);
U2:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P2,RST=>RST,PRESSED=>a2);
U3:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P3,RST=>RST,PRESSED=>a3);
U4:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P4,RST=>RST,PRESSED=>a4);
U5:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P5,RST=>RST,PRESSED=>a5);
U6:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P6,RST=>RST,PRESSED=>a6);
U7:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P7,RST=>RST,PRESSED=>a7);
U8:
BUTTON1PORTMAP(LOCK=>LOCK,B=>P8,RST=>RST,PRESSED=>a8);
U9:
IDENTIFIERPORTMAP(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);
ENDARCHITECTURE;
3、加减分模块
加减分模块要识别按下的按键:
加5分按键及减5分按键。
所以采用状态机的方法来识别。
将本模块划分为三个子模块:
组别判断子模块,加减及寄存器子模块,分数选择输出子模块。
1)组别判断子模块
该模块要实现的功能是根据抢答成功的选手编号,判断出该选手属于哪组,并输出使能信号允许该组的分数寄存器进行加减操作。
如图所示。
实现程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECODEIS
PORT(CLK:
INSTD_LOGIC;
P_NUM:
INSTD_LOGIC_VECTOR(3DOWNTO0);
EN1,EN2,EN3,EN4:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREONEOFDECODEIS
SIGNALE:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)--引入时钟信号,协调各部分电路的工作
BEGIN
IFCLK'EVENTANDCLK='1'THEN
CASEP_NUMIS
WHEN"0001"=>E<="0001";WHEN"0