时序电路的结构与特点内部含有存储器件(触发器、锁存器);
信号变化受时钟控制;
通常采用状态变化进行描述;
采用进程进行设计;
时序运算模块的 VHDL设计同步时序电路的信号变化特点同步时序电路以时钟信号为驱动;
电路内部信号的变化(或输出信号的变化)
只发生在特定的时钟边沿;
设计要点:
时钟边沿的检测;
输出赋值的控制:是否改变、如何改变。
同步时序电路的时钟控制采用进程描述可以有效控制执行条件,进程中的条件控制可以将时钟信号( clk)做为控制信号,只有当时钟信号变化时,进程才执行;在时钟条件不满足时,任何输入信号的变化对电路(进程)不起作用;
VHDL中的时钟检测方式
VHDL通常采用属性语句检测时钟边沿;
与时钟有关的属性语句:
clk'event,boolean,clk有变化时为 true;
clk‘last_value,bit,clk在变化之前的值;
注意:上述属性语句只能在子结构中应用
(作为局部量)。
VHDL中的时钟检测方式例:上升沿的检测:
clk'event and clk='1' ;
clk'event and clk'last_value='0' ;
在由上升沿导致的进程执行时,上述两个表达式的值都为 true;而在由其他输入变化导致的进程执行时,上述表达式的值就是 faith;
时序电路的基本单元设计
Latch:输出受时钟电平控制,在一段时间内可受输入变化影响发生而变化;(电平控制)
flip-flop:输出只在时钟边沿时刻发生变化,
输入信号变化不能直接导致输出变化;(边沿控制)
时序电路的基本单元设计例,D latch的设计 p.678 表 8-4
process(clk,d)
begin
if clk='1' then q<=d;
end if;
end process;
d和 clk的任何变化都会导致进程执行;
仅当 clk为 1时,d的变化才会导致 q的变化;
时序电路的基本单元设计例,D flip-flop的设计,p.679 表 8-6
process (clk,d )
begin
if clk'event and clk='1' then q<=d;
end if ;
end process ;
d和 clk的任何变化都会导致进程执行;
只有在 clk上升沿引发的进程执行中,d的变化才会导致 q的变化;
时序电路的基本单元设计触发沿选择与清零设置问题:
process(clk,clr)
begin
if clr='1' then q<='0';
elsif clk'event and clk='1' then q<=d;
end if;
end process;
异步清零,上升沿触发;
时序电路的基本单元设计触发沿选择与清零设置问题:
process(clk,clr)
begin
if clk'event and clk='0'
if clr='0' then q<='0';
else q<=d;
end if;
end if;
end process;
下降沿触发,同步清零;
时序电路的基本单元设计采用 wait语句进行时钟检测:
process
begin
wait on clk;
if clk='1' then q<=d;
end if ;
end process ;
时序电路的基本单元设计采用 wait语句进行时钟检测:
process
begin
wait until clk='0'; q<=d;
end process;
关于寄存器生成的控制问题寄存器的作用是在输入信号变化时,保持输出信号不变;当程序设计中隐含这一要求时,
就会在综合时引入寄存器;
寄存器只在满足一定条件时才允许改变输出值,因此只能通过条件判断语句才会引入寄存器;
关于寄存器生成的控制问题例 1:寄存器的引入
process(clk,d)
begin
if clk='1' then q<=d; else q<='0';
end if;
end process;
关于寄存器生成的控制问题例 1:寄存器的引入
process(clk,d)
begin
if clk='1' then q<=d; else q<='0';
end if;
end process;
关于寄存器生成的控制问题例 2:双输出 D触发器的设计比较:
library ieee;use ieee.std_logic_1164.all;
entity vdffqqn is port (d,clk,in std_logic;
q,qn,out std_logic);
end vdffqqn;
architecture beh of vdffqqn is
signal qi:std_logic;
begin
process
end beh;
关于寄存器生成的控制问题例 2:双输出 D触发器的设计比较 1:
process(clk)
begin
if (clk'event and clk='1') then
qi <= d;
q <= qi;
qn <= not qi;
end if;
end process;
关于寄存器生成的控制问题例 2:双输出 D触发器的设计比较 2:
process(clk)
begin
if (clk'event and clk='1') then
qi<=d;
q<=d;
qn<=not qi;
end if;
end process;
关于寄存器生成的控制问题例 2:双输出 D触发器的设计比较 3:
process(clk)
begin
if (clk'event and clk='1') then
q <= d;
qn<= not d;
end if;
end process;
关于寄存器生成的控制问题例 2:双输出 D触发器的设计比较 4:
process(clk)
begin
if (clk'event and clk='1') then
qi<=d;
end if;
q<= qi;
qn<= not qi;
end process;
关于寄存器的设计准则
( 1)一个进程中只引入一个寄存器
(组);只含有一条时间测试语句;只对时间的一个边沿进行测试;
( 2)引入寄存器的优选语句应该是
IF/THEN语句,因为该语句更容易控制寄存器的引入;在该语句中只应设置一条边沿测试描述分句;
关于寄存器的设计准则
( 3)严格控制带时间测试语句的 IF/THEN
语句中赋值语句的数量,将不必要的语句放到该语句以外;
( 4)在各类条件控制语句中,注意控制条件的完整性,避免因漏掉条件而生成寄存器;
( 5)在过程中不能设计寄存器。
寄存器的设计实例
16位锁存寄存器设计 p.680 表 8-8
带有时钟使能控制和输出三态控制;
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;