vhdl 参考答案 上机练习三:时序逻辑电路设计
- 格式:doc
- 大小:67.00 KB
- 文档页数:7
VHDL与复杂数字系统设计
上机实验3:时序逻辑电路的VHDL程序设计
一、实验目的:
1. 掌握在Max+plus II开发平台上,使用硬件描述语言设计电路的基本操作步骤;
2. 运用所学VHDL的描述语句完成一种时序逻辑电路的设计。
二、要点:
时序逻辑电路在电路结构上有两个显著特点:
第一,时序电路通常包含组合电路和存储电路两个组成部分,而且存储电路是必不可少的。第二,存储电路的输出状态必须反馈到组合电路的输入端,与输入信号一起,共同决定组合逻辑电路的输出。
时序电路的信号变化特点:
时序电路以时钟信号为驱动;电路内部信号的变化(或输出信号的变化)只发生在特定的时钟边沿;其他时刻输入信号的变化对电路不产生影响;
要点:执行条件的控制;
时钟边沿的检测;
1、执行条件的控制
采用进程描述可以有效控制执行条件,若进程以时钟信号(clk)为唯一敏感信号,则只有当时钟信号变化时,进程才执行;在其他时刻,任何输入信号的变化对电路(进程)不起作用;
模版1:
process(clock) --敏感信号表中只有时钟
begin
if rising_edge(clock) then --监测时钟上升沿,若用falling_edge(clock)
…… --则监测时钟下升沿。
end if;
end process;
例:时钟上升沿动作的D触发器
library ieee;
use ieee.std_logic_1164.all; entity dff1 is
port(clk, d: in std_logic;
q: out std_logic);
end dff1;
architecture rtl of dff1 is
begin
process(clk)
begin
if (clk'event and clk='1') then
q<=d;
end if;
end process;
end rtl;
时序逻辑电路的初始状态应由复位(或清零)信号来设置,根据复位信号对时序逻辑电路复位操作的不同,可分为同步复位和异步复位。
同步复位:复位信号有效,并且在给定的时钟边沿到来时,触发器才被复位。同步复位在以时钟为敏感信号的进程中定义,且用if 语句来描述复位条件。
模版2:
process(clock) --敏感信号表中只有时钟信号
begin
if rising_edge(clock) then --监测时钟边沿
if (reset_condition) then --监测同步复位信号的电平值
signal_out<=reset_value;
else
signal_out<= signal_in;
……
end if;
end if;
end process;
异步复位:复位信号一旦有效,时序逻辑电路立即回到初始状态。为实现异步复位,进程敏感信号表中时钟信号clk、复位信号reset同时存在;用if语句描述复位条件;在elsif段描述时钟边沿的条件。
模版3:
process(clock, reset) --敏感信号表中只有时钟和复位信号
begin
if (reset_condition) then --监测异步复位信号的电平值
……
elsif rising_edge(clock) then --监测时钟上升沿,若用falling_edge(clock)
…… --则监测时钟下升沿。
end if;
end process;
例:异步清零D触发器
process( clk,clr )
begin
if (clr = ‘0’ ) then
q<='0';
elsif (clk'event and clk='1') then
q<=d;
end if;
end process;
注:进程的敏感信号有时也可以采用wait语句替代。
2、时钟边沿的检测
为了确保电路状态只在时钟的特定边沿(上升/下降)发生变化,需要对时钟边沿进行检测;
VHDL通常采用属性语句检测时钟边沿;
与时钟有关的属性语句:
clk'event boolean clk有变化时为true;
clk'last_value clk在变化之前的值;
例:上升沿的检测:
clk'event and clk='1' ; clk'event and clk'last_value='0' ;
在由上升沿导致的进程执行时,上述两个表达式的值都为true;利用这种表达式构成条件语句中的关系判断,就可以保障电路状态在特定边沿变化;
三、实验任务:
从下列各题中任选一题完成。要求给出完整的VHDL语言程序,程序应包括:库和包集合说明(必要时)、实体和结构体;若使用了元件,要给出底层元件的VHDL语言描述;对程序进行编译、调试;对所设计电路进行功能仿真,给出仿真波形文件;进行适当分析。
1. 设计一个D锁存器,说明它与D触发器的区别,它们的区别具体是怎样在程序中体现的。按照如下引脚框图进行端口说明。
1) 程序
2) 仿真波形
3) 时序分析
2. 设计一个16位的寄存器,带有异步清零、时钟使能控制和输出三态控制功能。
各引脚功能如下:
CLK: 寄存器的时钟信号;
D[1..16]:输入需寄存的数据;
CLKEN: 时钟信号使能,在时钟条件满足的情况下,CLKEN为高电平时,存储数据D[1..16];
CLR:异步清零,高电平有效;
OE:输出使能,为高电平时,寄存数据从端口Q[1..16]输出,否则,端口Q[1..16]呈高阻态。
Q[1..16]:寄存器数据输出;
1) 程序
2) 仿真波形(需反映出CLKEN、OE信号、CLR 信号对于电路状态的影响)
3) 时序分析(电路工作频率、建立保持时间、延迟时间分析)
3. 设计一个4位二进制计数器74163,它具有同步清零、同步置数、计数控制和进位输出控制功能。
各端口功能如下:
CLK:时钟信号,上升沿计数;
CLRL:同步清零端,低电平有效;
LDL:同步置位控制端,低电平有效;
ENP:与ENT同时为‘1’时,计数使能;
ENT:为‘1’时,可进行进位;
D[3..0]:计数器置数输入;
Q[3..0]:计数器状态输出;
RCO:计数器进位输出。
1) 程序
2) 仿真波形(需反映出LDL 、ENT 、ENP 、CLRL对电路状态的影响)
3) 时序分析(电路工作频率、建立保持时间、延迟时间分析)
四、参考答案:
1. D锁存器
library ieee;
use ieee.std_logic_1164.all;
entity kdlatch is
port ( d,clk: in std_logic;
q: out std_logic);
end kdlatch;
architecture beh of kdlatch is
begin
process(clk,d)
begin
if clk='1' then q<=d;
end if; end process;
end beh;
2. 16位寄存器
library ieee;
use ieee.std_logic_1164.all;
entity kreg16 is
port ( clk,clken,oe,clr: in std_logic;
d:in std_logic_vector(1 to 16);
q: out std_logic_vector(1 to 16));
end kreg16;
architecture beh of kreg16 is
signal iq: std_logic_vector(1 to 16);
begin
process ( clk,clr,oe,iq)
begin
if clr='1' then iq<=(others=>'0');
elsif clk'event and clk='1' then
if clken = '1' then iq<=d; end if;
end if ;
if oe='1' then q <= iq;
else q<=(others=>'Z');
end if;
end process ;
end beh;
3. 4位二进制计数器74163
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity k74163 is
port ( clk, clrl, ldl, enp, ent: in std_logic;
d: in std_logic_vector(3 downto 0);
q: out std_logic_vector(3 downto 0);