实验二组合逻辑电路的VHDL实现
一、实验目的
掌握使用VHDL语言进行时序逻辑电路设计的方法。
二、实验设备及器件
IBM PC机一台
三、实验内容
(1)用VHDL 语言设计一个D触发器,对程序进行编译和仿真,并记录仿真波形。
CLK接收到上升沿信号时,输入端D的信号被传送到输
出端Q输出,否则输出端Q维持原来的状态不变。
实验代码:
D触发器LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF1 IS
PORT (CLK : IN STD_LOGIC ;
D : IN STD_LOGIC ;
Q : OUT STD_LOGIC );
END ;
ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1 : STD_LOGIC ; --类似于在芯片内部定义一个数据的暂存节点
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1'
THEN Q1 <= D ;
END IF;
Q <= Q1 ; --将内部的暂存数据向端口输出
END PROCESS ;
END bhv;
(2)用VHDL语言设计一个十进制加法计数器,对程序进行编译和仿真,并记录仿真波形。
提示:十进制加法计数器的电路如下图所示,在时钟信号的驱动下,计数器进行累加,每次加1,其输出状态由0000变化到1001,加满回零。
当复位输入端reset为低电平时,计数器复位,输出状态回到0000。
十进制加法计数器电路图
实验代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jsq10 IS
PORT(CLK,RESET:IN STD_LOGIC;
Q:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
END jsq10;
ARCHITECTURE ONE OF jsq10 IS
BEGIN
PROCESS(CLK,RESET)
BEGIN
IF(RESET='0') THEN Q<="0000";
ELSIF(CLK' EVENT AND CLK='1') THEN
Q<="0000";
ELSE
Q<=Q+1;
END IF;
END IF;
END PROCESS;
END ONE;
(3)用VHDL语言设计一个电平锁存器,对程序进行编译和仿真,并记录仿真
波形。
提示:电平锁存器电路如右图所示。
当复位信
号q为低电平;当复位信号reset为低电平时,
如果s信号为高电平,输出信号q输出输入端
电平锁存器
data的值;当复位信号reset为低电平时,如果
s信号为低电平,输出信号保持原值。
实验代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY LATCHH IS
Port ( DATA,RESET,S: IN STD_LOGIC;
Q: OUT STD_LOGIC);
END LATCHH;
ARCHITECTURE BITT OF LATCHH IS
SIGNAL Q1:STD_LOGIC ; --类似于在芯片内部定义一个数据的暂存节
点
BEGIN
PROCESS(DATA,RESET,S)
BEGIN
Q<='0';
Q1<='0';
ELSIF(S='1')THEN
Q1<=DATA;
Q<=DATA;
ELSE
Q<=Q1;
END IF;
END PROCESS;
END BITT;
四、实验要求
熟练掌握运用VHDL语言进行组合逻辑电路设计的基本方法。
五、实验结果
(1)D触发器
在Quartus II建立工程并输入代码,经编译后波形图如下所示:
D触发器实验波形图
实验分析:
如图所示,当时钟信号输入端CLK接收到上升沿信号时,输入端D的信号被传送到输出端Q输出,否则输出端Q维持原来的状态不变。
在0~5ns内,虽然CLK电平中间有过一次翻转,但输入端D始终为低电平,所以输出端Q为低电平;在5ns~10ns,时钟信号有一次翻转,此时D为高电平,因此输出端Q为1.
(2)十进制加法器
在Quartus II 建立工程并输入代码,经编译后波形图如下所示:
实验分析:
如图所示,CLK 是时钟信号,Q0、Q1、Q2和Q3是从低到高的4位二进制数,在时钟信号的驱动下,计数器进行累加,每次加1,其输出状态由0000变化到1001,加满回零。
当复位输入端reset 为低电平时,计数器复位,输出状态回到0000。
在0~10ns 内,由于复位输入端RESET 为低电平,因此虽然时钟信号CLK 有输入,但计数器无法进行累加;在10ns~20ns 内,复位输入端为“1”,此时时钟信号CLK 有效,计数器进行累加计数。
(3)电平锁存器
在Quartus II 建立工程并输入代码,经编译后波形图如下所示:
实验分析:
在10ns~20ns ,复位信号reset 为高电平,锁存器被复位,输出信号q 为低电平;在0~10ns ,复位信号reset 为低电平时,如果s 信号为高电平,输出信号q 输出输入端data 的值;当复位信号reset 为低电平时,如果s
信号为低电平,输
十进制加法器波形图
电平锁存器
出信号保持原值。
但由于最后时序的原因,未能实现最后一点。
六、实验总结
本次实验的主要内容是时序逻辑电路的VHDL实现,要求我们掌握VHD语言进行时序电路设计的方法,同时在实验一的基础上,进一步熟悉Quartus II软件的使用。
经过这两次实验,让我体会到只要愿意认真学,总会有收获。
例如本次实验前2个项目都是在参考程序的情况下完成的,项目3经过思考、结合前面的几个程序,就设计出了基本的轮廓。
此外,本次实验涉及到时序的问题比较多,个人主观认为特别是在电平锁存器的“RESET为低,S为低,输出保持信号保持原值”这个状态下,设计程序应该没问题,但是发现RESET、S同时由高电平变为低电平状态下,输出Q并未保持原输出,而是跳变为0。
后来进行总结时,认为应该是在并列情况下由于有延迟导致程序逻辑没问题,但与实际情况条件不符,导致结果出错。