资源描述
课程设计说明书 NO. 20设计题目:抢答器的设计与仿真一课程设计的目的EDA课程设计是电子信息科学与技术专业开设的一门独立实践环节课程。通过课程设计使学生具体掌握将理论知识与实际应用相结合的方法,提高分析问题和解决问题的能力,激发学习兴趣、锻炼动手能力和科研能力。了解CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。二设计方案论证1. 设计原理抢答器原理是根据所要设计的系统功能,将整个系统划分成几个主要模块,再将每个模块细分成几个子模块,直到最底层的小模块容易编程实现为止。只需对底层元件编程实现,最后将各模块连接起来组成所需的系统。对于一个抢答器系统,可将其分为五个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块,整体框图如图(1)所示。 图(1)总体框图其中抢答启动模块具有启动抢答及启动定时功能,输出使能信号给选手识别模块,以及抢答剩余时间给显示模块;选手识别模块完成锁存抢答信号的功能,并输出选手号给显示模块;蜂鸣器对抢答成功以及超时鸣声报警;显示模块对输入的数据进行显示。2. 设计内容(1)设计一智力竞赛抢答器,可同时供8名选手参加比赛。(2)给节目主持人设置一个控制开关,控制系统清零和抢答开始。(3)抢答器具有锁存功能和显示功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示选手编号,同时扬声器响,禁止其他选手抢答。(4)抢答器具有抢答定时功能,时间由主持人确定。(5)参赛选手在设定的时间内抢答有效,定时器停止工作。(6)如果定时时间到,无人抢答,本次抢答无效,系统报警,并封锁输入电路,禁止超时抢答,定时器显示00 。(7)为每组设计一个计分电路,0999分,可加分,也可减分。3. 设计整体原理图 图(2)设计原理图三设计结果与分析1、抢答启动模块启动模块除了有启动的功能外,还有启动定时的功能。定时时间分为5秒和20秒两种,使用两个按键对应两种限时抢答。将本模块再划分为2个子模:一个模块完成按键识别的功能,另一模块完成倒计时功能。(1)按键识别子模块按键的识别即对输入信号进行电平变化检测,电平发生跳变就认为是键被按下。但VHDL程序中一个结构体内不能同时对两个信号进行电平跳变的检测,所以对本模块的程序设计采用状态机来实现,并使用统一的时钟信号来扫描按键的电平状态。模块如图(3)所示。 图(3)按键识别子模块对START5和START20两个按键定义三种状态,START5按下为ST1状态,此时两个按键“START5&START20”输入电平为“01”;START20按下为ST2状态,此时电平为“10”;两个都没按下为ST0状态,此时电平为“11”。状态转换图如图(4)所示。 图(4)按键识别子模块状态转换图本模块程序为:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 ISPORT(CLK1,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; PROCESS(RST,CLK1)BEGINIF RST=0 THEN B=0000;A=0000;C_ST=ST0;S_FLAG IF DATAIN=01 THEN C_ST=ST1; S_FLAG=1; B=0000;A=0101; ELSIF DATAIN=10 THEN C_ST=ST2; S_FLAG=1; B=0011;A=0000; ELSE C_STIF DATAIN=11 THENC_ST=ST0;S_FLAG=0; 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;本模块仿真波形如图(5)所示。 图(5)按键识别子模块仿真波形(2)倒计时子模块倒计时需要1Hz的脉冲输入,每来一个上升沿,进行一次减一运算,将结果输出到TIMEB、TIMEA;置数信号LOAD输入有效,读入B、A端口的数据;输入L_CR信号与选手识别模块连接,当选手抢答成功后,L_CR信号为0,将倒计时清0.;若倒计时到,没有选手抢答,则在SR1输出1使扬声器发声。同时输出信号给选手抢答模块,禁止选手抢答如图(6)所示。图(6)倒计时模块本模块程序为: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); 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 P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF LOAD=1 THENP1:=B;P0:=A; ELSIF L_CR=0 THEN P1:=0000;P0:=0000;TIMEOUT=0;SR1=1; ELSIF RST=0 THEN P1:=0000;P0:=0000;TIMEOUT=0;SR10 THENP1:=P1-1;P0:=1001; END IF;ELSE P0:=P0-1; IF P0=0000 AND P1=0000 THENTIMEOUT=0;SR1=1; END IF;END IF;END IF;TIMEB=P1;TIMEACLK1,START5=START5,START20=START20,RST=RST,B=m,A=n,S_FLAG=p); U2:DE_COUNT PORT MAP(CLK2=CLK2,B=m,A=n,LOAD=p,RST=RST,L_CR=L_CR,TIMEB=TIMEB,TIMEA=TIMEA,TIMEOUT=TIMEOUT,SR1=SR1);END ARCHITECTURE;2、选手抢答模块在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,所以将本模块划分为两个子模块:单个选手按键模块和判断抢答选手模块。最后将8个选手按键模块和1个判断抢答选手模块连接起来,得到整个选手抢答模块。(1)单个选手按键子模块按键输入相当于该实体的时钟信号,键被按下,等于来一个脉冲,输出信号给判断模块进行选手号的判断。只要有选手抢答成功,相关模块会输出信号使8个按键模块的LOCK信号有效,禁止其他选手抢答。如图(8)所示。 图(8)单个选手按键子模块本模块程序如下: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) BEGINIF RST=0 THENPRESSED=0; ELSIF BUTTONEVENT AND BUTTON=0 THENIF LOCK=1 THEN PRESSED=1; END IF;END IF;END PROCESS;END ARCHITECTURE;单个选手模块仿真波形如图(9)所示。 图(9)单个选手按键子模块仿真波形(2)判断抢答选手子模块本子模块接收8个按键子模块的输出信号,如收到1号子模块输出的高电平,则输出选手号“0001”;并发出信号使扬声器发声并控制8个按键子模块使它们的LOCK信号有效,禁止其他选手抢答。本子模块端口设置如图(10)所示。 图(10)判断选手模块本子模块程序如下: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;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: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(LOCK=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.分数选择输出模块四组分数要显示出来,需要12个7段数码管。若只显示当前抢答成功选手的分数,则只需3个数码管。所以设置一个分数选择器,根据抢答成功的选手编号,选择其分数输出给显示模块显示。设计源程序为:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUXX IS PORT(P_NUM,AA2,AA1,AA0,BB2,BB1,BB0:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CC2,CC1,CC0,DD2,DD1,DD0:IN STD_LOGIC_VECTOR(3 DOWNTO 0); D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF MUXX ISBEGIN PROCESS(P_NUM) BEGIN CASE P_NUM ISWHEN 0001=D2=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;仿真波形如图(13)所示。 图(13)分数选择输出模块仿真波形4.显示模块本模块根据送来的数据:抢答成功选手号,选手分数、倒计时时间,将相应的字形码送数码管显示。端口设置如图(14)所示。该图中,BT为数码管的位选信号,SG为数码管的段选信号。另外图20为数码管的分配。左起第一位为选手编号,第3、4位为该选手的分数,最后两位为倒计时。 图(14)显示模块设计程序如下: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_LOGIC_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=10000000;ABT=01000000;ABT=00100000;ABT=00010000;ABT=00001000;ABT=00000100;ABT=00000010;ABT=00000001;ASGSGSGSGSGSGSGSGSGSGSGNULL;END CASE;END PROCESS;END ARCHITECTURE;本模块仿真波形如图(15)所示。 图(15)显示模块仿真波形5.蜂鸣器模块当SR1鸣声信号来时,输出CLK2(2KHz)驱动蜂鸣器发声。CLK1用于扫描SR1的电平变化,SR1上升沿来到,允许CLK2输出,并持续一段时间。模块如图(16)所示。图(16)蜂鸣器模块本模块程序如下: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 ISTYPE 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);BEGINIF CLK1EVENT AND CLK1=1 THENCASE C_ST ISWHEN ST0=IF SR1=1 THEN P:=00111111;C_ST=ST1;A=1; ELSE C_ST=ST0;AIF P/=0 THEN P:=P-1;C_ST=ST1; ELSEA=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; END ARCHITECTURE;本模块的仿真波形如图(17)所示。 图(17)蜂鸣器模块仿真波形四设计体会通过这次课程设计我学会了使用MAX+puls软件,还学了verilog HDL编程的方法。因为verilog HDL语言语法和以前学过的C语言比较相近,所以在看了些相关书籍和程序范例后,就入手编写verilog HDL代码,开始时候没有遇到太大问题。但是毕竟verilog HDL和C许多还是有差别的,如case的用法等。但是经过我们一起的努力,顺利的完成了verilog HDL代码的编写工作。这次设计的是一个基于CPLD的智力竞赛抢答器。我们也许在日常生活中很少有机会接触到抢答器,但在电视节目中却随处可见,并且现在的抢答器做的也越来越智能化,美观化。以前认为抢答器这种智能化的东西离我们很远,但通过此次课程设计,自己亲手做出来了,才发现它其实并没有那么困难。所谓理论指导实践,刚开始接到课题时,我首先确定了要用到哪些知识,主要是VHDL程序的设计,软件的仿真及硬件的实现。首先我查阅课本质料,找了不少关于这方面的程序,尽量的把它们都弄懂了。然后我确定了总体方案,把整体方案划分成了几个模块,形成了一个整体的框架,然后各个击破。软件仿真好了以后还只是停留在理论之上,有不有效还要硬件的调试。所以仿真好了以后我就将所有的模块整合起来进行硬件的调试。此次课程设计不仅加强了我对专业知识的学习与了解,更有许多的感慨,加强了我们动手、思考和解决问题的能力。我们很少能有这种机会来锻炼自己,通过这次课程设计,起到了很好的锻炼效果。五参考文献1 张原. 可编程逻辑器件设计及应用M. 北京:机械工业出版社,2006.5:134-1452 史小波,程梦璋,许会芳. 集成电路设计VHDL教程M. 北京:清华大学出版社,2005.6:177-1863 付永庆. VHDL语言及其应用M. 北京:高等教育出版社,2005.5:56-704 余松熠,周源华,吴时光. 数字图像处理M. 北京:电子工业出版社,2006.6:89-965 张殿明. 可编程控制器与工厂自动化J. 中国学术期刊,2005,4:58-606 刘秋云,王佳. Verilog HDL设计实践与指导M. 北京:机械工业出版社,2005.1:123-1457 刘洪喜,陆颖. VHDL电路设计实用教程M. 北京:清华大学出版社,2007.3:67-78沈 阳 大 学
展开阅读全文