您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页北邮数电实验之组合逻辑电路、时序逻辑电路

北邮数电实验之组合逻辑电路、时序逻辑电路

来源:筏尚旅游网
北京邮电大学

数字电路与逻辑设计实验报告

(实验2)

电子202-赵依然-2018212048

摘要:本次数字电路与逻辑设计实验以初步掌握VHDL语言设计简单的数字电路,并且在QuartusⅡ上仿真为目的,加深组合逻辑电路和时序逻辑电路的基本原理、设计理念、运转方式。 关键词:组合逻辑电路 时序逻辑电路 VHDL QuartusⅡ仿真

一:实验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.2 VHDL代码及注释: library ieee;

use IEEE.STD_LOGIC_11.all; use IEEE.STD_LOGIC_arith.all; use ieee.STD_LOGIC_unsigned.all; entity mux4 is port(

a:in std_logic_vector(3 downto 0); s:in std_logic_vector(1 downto 0); c:out std_logic );

end mux4;

architecture mux4_arch of mux4 is begin process(s) begin case s is

when \"00\"=>c<=a(0);--当输入00,输出a(0) when \"01\"=>c<=a(1); when \"10\"=>c<=a(2); when \"11\"=>c<=a(3); end case;

end process; 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时,数码管点亮B6 B5 B4 B3 B2 B1,这样就显示出0这个数字。再比如输入为1001时,数码管点亮B6 B5 B4 B3 B1 B0 则点亮9这个数字。如下表所示。其他情况下则输出高阻。

2.2.2 VHDL代码及注释 LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_arith.ALL; USE IEEE.STD_LOGIC_unsigned.ALL; entity qiduan is port(

a:in std_logic_vector(3 downto 0); b:out std_logic_vector(6 downto 0);

c:out std_logic_vector(7 downto 0));--控制显示板子上哪个数码管

end qiduan;

architecture qiduanyima of qiduan is begin process(a) begin

c<=\"01111111\"; CASE a IS

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

WHEN OTHERS=> b<=\"ZZZZZZZ\";--输出高阻 end case; end process;

end qiduanyima;

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代码及注释 library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity div10 is port

(clk,clear:in std_logic; clkout:out std_logic );

end div10;

architecture div of div10 is signal temp:std_logic;

begin

process(clk,clear)

variable count:integer range 0 to 9; begin

if clear='0' then

temp<=clear;--异步置零 elsif(clk'event and clk='1') then if(count=4) then

count:=0;--计数器count从0到了4则置零,重新计数 temp<= not temp;--信号翻转 else count:=count+1; end if; end if; end process; 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.2 VHDL代码及注释 library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_arith.all; entity count8421 is port

(clk,clear:in std_logic;

c :out std_logic_vector (3 downto 0) );

end count8421;

architecture count of count8421 is signal temp:integer range 0 to 9; begin process(clk)

begin

if clear='0' then temp<=0;

elsif(clk'event and clk='1') then if (temp=9) then temp<=0;--满9置0 else temp<=temp+1; end if; end if; end process;

c<=conv_std_logic_vector(temp,4);--整形转化为8421码 end count; 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. 编程时要注意每个if process 都要用end结尾。If要在process中进行。

6. 进行仿真时要注意截取至少一个周期的过程,最好再多一些,否则仿真结果不完整。

7. 注意信号是<=变量是:=,否则会出现编译错误

8. 注意process里的敏感信号,当检测到这个信号发生变化时进行处理,如果相应的敏感信号不对的话,则做不到相应的信号变化时做出反应。

9. 编译时不要出现中文符号。

七:总结和结论

在本次实验中,我将五个实验要求的功能都实现了出来,包括4选1数据选择器,共阴极 7 段数码管译码器,带异步复位8421十进制计数器,分频系数为10,分频输出信号占空比为 50% 的分频器,以及将分频器、计数器和数码管译码器 3 个电路进行连接,实现一个加 1 的计数器,并在数码管上显示计数结果。

通过这次实验,我更好的了解了组合逻辑电路和时序逻辑电路的组成原理和特点,以及如何使用VHDL语言对其进行描述。在一系列的设计、编程、测试、纠错和改进过程中,我获益匪浅,掌握了Quartus这个软件进一步的使用方法,以及VHDL语言的语法特性,并进行相应的仿真,并结合图形法等方法进行元件之间的组合。运用理论课上的知识,对所求元件进行了相应的功能设计,然后开始了相应代码的编写。在编写过程中,遇到了很多关于VHDL语言的困扰,经过不断的调整和适应,终于掌握了相关的语法规则。因为VHDL语言只关心它的功能而不需要去详细描述电路的内部结构,使得描述起来

较为简单。同时,将数字电路理论课的知识运用到实际的实验设计中,既培养了动手能力,又加深了我对课堂知识的理解。

八:参考文献

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务