北邮数电实验之组合逻辑电路时序逻辑电路.docx
《北邮数电实验之组合逻辑电路时序逻辑电路.docx》由会员分享,可在线阅读,更多相关《北邮数电实验之组合逻辑电路时序逻辑电路.docx(12页珍藏版)》请在冰豆网上搜索。
![北邮数电实验之组合逻辑电路时序逻辑电路.docx](https://file1.bdocx.com/fileroot1/2022-12/1/d9ff1007-d3b4-4126-b314-f35c529f7d55/d9ff1007-d3b4-4126-b314-f35c529f7d551.gif)
北邮数电实验之组合逻辑电路时序逻辑电路
北京邮电大学
数字电路与逻辑设计实验报告
(实验2)
电子202-赵依然-2018212048
摘要:
本次数字电路与逻辑设计实验以初步掌握VHDL语言设计简单的数字电路,并且在QuartusⅡ上仿真为目的,加深组合逻辑电路和时序逻辑电路的基本原理、设计理念、运转方式。
关键词:
组合逻辑电路时序逻辑电路VHDLQuartusⅡ仿真
一:
实验1
实验内容1
1.1.1实验名称:
VHDL组合逻辑电路设计-4选1数据选择器
1.1.2实验任务要求:
用VHDL语言设计实现一个4选1数据选择器,根据地址端的不同取值选择不同的数据端到输出端,仿真验证其功能。
1.2电路设计及VHDL代码及注释
1.2.1设计原理:
利用功能表进行判断。
设计数据输入端a3-a0和地址端s1-s0,输出端c,当地址端为11时c端输出a3的值,当地址端为10时c端输出a2的值,当地址端为01时c端输出a1的值,当地址端为00时c端输出a0的值。
这样就确定了电路的逻辑。
1.2.2VHDL代码及注释:
libraryieee;
useIEEE.STD_LOGIC_1164.all;
useIEEE.STD_LOGIC_arith.all;
useieee.STD_LOGIC_unsigned.all;
entitymux4is
port(
a:
instd_logic_vector(3downto0);
s:
instd_logic_vector(1downto0);
c:
outstd_logic
);
endmux4;
architecturemux4_archofmux4is
begin
process(s)
begin
casesis
when"00"=>c<=a(0);--当输入00,输出a(0)
when"01"=>c<=a
(1);
when"10"=>c<=a
(2);
when"11"=>c<=a(3);
endcase;
endprocess;
end;
1.3仿真波形图(请放大查看)
1.4仿真波形图分析
由图可知,当s端地址端输入11,c端输出和a3一致,s端输入10,c端输出和a2一致,s端输入01,c端输出和a1一致,s端输入00,c端输出和a0一致。
可见设计的逻辑满足要求,仿真正确,电路实现了4选1数据选择器的功能。
二:
实验2
实验内容2
2.1.1实验名称:
VHDL组合逻辑电路设计-共阴极7段数码管译码器
2.1.2实验任务要求:
用VHDL语言设计实现一个共阴极7段数码管译码器,仿真验证其功能,并下载到实验板测试。
要求用拨码开关设定输入信号,7段数码管显示输出信号。
2.2电路设计及VHDL代码及注释
2.2.1设计原理:
我们知道,七段共阴极数码管是这样的,也就是通过点亮各个数码管来实现数字的显示。
输入端为a3-a0,输出端为b6-b0(控制7段数码管用),c7-c0(用来控制板子上哪个数码管进行显示)。
功能表由数码管的原理确定,如当输入为0000时,数码管点亮B6B5B4B3B2B1,这样就显示出0这个数字。
再比如输入为1001时,数码管点亮B6B5B4B3B1B0则点亮9这个数字。
如下表所示。
其他情况下则输出高阻。
2.2.2VHDL代码及注释
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_arith.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;
entityqiduanis
port(
a:
instd_logic_vector(3downto0);
b:
outstd_logic_vector(6downto0);
c:
outstd_logic_vector(7downto0));--控制显示板子上哪个数码管
endqiduan;
architectureqiduanyimaofqiduanis
begin
process(a)
begin
c<="01111111";
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<="ZZZZZZZ";--输出高阻
endcase;
endprocess;
endqiduanyima;
2.3仿真波形图(请放大查看)
2.4仿真波形图分析:
由图可知,当输入端输入0000时,可输出b端1111110,即在数码管上显示数字0,输入0000-1001都可显示真值表中相应的输出,可显示对应的数字。
当不在这个输入的范围内,输出高阻。
同时c端一直输出01111111,即使用板子上第一个数码管器。
由分析可知,设计的逻辑满足要求,仿真正确,电路实现了共阴极7段数码管译码器
的功能。
三:
实验3
实验内容3
3.1.1实验名称:
VHDL组合时序电路设计-分频器
3.1.2实验任务要求:
用VHDL语言设计实现一个分频系数为10,分频输出信号占空比为50%的分频器,仿真验证设计。
3.2电路设计及VHDL代码及注释
3.2.1设计原理:
分频系数为10.输出信号占空比为50%,则可用一个时钟信号clk,异步置零信号clear作为输入端,clkout作为输出端,定义一个信号temp,异步置零时信号为0,同时传递给输出端。
当异步置零时信号不为0时,则利用一个count变量进行计数。
Count小于4时,则count遇到上升沿变加一,记录上升沿变化,同时信号保持原来状态不变。
当等于4时,则使信号发生翻转,则clkout也发生变化,同时count置零,重新开始计数。
这样满5个上升沿就让clkout变化一次,实现了10分频功能,同时还实现了占空比为50%的功能。
3.2.2VHDL代码及注释
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydiv10is
port
(clk,clear:
instd_logic;
clkout:
outstd_logic
);
enddiv10;
architecturedivofdiv10is
signaltemp:
std_logic;
begin
process(clk,clear)
variablecount:
integerrange0to9;
begin
ifclear='0'then
temp<=clear;--异步置零
elsif(clk'eventandclk='1')then
if(count=4)then
count:
=0;--计数器count从0到了4则置零,重新计数
temp<=nottemp;--信号翻转
elsecount:
=count+1;
endif;
endif;
endprocess;
clkout<=temp;
end;
3.3波形图仿真(请放大查看)
3.4波形图仿真结果分析
由仿真结果可以看到,该电路实现了每经过5个时钟的上升沿才会进行一次信号的翻转,即频率变为原来的十分之一。
同时低电平和高电平保持的时间均占一个周期内的百分之五十,实现了占空比为50%。
同时,当外部clear置0则信号置0,实现了异步复位。
由分析可知,设计的逻辑满足要求,仿真正确,电路实现了分频系数为10、信号占空比为50%、带异步复位的分频器功能。
四:
实验4
实验内容4
4.1.1实验名称:
VHDL组合时序电路设计-带异步复位8421十进制计数器
4.1.2实验任务要求:
用VHDL语言设计实现一个带异步复位的8421码十进制计数器,仿真验证其功能。
4.2电路设计及VHDL代码及注释
4.2.1设计原理
设计一个外部的clk时钟信号,clear异步复位信号,作为输入端,c3-c0作为输出信号,用一个信号temp,当clear置0时让temp也置0,同时将temp传输给c3-c0输出。
当clear处于高电平则看是否有上升沿,当遇到上升沿,temp加1,将temp传到输出端,当temp到9时,表示已经经过10个数,则temp置0,即实现十进制计数,满9后归0。
将temp传递到输出端时,利用conv_std_logic_vector(,)函数将temp从0-9的整型转化为4位二进制数。
这样就实现了带异步复位的8421十进制计数器。
4.2.2VHDL代码及注释
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
entitycount8421is
port
(clk,clear:
instd_logic;
c:
outstd_logic_vector(3downto0)
);
endcount8421;
architecturecountofcount8421is
signaltemp:
integerrange0to9;
begin
process(clk)
begin
ifclear='0'then
temp<=0;
elsif(clk'eventandclk='1')then
if(temp=9)thentemp<=0;--满9置0
elsetemp<=temp+1;
endif;
endif;
endprocess;
c<=conv_std_logic_vector(temp,4);--整形转化为8421码
endcount;
4.3仿真波形图
4.4仿真波形图分析
由仿真波形图知,电路实现了带异步复位的十进制8421码计数器功能,初始为0000,每遇到一个时钟上升沿便输出8421码的下一位,同时到1001之后再遇到上升沿便重新从0000开始计数。
同时当外部信号clear置0时,计数器便保持在0000的状态不再变化。
由分析可知,设计的逻辑满足要求,仿真正确,电路实现了带异步复位的8421码十进制计数器功能。
五:
实验5
实验内容5
5.1.1实验名称:
VHDL组合时序电路设计-分频器、计数器和数码管译码器3个电路进行连接
5.1.2实验任务要求:
将分频器、计数器和数码管译码器3个电路进行连接,实现一个加1的计数器,并在数码管上显示计数结果。
要求下载到实验板验证实验结果,实验板上输入时钟选择10Hz。
由于没有实验板,我们暂时无法进行实验板上的演示。
5.2电路设计及VHDL代码及注释
5.2.1设计原理
可采用图形法或者VHDL例化法进行连接。
我采用图形法。
需要注意的是,粗线要求连接的两端格式完全一样,包括性质,位数宽度。
如果是连接输入或输出时,名字必须是完全一样包括中括号“[”“]”,数字的顺序,以及数字之间的两个点“..”
5.2.2VHDL代码及注释
由于此实验由图形法完成,故展示连接的电路图
将clk时钟和clear异步复位作为分频器的输入,分频器输出clkout作为计数器输入,同时clear连接异步置位端,将计数器输出连接到数码管译码器输入端,同时输出端b6-b0接数码管各个管上,而c7-c0控制板子上第几个数码管进行显示。
5.3波形图仿真结果
5.4仿真波形图结果分析
由仿真波形图可知,每10个时钟上升沿,数码管输出从1111110到1111011(即0-9)循环发生变化,同时当异步置位端为0时,输出11111110)即数字0,实现了异步置0的功能。
可知,上述的电路实现了10分频器、8421十进制计数器、数码管译码器的功能,设计的逻辑满足要求,仿真正确,实现了所要求的功能。
六:
故障问题及分析
1.故障:
图形法设计顶层文件时,出现管脚未定义的情况。
这是因为,在顶层的工程文件夹中,需要我们把各个模块的VHDL文件加进去才可以实现引脚成功定义。
2.在采用图形法设计时,有时出现引脚未定义的情况。
原因:
必须让粗线所连接的两端格式完全一样,包括性质,位数宽度。
如果是连接输入或输出时,要把相应的输入或输出的名字修改成要连接的信号名字即可,但必须是完全一样,包括中括号“[”“]”,数字的顺序,以及数字之间的两个点“..”
3.编译过程中出现多次单词打错的情况导致编译久久不能完成。
如architecture这个词,前后多次打错,导致编译不通过。
这告诉我们编程时需要注意自己的英语功底,多背单词。
4.信号在赋值的时候产生了编译错误。
原因是将信号设置为Std_logic格式,而后面就不能将信号直接设置成‘0’,因为只有integer整形才能进行‘0’或者‘1’这样的赋值。
解决方法:
将信号赋值为另一个信号即可,不能赋值为整形的数。
5.编程时要注意每个ifprocess都要用end结尾。
If要在process中进行。
6.进行仿真时要注意截取至少一个周期的过程,最好再多一些,否则仿真结果不完整。
7.注意信号是<=变量是:
=,否则会出现编译错误
8.注意process里的敏感信号,当检测到这个信号发生变化时进行处理,如果相应的敏感信号不对的话,则做不到相应的信号变化时做出反应。
9.编译时不要出现中文符号。
七:
总结和结论
在本次实验中,我将五个实验要求的功能都实现了出来,包括4选1数据选择器,共阴极7段数码管译码器,带异步复位8421十进制计数器,分频系数为10,分频输出信号占空比为50%的分频器,以及将分频器、计数器和数码管译码器3个电路进行连接,实现一个加1的计数器,并在数码管上显示计数结果。
通过这次实验,我更好的了解了组合逻辑电路和时序逻辑电路的组成原理和特点,以及如何使用VHDL语言对其进行描述。
在一系列的设计、编程、测试、纠错和改进过程中,我获益匪浅,掌握了Quartus这个软件进一步的使用方法,以及VHDL语言的语法特性,并进行相应的仿真,并结合图形法等方法进行元件之间的组合。
运用理论课上的知识,对所求元件进行了相应的功能设计,然后开始了相应代码的编写。
在编写过程中,遇到了很多关于VHDL语言的困扰,经过不断的调整和适应,终于掌握了相关的语法规则。
因为VHDL语言只关心它的功能而不需要去详细描述电路的内部结构,使得描述起来较为简单。
同时,将数字电路理论课的知识运用到实际的实验设计中,既培养了动手能力,又加深了我对课堂知识的理解。
八:
参考文献