北邮数电实验报告信息.docx
《北邮数电实验报告信息.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告信息.docx(18页珍藏版)》请在冰豆网上搜索。
北邮数电实验报告信息
北邮数电实验报告■信息
!
掠玄卑堂走皐
数字电路与逻辑设计实验
姓学专班学
***
院信息与通信工程学院
信息工程
***
****
实验一
一、实验名称和实验任务要求
1.实验内容:
Quartusll原理图输入法设计与实现。
2.实验目的:
(1)熟悉用Quartusll原理图输入法进行电路设计和仿真。
(2)掌握Quartusll图形模块单元的生成与调用。
(3)熟悉实验板的使用。
3.实验任务要求:
(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图像模块。
(2)用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板上测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用3线一8线译码器(74LS138)和逻辑门实现函数
F=(/?
5(/?
?
(/?
?
+(/?
?
?
?
/?
?
+?
?
7?
?
(/?
?
+?
?
?
?
?
仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
、原理图
半加器模块和逻辑门设计实现的全加器:
三、仿真波形图及分析
sum=ain®bin®cin
cout=(ain®bin)cin+ain*bin。
列出真值表:
输入
输出
ain
bin
cin
cout
sum
0
0
0
0
0
0
0
1
0
1
0
1
P0
0
「1:
0
1
1
1
0
1
0
0
0
1
1
0
1
1
0
1「
1
0
1
0
1
1
1
1
1
仿真波形对比真值表,可以看出波形图与理论值完全符合。
四、故障及问题分析
1、问题:
按照逻辑表达式连接了全加器电路后,仿真波形很乱。
解决方法:
思考后知道了应该把输入信号依次设成2的n次方,这样的仿真波形清楚容易分析。
2、问题:
把代码下载到板子上的过程中,进行到37%的时候停了,等了2分钟
也没继续下载。
解决方法:
再次重连USB尝试下载,手紧握着接线口,下载成功了,分析可能是接线口接触不好。
实验二
、实验名称和实验任务要求
1.实验内容:
用VHDL设计与实现组合逻辑电路。
2.实验目的:
(1)熟悉用VHDL语言设计组合逻辑电路的方法。
(2)熟悉用Quartusll文本输入法进行电路设计。
3.实验任务要求:
(1)用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个‘1'时,输出为‘1',否则输出‘0',仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(2)用VHDL语言设计实现一个8421码转换为余3码的代码转换器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)
仿真验证其
7段数码
用VHDL语言设计实现一个共阴极7段数码管译码器功能,并下载到实验板测试。
要求用拨码开关设定输入信号,管显示输出信号。
、VHDL代码
1.奇校验器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYjijiaoyanqiIS
PORT(A:
STD_LOGIC;
B:
STD_LOGIC;
C:
STD_LOGIC;
D:
STD_LOGIC;
F:
OUTSTD_LOGIC);
ENDjijiaoyanqi;
ARCHITECTUREoneOFjijiaoyanqiIS
SIGNALn1,n2:
STD_LOGIC;
BEGIN
n1<=AXORB;
n2<=n1XORC;
F<=n2XORD;--异或,A®B®C®D
ENDone;
2.8421码转余3码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbasizhuanyu3IS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);B:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDbasizhuanyu3;
ARCHITECTUREzhuanyu3OFbasizhuanyu3ISBEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>B<="0011";
WHEN"0001"=>B<="0100";
WHEN"0010"=>B<="0101";
WHEN"0011"=>B<="0110";
WHEN"0100"=>B<="0111";
WHEN"0101"=>B<="1000";
WHEN"0110"=>B<="1001";
WHEN"0111"=>B<="1010";WHEN"1000"=>B<="1011";WHEN"1001"=>B<="1100";WHENOTHERS=>B<="ZZZZ";
ENDCASE;
ENDPROCESS;
ENDzhuanyu3;
3.数码管译码器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYshumaguanyimaqiIS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
B:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
C:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDshumaguanyimaqi;
ARCHITECTUREshumaOFshumaguanyimaqiIS
BEGIN
PROCESS(A)
BEGIN
C<="011111";
CASEAIS
WHEN"0000"=>B<="1111110";--0WHEN"0001"=>B<="0110000";--1WHEN"0010"=>B<="1101101";--2WHEN"0011"=>B<="1111001";--3WHEN"0100"=>B<="0110011";--4WHEN"0101"=>B<="1011011";--5WHEN"0110"=>B<="1011111";--6WHEN"0111"=>B<="1110000";--7WHEN"1000"=>B<="1111111";--8WHEN"1001"=>B<="1111011";--9WHENOTHERS=>B<="ZZZZZZZ";
ENDCASE;
ENDPROCESS;
ENDshuma;
三、故障及问题分析
1、问题:
代码写好以后编译出现错误,Error(10568):
VHDLerrorat
jijiaoyanqi.vhd(17):
can'twritetointerfaceobject"partout"ofmodeIN,由于报错指到了第17行F<=n2XORD;导致我开始的时候没意识到这是哪里的错误。
解决方法:
在XX查了以后发现是F:
OUTSTD_LOGIC);这句我写成了
F:
INSTD_LOGIC);以后要注意少犯这些马虎的错误。
2、问题:
把代码下载到板子上的过程中,再次出现了第一节课出现的下载停止
的问题,再次尝试后也没有下载成功,第三次接线的时候等了好久,HardwareSetup窗口也没有显示有硬件接入。
解决方法:
换了一台电脑尝试然后成功了,我觉得可能是两个原因,一是我反复操作导致软件反应时间长,二是我本来用的电脑接口连接不好。
实验三
、实验名称和实验任务要求
1.实验内容:
用VHDL设计与实现时序逻辑电路。
2.实验目的:
(1)熟悉用VHDL语言设计时序逻辑电路的方法。
(2)熟悉用QuartusII文本输入法进行电路设计。
3.实验任务要求:
(1)用VHDL语言设计实现一个分频系数为12,分频输出信号占空比为50%的分频器。
要求在QuartusII平台上设计程序并仿真验证设计。
(2)用VHDL语言设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能,并下载到实验板测试。
要求用按键设定输入信号,发光二极管显示输出信号。
(3)将
(1)、
(2)和数码管译码器3个电路进行连接,并下载到实验板显示计数结果。
、模块端口说明及连接图
1.整个电路输入端:
时钟信号CLK,复位键CLR。
2.分频器及计数器的端口连接:
复位键CLR作为分频器复位键CLR1、8421十进制计数器复位键CLR2;时钟信号CLK作为分频器的时钟信号CLK1,分频器输出CLK_0UT1作为8421十进制计数器的时钟信号CLK2;计数器的输出Q[0,1,2,3]作为数码管译码器的输入a[0,1,2,3]。
3.整个电路输出端:
b[0,1,2,3,4,5,6],分别对应7段数码管;c[0,1,2,3,4,5],分别对应6个数码管译码器。
三、VHDL代码
(1)8421十进制计数器:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYZY8421shijinzhiIS
PORT(CLK2,CLR2:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDZY8421shijinzhi;
ARCHITECTUREbehaveOFZY8421shijinzhiIS
SIGNALQ_temp:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGINPROCESS(CLK2,CLR2)BEGINIFCLR2='1'THENQ_temp<="0000";ELSIFCLK2'EVENTANDCLK2='1'THENIFQ_temp="1001"THENQ_temp<="0000";ELSEQ_temp<=Q_temp+1;ENDIF;
ENDIF;
ENDPROCESS;
Q<=Q_temp;
ENDbehave;
(2)分频器:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdiv_50MIS
PORT(CLK1,CLR1:
INSTD_LOGIC;CLK_OUT1:
OUTSTD_LOGIC);
ENDdiv_50M;
ARCHITECTUREbehaveOFdiv_50MIS
SIGNALtemp:
INTEGERRANGE0TO24999999;
SIGNALclkout:
STD_LOGIC;
BEGINPROCESS(CLK1,CLR1)
BEGINIFCLR1='1'THENtemp<=0;ELSIFCLK1'EVENTANDCLK1='1'THEN
IFtemp=24999999THENtemp<=0;clkout<=NOTclkout;ELSEtemp<=temp+1;
ENDIF;
ENDIF;
ENDPROCESS;CLK_OUT1<=clkout;
ENDbehave;
(3)将分频器、8421十进制计数器和数码管译码器3个电路的连接电路LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYfunction3IS
PORT(CLK,CLR:
INSTD_LOGIC;
b:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);c:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDfunction3;
ARCHITECTUREa1OFfunction3IS
COMPONENTdiv_50M--调用分频器和计数器两个元件
PORT(CLK1,CLR1:
INSTD_LOGIC;
CLK_OUT1:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTZY8421shijinzhi
PORT(CLK2,CLR2:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
SIGNALa:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALclkin:
STD_LOGIC;
MAP
BEGINu1:
div_50MPORT(CLK1=>CLK,CLR1=>CLR,CLK_OUT1=>clkin);
u2:
ZY8421shijinzhiPORTMAP(CLK2=>clkin,CLR2=>CLR,Q=>a);PROCESS(a)
BEGIN
c<="110111";--左数第三个数码管亮
CASEaIS
WHEN"0000"=>b<="1111110";--0
WHEN"0001"=>b<="0110000";--1
WHEN"0010"=>b<="1101101";--2
WHEN"0011"=>b<="1111001";--3
WHEN"0100"=>b<="0110011";--4
WHEN"0101"=>b<="1011011";--5
WHEN"0110"=>b<="1011111";--6
WHEN"0111"=>b<="1110000";--7
WHEN"1000"=>b<="1111111";--8
WHEN"1001"=>b<="1111011";--9
WHENOTHERS=>b<="1111110";--0
ENDCASE;
ENDPROCESS;
END;
四、仿真波形图及分析
分析仿真波形图可知,c为110111,左数第三个数码管亮;数码管译码器循环显示0到9这10个数字;复位信号CLK是高电平有效,从波形中看出CLR=1时输出b=1111110数码管显示数字0。
五、故障及问题分析
1、问题:
分频器代码编译成功后准备下载到板子上,在准备设置端口时,出现了这个跟之前不一样界面,没办法下载代码。
解决方法:
后来发现是最开始的时候,器件设置有问题,应该按照书上讲
的在Availabledevices栏选择EPM11270T144C5这个型号。
前两次实验都没有犯这个错误,我认识到我不应该忽视前面的必要步骤,某个小细节的不注意可能会导致重做整个项目。
2、问题:
把(3)的代码写好后编译出现错误,Error(10313):
VHDLCase
Statementerroratfunction3.vhd(30):
CaseStatementchoicesmustcoverallpossiblevaluesofexpression。
解决方法:
后来我检查发现是穷举法中的可能情况里忘了写WHEN
OTHERS=>b<="0000000";这一行,导致情况包括不完全而
报错。
3、问题:
仿真波形中b的显示类似乱码,并不是预想的二进制码。
解决方法:
老师讲解后知道了应该在CountValue选项中的
Radix栏选择Binary。
实验四
一、实验名称和实验任务要求
1.实验内容:
用VHDL设计与实现相关电路。
2.实验目的:
(1)掌握VHDL语言的语法规范,掌握时序电路描述方法。
(2)掌握多个数码管动态扫描显示的原理及设计方法。
3.实验任务要求:
(1)用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示“班号一班内序号”这6个数字图形到6个数码管,仿真验证其功能,
并下载到实验板测试。
(2)用VHDL语言设计并实现六个数码管滚动显示电路。
循环左滚动,
始终点亮6个数码管,左出右进。
状态为:
124-17,24-171,4-1712,-17124,17124-,7124-1,124-17。
模块端口说明及连接图
1.输入端:
elk时钟信号
2.输出端:
partout[0,1,2,3,4,5,6],分别对应7段数码管;catout[0,1,2,3,4,5]:
分别对应6个数码管译码器
三、VHDL代码
(1)同时显示“班号—班内序号”这六个数字图形到6个数码管LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYZY12417ISPORT(clk:
INSTD_LOGIC;
partout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);catout:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDZY12417;
ARCHITECTUREAOFZY12417ISSIGNALpart:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALcat:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALtempclk:
STD_LOGIC;
SIGNALcount:
INTEGERRANGE0TO1999;
--为便于仿真,仿真图对应代码将分频改成了50CONSTANTM:
INTEGER:
=1999;
BEGINP1:
PROCESS(clk)
BEGINIF(clk'EVENTANDclk='1')THEN
IFcount=MTHEN
count<=0;
tempclk<=NOTtempclk;
ELSE
count<=count+1;
ENDIF;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(tempclk)BEGIN
IF(tempclk'EVENTANDtempclk='1')THENCASEcatIS
WHEN"111110"=>cat<="011111";part<="0110000";--1WHEN"011111"=>cat<="101111";part<="1101101";--2WHEN"101111"=>cat<="110111";part<="0110011";--4WHEN"110111"=>cat<="111011";part<="0000001";---WHEN"111011"=>cat<="111101";part<="0110000";--1WHEN"111101"=>cat<="111110";part<="1110000";--7
WHENOTHERS=>cat<="011111";part<="0110000";--1ENDCASE;
ENDIF;
ENDPROCESSP2;
catout<=cat;
partout<=part;
ENDA;
(2)滚动显示电路(选做)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYgundongxianshiIS
PORT(clk,clear:
INSTD_LOGIC;
catout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);partout:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDgundongxianshi;
ARCHITECTUREaOFgundongxianshiIS
SIGNALcat:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALpart:
STD_LOGIC_VECTOR(5DOWNTO0);
SIGNALcnt,cnt1:
INTEGERRANGE0TO11;
SIGNALtmp:
INTEGERRANGE0TO15999;
SIGNALclk1:
STD_LOGIC;
BEGIN
p0:
PROCESS(clk,clear)
BEGIN
IFclear='0'THENtmp<=0;
ELSIFclk'EVENTANDclk='1'THEN
IFtmp=15999THENtmp<=0;
ELSEtmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESSp0;
p1:
PROCESS(tmp)
BEGIN
IFclk'EVENTANDclk='1'THEN
IFtmp<1000THENclk1<='0';
ELSEclk1<='1';
ENDIF;
ENDIF;
ENDPROCESSp1;p2:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THENIF(cnt=11)THENcnt<=0;
ELSEcnt<=cnt+1;
ENDIF;
ENDIF;
ENDPROCESSp2;p3:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THENIF(cnt1=11)THENcnt1<=0;
ELSEcnt1<=cnt1+1;
ENDIF;
ENDIF;
ENDPROCESSp3;p4:
PROCESS(cnt,cnt1)
BEGIN
IF(clear='0')THENcat<="0000000";
ELSE
CASEcnt+cnt1IS
WHEN6=>cat<="0110000";
WHEN7=>cat<="1101101";
WHEN8=>cat<="0110011";
WHEN9=>cat<="0000001";
WHEN10=>cat<="1101101";
WHEN11=>cat<="1101101";WHENOTHERS=>cat<="0000000";ENDCASE;
ENDIF;
ENDPROCESSp4;catout<=cat;p5:
PROCESS(cnt)
BEGIN
IF(clear='0')THENpart<="111111";
ELSE
CASEcntIS
WHEN0=>part<="011111";
WHEN1=>part<="10111