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