北邮数电实验报告Word文档格式.docx
《北邮数电实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《北邮数电实验报告Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
③:
用3线—8线译码器和逻辑门设计实现函数F,仿真验证其功能,下载到实验板测试。
要求用拨码开关设定输入信号,发光二极管显示输出信号。
二:
报告内容
实验一
(2)的原理图
用两个已经生成的半加器图形模块单元和一个双输入或门即可实现全加器
②:
仿真波形图以及分析
波形图:
波形分析:
通过分析abci三个输入在8中不同组合下的输出,发现与全加器的真值表吻合,说明实现了全加器的逻辑功能。
同时看见波形中出现了毛刺(冒险),这也与事实一致。
故障及问题分析
第一次在做全加器的时候发现找不到已经生成的半加器模块,后来发现是因为在建立工程时这两个项目没有建在同一个文件夹里,在调用的时候就找不到。
后来我将全加器工程建在同一个文件夹里解决了此问题。
实验二:
用VHDL设计和实现组合逻辑电路
用VHDL设计一个8421码转换为格雷码的代码转换器,仿真验证其功能。
②:
用VHDL设计一个4位二进制奇校验器,要求在为奇数个1时输出为1,偶数个1时输出为0,仿真验证其功能。
用VHDL设计一个数码管译码器,仿真验证其功能,下载到实验板测试,要求用拨码开关设定输入信号,数码管显示输出信号,
并且只使一个数码管有显示,其余为熄灭状态。
在刚开始实现让一个数码管显示的时候,我本来准备再设置6个输入和输出,通过实验板上的拨码来输入信息分别控制不同的数码管的的开闭状态,但是后来发现这样效率很低而且实验板上的拨码开关数量根本不够。
在老师的提醒下,我最终在VHDL里直接增加了一个向量输出”011111”来直接控制cat0~5六个管脚,从而达到了实验的要求。
实验三:
用VHDL设计和实现时序逻辑电路
用VHDL语言设计实现一个8421十进制计数器,要求有高电平复位功能,仿真验证其功能。
用VHDL语言设计实现一个分频系数为12,输出为占空比50%方波的分频器,有高电平复位功能,仿真验证其功能。
③:
将
(1),
(2)和数码管译码器三个电路进行连接,仿真验证其功能,并下载到实验板进行测试,要求第三个数码管显示数字。
①实验三(3)模块端口说明及模块代码
模块一:
div12为一个有高电平复位功能的分频系数为12的分屏器,其输出是一个占空比50%的方波。
此模块输入连接一个时钟输入,即可在输出端得到一个周期更大的方波输出。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydiv12is
port(
clear,clk:
instd_logic;
clk_out:
outstd_logic
);
enddiv12;
architecturestructofdiv12is
signaltemp:
integerrange0to5;
signalclktmp:
std_logic;
begin
process(clk,clear)
begin
if(clear='
1'
)then
temp<
=0;
elsifclk'
eventandclk='
then
if(temp=5)then
clktmp<
=notclktmp;
else
=temp+1;
endif;
endprocess;
clk_out<
=clktmp;
end;
模块二:
count10是一个有高电平复位功能的8421十进制计数器,将分频器的输出作为时钟信号接为计数器的输入,即可在输出端得到计数的下一状态的输出。
entitycount10is
clk,clear:
q:
outstd_logic_vector(3downto0)
endcount10;
architecturestructofcount10is
signalq_temp:
std_logic_vector(3downto0);
process(clk)
if(clk'
ifclear='
q_temp<
="
0000"
;
elsifq_temp="
1001"
else
=q_temp+1;
q<
=q_temp;
end;
模块三:
seg7_1是数码管译码器,将计数器的4位输出接为其输入信号,即可在输出端得到对应的十进制数的数码管信号。
entityseg7_1is
a:
instd_logic_vector(3downto0);
b:
outstd_logic_vector(6downto0)
);
endseg7_1;
architecturearchofseg7_1is
process(a)
caseais
when"
=>
b<
1111110"
0001"
0110000"
0010"
1101101"
0011"
1111001"
0100"
0110011"
0101"
1011011"
0110"
1011111"
0111"
1110000"
1000"
1111111"
1111011"
whenothers=>
0000000"
endcase;
连接图如下:
②:
仿真波形图
波形图分析
由仿真波形图可以看出,输入的时钟信号经过分频器后产生了周期为输入12倍的时钟信号,然后进行了上升沿有效的从0~9的10进制计数,每个计数数字都对应一个7位输出来控制数码管。
同时此电路还具有同步高电平复位的功能。
③故障及问题分析
一开始发现仿真之后计数器输出和数码管输出都全是0,仔细检测后发现是因为没有使用总线进行连接,使用总线后解决了问题。
实验四:
用VHDL设计与实现相关电路
①:
用VHDL实现6个数码管的串行扫描,让6个数码管显示不同的数字,仿真并验证功能,并下载到实验板测试。
实现数码管的滚动显示(选做)
实验四模块端口说明
VHDL代码
entityshumaguanis
port(
clk:
control_out:
outstd_logic_vector(5downto0);
//管脚控制
seg:
outstd_logic_vector(6downto0)//数码管显示
endshumaguan;
architectureaofshumaguanis
signalcontrol:
std_logic_vector(5downto0);
signalcount:
p1:
process(clk)//P1实现计数功能
ifcount=5then
count<
=count+1;
p2:
process(count)//P2实现数码管管脚控制
casecountis
when0=>
control<
011111"
when1=>
101111"
when2=>
110111"
when3=>
111011"
when4=>
111101"
when5=>
111110"
control_out<
=control;
p3:
process(control)//P3实现数码管数字显示
casecontrolis
when"
seg<
④:
仿真波形分析
通过仿真波形我们可以看出,在输入时钟的每个上升沿,由于内部的计数器功能,使得每一个计数对应着不同的管脚控制输出,而不同的管脚控制信号又对应着不同的数码管显示的信号,从而达到6个数码管显示不同数字的功能,如果输入时钟的频率够大,就能实现6个数字的同时显示。
⑤:
故障以及问题分析
在进行下实验板测试的时候,我发现我下载完后总是会使得点阵发光,而且频率高的时候小数点会亮,然而其他同学都没有遇到。
我在检查完代码与仿真后发现并没有问题,最后只有换了一个实验板,之后结果就对了,我想可能是实验板出了问题。
总结与结论
本学期的数字电路实验课让我受益匪浅。
它让我熟悉了quartus这款新的软件,也让我学会了VHDL这门新的语言,同时这门实验课让我在数字电路课程上学习到的理论知识有了实际的作用。
实验促进了我对数字电路的理解,在不断的编写和调试代码的过程中,我的逻辑思维也有了极大的提高,这对我以后的学习都会起到巨大的作用。
我从实验课过程中还学习到了重要的一点就是代码一定要自己写一遍,就算是书上有的也要自己打一遍来加深理解。
学习语言重点就是自己的实际操作,光是看是不行的。
这就是我对这学期数字电路实验课的总体感受,希望下学期的实验自己可以做的更好。