EDA课程设计报告智能函数信号发生器抢答器.docx
《EDA课程设计报告智能函数信号发生器抢答器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告智能函数信号发生器抢答器.docx(25页珍藏版)》请在冰豆网上搜索。
![EDA课程设计报告智能函数信号发生器抢答器.docx](https://file1.bdocx.com/fileroot1/2022-12/12/6aa2c9a4-eeff-41c0-8227-48d6998e5735/6aa2c9a4-eeff-41c0-8227-48d6998e57351.gif)
EDA课程设计报告智能函数信号发生器抢答器
江苏大学
电气学院EDA课程设计报告
必选题目1:
序列检测器设计
一:
题目要求见课本p296页
二:
程序编写思路:
序列检测器用于检测一组或数组二进制数位是否与检测器中预置的码相同,由于检测的序列必须是连续的,所以要求检测器必须记住前一次的正确码以及正确序列,直到连续检测收到的码与预置的码完全一样。
检测过程中,任意一位的不相等都会回到出事状态重新开始检测。
若此数的每一位的连续检测都与预置的数完全一样,则输出A,否则输出B\。
三:
程序见课本p296页—p297页
四:
程序仿真波形
程序仿真说明:
在D中预置八位的序列,当clk时钟信号为上升沿时,开始检测,当Din中序列与预置序列D完全相同时,AB中输出A,否则输出B,当RST为高电平有效时,Din从头开始检测与D中预置序列匹配。
必选题目2:
八位并行预置加法计数器设计
一.题目要求见P276页
二.题目设计思路
该加法计数器含有技术使能,异步复位和计数值并行预置的八位加法计数器
,其中ID,EN,CLK,RST分别是并行输入预置使能信号,计数时钟使能信号,计数时钟信号和复位信号。
其中ID并行输入预置使能信号作为高电平要保持时间必须包含一个上升沿。
三.程序见课本P277页
四.程序仿真波形
程序仿真说明:
D中预置两位计数初值,CLK为上升沿,RST为高电平有效时,Q置0,当SET信号为高电平时,Q置为计数初值,当EN为高电平时Q加1,EN为低电平时Q保持不变。
自选题目1:
智能函数发生器
一.要求:
函数发生器能够长生递增斜波,递减斜波,阶梯波,三角波,方波和正弦波,并可以通过选通开关选择输出的波形。
二.设计思路:
智能函数发生器可由递增斜波产生模块,递减斜波产生模块,阶梯波产生模块,三角波产生模块,方波产生模块,正弦波产生模块和一个选通模块组成。
三.程序代码及仿真波形
递增模块(icrs):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYICRSIS
PORT(
CLK,CLR:
INSTD_LOGIC;--时钟信号,复位信号
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)--输出函数值
);
ENDICRS;
ARCHITECTUREONEOFICRSIS
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
STD_LOGIC_VECTOR(7DOWNTO0);--中间变量
BEGIN
IFCLR='1'THENTMP:
="00000000";--清0
ELSIFCLK'EVENTANDCLK='0'THEN--下降沿触发
IFTMP="11111111"THENTMP:
="00000000";
ELSETMP:
=TMP+1;
ENDIF;
ENDIF;
Q<=TMP;
ENDPROCESS;
ENDONE;
仿真波形如下:
递减模块(dcrs):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDCRSIS
PORT(CLK,CLR:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDDCRS;
ARCHITECTUREONEOFDCRSIS
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFCLR='1'THENTMP:
="11111111";--复位为最大值
ELSIFCLK'EVENTANDCLK='1'THEN
IFTMP="00000000"THENTMP:
="11111111";
ELSETMP:
=TMP-1;
ENDIF;
ENDIF;
Q<=TMP;
ENDPROCESS;
ENDONE;
仿真波形如下:
阶梯波(ladder):
通过改变阶梯常数可以改变递增的阶梯数
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYLADDERIS
PORT(CLK,CLR:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDLADDER;
ARCHITECTUREONEOFLADDERIS
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEA:
STD_LOGIC;
BEGIN
IFCLR='1'THENTMP:
="00000000";
ELSIFCLK'EVENTANDCLK='0'THEN
IFA='0'THEN
IFTMP="11111111"THENTMP:
="00000000";A:
='1';
ELSETMP:
=TMP+16;A:
='1';--阶梯常数为16
ENDIF;
ELSEA:
='0';
ENDIF;
ENDIF;
Q<=TMP;
ENDPROCESS;
ENDONE;
仿真波形如下:
三角波模块(delta):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDELTAIS
PORT(CLK,CLR:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDDELTA;
ARCHITECTUREONEOFDELTAIS
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEA:
STD_LOGIC;
BEGIN
IFCLR='1'THENTMP:
="00000000";
ELSIFCLK'EVENTANDCLK='0'THEN
IFA='0'THEN--A=0,递增过程
IFTMP="11111110"THENTMP:
="11111111";A:
='1';--增到最大值后转为递减过程
ELSETMP:
=TMP+1;
ENDIF;
ELSE--A=1,递减过程
IFTMP="00000001"THENTMP:
="00000000";A:
='0';--减到最小值后转为递增过程
ELSETMP:
=TMP-1;
ENDIF;
ENDIF;
ENDIF;
Q<=TMP;
ENDPROCESS;
ENDONE;
仿真波形如下:
由仿真图可以看出输出刚开始递增,增到最大值FF后转为递减,输出实现三角波波形。
方波模块(square):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSQUAREIS
PORT(CLK,CLR:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDSQUARE;
ARCHITECTUREONEOFSQUAREIS
SIGNALA:
STD_LOGIC;--分频信号
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLR='1'THENA<='0';
ELSIFCLK'EVENTANDCLK='1'THEN
IFTMP="1111"THENTMP:
="0000";A<=NOTA;
ELSETMP:
=TMP+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,A)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFA='1'THENQ<="11111111";--输出高电平
ELSEQ<="00000000";--输出低电平
ENDIF;
ENDIF;
ENDPROCESS;
ENDONE;
仿真波形如下:
正弦波模块(sin):
一个周期取64个采样点,输出其函数值
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSINIS
PORT(CLK,CLR:
INSTD_LOGIC;
Q:
OUTINTEGERRANGE0TO255);
ENDSIN;
ARCHITECTUREONEOFSINIS
BEGIN
PROCESS(CLK,CLR)
VARIABLETMP:
INTEGERRANGE0TO63;
BEGIN
IFCLR='1'THENQ<=0;
ELSIFCLK'EVENTANDCLK='0'THEN
IFTMP=63THENTMP:
=0;ELSETMP:
=TMP+1;
ENDIF;
CASETMPIS
WHEN0=>Q<=255;WHEN1=>Q<=254;WHEN2=>Q<=252;
WHEN3=>Q<=249;WHEN4=>Q<=245;WHEN5=>Q<=239;
WHEN6=>Q<=233;WHEN7=>Q<=225;WHEN8=>Q<=217;
WHEN9=>Q<=207;WHEN10=>Q<=197;WHEN11=>Q<=186;
WHEN12=>Q<=174;WHEN13=>Q<=162;WHEN14=>Q<=150;
WHEN15=>Q<=137;WHEN16=>Q<=124;WHEN17=>Q<=112;
WHEN18=>Q<=99;WHEN19=>Q<=87;WHEN20=>Q<=75;
WHEN21=>Q<=64;WHEN22=>Q<=53;WHEN23=>Q<=43;
WHEN24=>Q<=34;WHEN25=>Q<=26;WHEN26=>Q<=19;
WHEN27=>Q<=13;WHEN28=>Q<=8;WHEN29=>Q<=4;
WHEN30=>Q<=1;WHEN31=>Q<=0;WHEN32=>Q<=0;
WHEN33=>Q<=1;WHEN34=>Q<=4;WHEN35=>Q<=8;
WHEN36=>Q<=13;WHEN37=>Q<=19;WHEN38=>Q<=26;
WHEN39=>Q<=34;WHEN40=>Q<=43;WHEN41=>Q<=53;
WHEN42=>Q<=64;WHEN43=>Q<=75;WHEN44=>Q<=87;
WHEN45=>Q<=99;WHEN46=>Q<=112;WHEN47=>Q<=124;
WHEN48=>Q<=137;WHEN49=>Q<=150;WHEN50=>Q<=162;
WHEN51=>Q<=174;WHEN52=>Q<=186;WHEN53=>Q<=197;
WHEN54=>Q<=207;WHEN55=>Q<=217;WHEN56=>Q<=225;
WHEN57=>Q<=233;WHEN58=>Q<=239;WHEN59=>Q<=245;
WHEN60=>Q<=249;WHEN61=>Q<=252;WHEN62=>Q<=254;
WHEN63=>Q<=255;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDONE;
仿真波形如下:
由仿真图可以看出输出波形周期性递增,递减,但是并非线性增减,输出实现正弦波波形。
波形选择模块(ch61a)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYCH61AIS
PORT(SEL:
INSTD_LOGIC_VECTOR(2DOWNTO0);
D0,D1,D2,D3,D4,D5:
INSTD_LOGIC_VECTOR(7DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDCH61A;
ARCHITECTUREONEOFCH61AIS
BEGIN
PROCESS(SEL)
BEGIN
CASESELIS
WHEN"000"=>Q<=D0;--递增
WHEN"001"=>Q<=D1;--递减
WHEN"010"=>Q<=D2;--阶梯波
WHEN"011"=>Q<=D3;--三角波
WHEN"100"=>Q<=D4;--方波
WHEN"101"=>Q<=D5;--正弦波
WHENOTHERS=>Q<=NULL;
ENDCASE;
ENDPROCESS;
ENDONE;
整体电路原理图:
整体仿真波形:
由仿真图可以看出输出波形由控制信号sel[2...0]控制输出,分别对应递增,递减,阶梯波,三角波,方波和正弦波。
因面副原因不能完全显示出来。
自选题目2:
抢答器:
一、要求:
1有四位选手参赛;
2在抢答开始前如果有选手抢答,能够给出报警信号,并显示是哪一位选手提前抢答。
3在开始抢答之后能够判断是哪一位选手最先抢答,同时点亮对应选手成功抢答信号灯,此后不再接受其他选手抢答信号。
4若选手成功抢答并且正确回答问题,给选手加1分,若回答错误则减1分。
5若有选手达到10分则成为赢家,给出对应选手赢的信号;若有选手在已经是0分情况下回答错误,则判其输,退出之后的比赛,同时给出对应选手输的信号。
6实时显示选手的分数情况。
二、设计思路:
该抢答器可分为抢答判优,比赛计分和分数显示三个模块组成,抢答判优模块实现功能2和3,比赛计分模块实现功能4和5,显示模块实现功能6;具体程序如下。
三、程序代码及仿真波形
抢答判优模块:
其中CLR是清0控制信号,EN是抢答使能信号,A,B,C,D分别代表四位参赛选手,LEDA,LEDB,LEDC,LEDD分别表示四位选手成功抢答信号灯,FALSE[3...0]是提前抢答报警信号,能显示具体是哪位选手提前抢答,Q成功抢答信号,能显示具体成功抢答的选手。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYQIANGDAPANDUANIS
PORT(
CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
A,B,C,D:
INSTD_LOGIC;
LEDA,LEDB,LEDC,LEDD:
OUTSTD_LOGIC;
FALSE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDQIANGDAPANDUAN;
ARCHITECTURERTLOFQIANGDAPANDUANIS
SIGNALTMP:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALTAG:
STD_LOGIC;--锁存标志位
BEGIN
TMP<=A&B&C&D;
PROCESS(CLR,EN,A,B,C,D,TMP)
BEGIN
IFCLR='1'THEN
Q<="0000";
LEDA<='0';
LEDB<='0';
LEDC<='0';
LEDD<='0';
FALSE<="0000";
TAG<='0';
ELSIFEN='0'THEN--提前抢答,报警
IFA='1'THEN
FALSE(3)<='1';
ENDIF;
IFB='1'THEN
FALSE
(2)<='1';
ENDIF;
IFC='1'THEN
FALSE
(1)<='1';
ENDIF;
IFD='1'THEN
FALSE(0)<='1';
ENDIF;
ELSE--开始抢答
FALSE<="0000";
IFTAG='0'THEN--尚未有成功抢答者
IFTMP="1000"THEN--A抢答成功
LEDA<='1';--亮灯A
LEDB<='0';
LEDC<='0';
LEDD<='0';
Q<="1000";--输出A抢答成功
TAG<='1';--锁存此状态
ELSIFTMP="0100"THEN
LEDA<='0';
LEDB<='1';
LEDC<='0';
LEDD<='0';
Q<="0100";
TAG<='1';
ELSIFTMP="0010"THEN
LEDA<='0';
LEDB<='0';
LEDC<='1';
LEDD<='0';
Q<="0010";
TAG<='1';
ELSIFTMP="0001"THEN
LEDA<='0';
LEDB<='0';
LEDC<='0';
LEDD<='1';
Q<="0001";
TAG<='1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDRTL;
仿真波形如下:
刚开始D提前抢答,输出报警信号,由FALSE信号输出0001可知是D提前抢答。
清0后重新开始,抢答使能信号EN=1有效,开始抢答,C最先抢答,LEDC点亮,Q输出0010可知是C选手最先成功抢答。
比赛计分模块:
CHOS[3...0]表示成功抢答的选手,CLK是时钟信号,ADD,SUB分别表示回答正确加分和回答错误减分信号,WINA,WINB,WINC,WIND分别表示四位选手赢信号,LOSEA,LOSEB,LOSEC.LOSED分别表示输信号,A0,B0,C0,D0分别表示四位选手的得分,A2,A1分别表示选手A得分的十位和个位数字,用于输出模块译码输出;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYBISAIMOKUAIIS
PORT(
CHOS:
INSTD_LOGIC_VECTOR(3DOWNTO0);
ADD:
INSTD_LOGIC;
SUB:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
A0,B0,C0,D0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
A2,A1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
B2,B1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C2,C1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
D2,D1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
WINA,WINB,WINC,WIND:
OUTSTD_LOGIC;
LOSEA,LOSEB,LOSEC,LOSED:
OUTSTD_LOGIC
);
ENDBISAIMOKUAI;
ARCHITECTURERTLOFBISAIMOKUAIIS
BEGIN
PROCESS(CLK,ADD,SUB,CHOS)
VARIABLEPOINTS_A2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_A1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_B2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_B1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_C2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_C1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_D2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_D1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEWA,WB,WC,WD:
STD_LOGIC;
VARIABLELA,LB,LC,LD:
STD_LOGIC;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFADD='1'THEN
IFCHOS="1000"THEN
IFPOINTS_A1="1001"THEN
POINTS_A1:
="0000";
POINTS_A2:
=POINTS_A2+'1';
WA:
='1';
ELSE
POINTS_A1:
=POINTS_A1+'1';
ENDIF;
ELSIFCHOS="0100"THEN
IFPOINTS_B1="1001"THEN
POINTS_B1:
="0000";
POINTS_B2:
=POINTS_B2+'1';
WB:
='1';
ELSE
POINTS_B1:
=POINTS_B1+'1';
ENDIF;
ELSIFCHOS="0010"THEN
IFPOINTS_C1="1001"THEN
POINTS_C1:
="0000";
POINTS_C2:
=POINTS_C2+'1';
WC:
='1';
ELSE
POINTS_C1:
=POINTS_C1+'1';
ENDIF;
ELSIFCHOS="0001"THEN
IFPOINTS_D1="1001"THEN
POINTS_D1:
="0000";
POINTS_D2:
=POINTS_D2+'1';
WD:
='1';
ELSE
POINTS_D1:
=POINTS_D1+'1';