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);