第四章 时序逻辑电路主讲人:徐向民教授本章内容概述锁存器的设计触发器的设计寄存器的设计计数器的设计乘法器的设计时序逻辑电路时序逻辑电路时序逻 辑电路是一种输出不仅与当前的输入有关,而且与其输出状态的原始状态有关的电路。相当于在组合逻辑的输入端加上了一个反馈输入,在其电路中 有一个存储电路,可以将输出的状态保持住。数字电路按其完成逻辑功能的不同特点,划分为组合逻辑电路和时序逻辑电路两大类。结构框图时序逻 辑电路——概述时序逻辑电路——有记忆功能从逻辑上讲,时序电路在任一时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关从结 构上讲,时序电路不仅仅由逻辑门组成,还包含有存储信息的有记忆能力的电路:触发器、寄存器等时序逻辑电路——概述由于时序逻辑电路,包含 的存储电路,因此不能采用组合逻辑电路的描述方式。时序电路引进了现态和次态的概念。使用逻辑表达式进行描述。描述方式如下:逻辑关系:输 出方程驱动方程驱动方程时序逻辑电路——概述时序电路的分类 没有统一的时钟脉冲信号,各触发器状态的变化不是同时发生,而是有先有 后。按照触发器的动作特点同步时序逻辑电路异步时序逻辑电路 所有触发器的状态变化都是在同一时钟信号作用下同时发生的。 输 出状态仅与存储电路的状态Q有关,而与输入X无直接关系。或者没有单独的输出。按照输出信号的特点米里(Mealy)型摩尔(Moore) 型 输出状态不仅与存储电路的状态Q有关,而且与外部输入X也有关。时序逻辑电路——概述同步时序逻辑电路所有的存储元件都在时钟脉 冲CP统一控制下,用触发器作为存储元件。只有一个“时钟信号”,所有的内部存储器,只会在时钟的边沿时候改变。所有的CP是接在一起的, 所以同时动作时序逻辑电路——概述几乎现在所有的时序逻辑都是“同步逻辑”优点:简单。每个电路里的运算必须要在时钟的两个脉冲之间固定的 间隔内完成,称为一个时钟周期。满足该条件下的电路是可靠的。同步时序逻辑电路缺点:功耗大,时钟是高频率信号,而时钟必须分布到各个触发 器而不管触发器是否要工作频率低,最大的时钟频率是由电路中最慢的逻辑路径(关键路径)决定的,因此限制了工作的最高频率(Pipelin ing流水线)时序逻辑电路——概述异步时序逻辑电路异步时序逻辑是设计上困难度最高的。最基本的储存元件是锁存器。锁存器可以在任何时间 改变它的状态,依照其它的锁存器信号的变动,它们新的状态就会被产生出来。异步电路的复杂度随着逻辑门的增加,而复杂性也快速的增加,因此 他们大部分仅仅使用在小的应用。时序脉冲只接入了第一块触发器,异步动作时序逻辑电路——概述锁存器的设计时序逻辑电路——锁存器锁存器为 了与触发器相类比,我们先介绍锁存器。锁存器是一种电平敏感的寄存器,典型的例子有RS锁存器与D锁存器。RS锁存器:?真值表:?电路结 构图:时序逻辑电路——锁存器Library ieee;Use ieee.std_logic_1164.all;Entity SR_latch2 is port ( S, R: in std_logic ; Q, Qba r :out std_logic);End SR_latch2;Architecture behav of R_lat ch2 isBegin process ( R , S ) is variable rs: std_logic_vec tor(1 downto 0);begin rs:=R&S; case rs is whe n "00" => Q<=''1''; Qbar<=''1''; when "01" => Q<=''1''; Qbar<= ''0''; when "10" => Q<=''0''; Qbar<=''1''; when other s=>null; end case; end process;end behav;注意:顺序结构中的Null状态等 同于并行结构中的Unaffected。时序逻辑电路——锁存器由图可见,由于在时序仿真中有器件的延时,锁存器的状态变化迟于输入信号的 变化RS锁存器的仿真波形如下:时序逻辑电路——锁存器D锁存器D锁存器与RS锁存器类似,只是在功能上实现的目的不同。?VHDL描述: Library ieee;Use ieee.std_logic_1164.all;Entity D_latch is port ( D, Enable: in std_logic ; Q: out std_log ic );End D_latch;Architecture behav of D_latch isBegin process(D, Enable) begin if (Enable=‘1’) then Q <=D; end if; end process;End behav;点评:D锁存器通过条件涵 盖不完整的if语句 产生寄存器;敏感参数表包含D、Enable,综合后 形成一个电平触发的锁存器时序逻辑电路——锁存器D锁存器的 仿真波形如下:当ENABLE=‘1’时,Q输出为D的输入值,否则Q保持不变。时序逻辑电路——锁存器触发器触发器是指边沿触发的寄存器 ,常见的有D型,JK型,T型。在描述触发器前要注意时钟上升沿的描述 D触发器是最常用的触发器,几乎所有的逻辑电路都可以描 述成D触发器与组合逻辑电路?D触发器:时序逻辑电路——触发器触发器的VHDL描述(上升沿)Library ieee;Use iee e.std_logic_1164.all;Entity D_FF1 is port ( D, clk: in std_log ic; Q: out std_logic);End D_FF1; Architecture behav of D_FF1 isBegin --方法一process(clk) begin if ( clk’s event and clk=‘1’) then Q<=D; end if; en d process;End behav; --方法二process begin wait u ntil (clk=‘1’) ; --等同于 wait until clk’event and clk=‘1’; Q<=D; end process;End behav;方法二 process(clk) beg in if (clk=‘1’) then Q<=D; --利用进程启动特性产生对clk的边沿检测 end if ; end process; end behav;时序逻辑电路——触发器触发器的仿真波形如下当时钟上升沿到来时,把D的值赋给Q,之后保持不变。到下一个时钟上升沿到来时 ,再次把D的值赋给Q。时序逻辑电路——触发器时钟边沿检测的三种方法方法一: 上升沿:clock’ event and clock=‘1’ 下降沿:clock’ event and clock=‘0’;注意:if clock’ eve nt and clock=‘1’语句后面不存在else分支。当clock为std_logic类型时,也可以利用 if rising _edge(clk)或If falling_edge(clk)进行时钟边沿检测。方法二: 利用WAIT语句启动进程,检 测colck的上升沿。方法三:使用PROCESS语句和IF语句相结合实现。当colck发生跳变的时候启动PROCESS进程,而在执 行IF语句时,满足clock=‘1’时才对Q进行赋值更新,所以相当于clock发生跳变且跳变为‘1’时,将D赋给Q,实际上就是D出 发器的描述。时序逻辑电路——触发器带有Q非的D触发器由下图可知,与D触发器相比,该触发器多了Qbar与低电平有效的异步复位信号带有 Q非的D触发器带有Qbar的D触发器D触发器时序逻辑电路——触发器带有Q非的D触发器应该如何描述?ENTITY D_FF IS PORT(D,clock:IN std_logic; Q,Qbar:OUT std_l ogic;)END D_FF;ARCHIECHTURE behav OF D_FF ISBAGIN PROCES S(clock) IF rising_edge(clock) THEN Q<= D; Qbar<= NOT D; END IF; END PROCESS;END behav; 错误:在时钟上升沿下有两个赋值,这样就会引入两个D触发器而不是一个触发器。时序逻辑电路——触发器带有Q非的D触发器应 该如何描述?正确描述一(信号法)Architecture sig of D_FF is signal state: st d_logic ;Begin process( clock, reset) begin if (reset= ‘0’) then state<=‘0’; else if rising _edge(clock) then state<=D; end if; end p rocess; Q<=state; Qbar<=not state ; End sig;时序 逻辑电路——触发器带有Q非的D触发器应该如何描述?正确描述二(变量法)Architecture var of D_FF is Be gin process(clock, reset) variable state: std_logic ; begin if (reset=‘0’) then state:=‘0’; elsif rising_edge(clock) then state:=D; end if; Q<=state; Qbar<=not state; end process;End var;点评: 当state定义为变量时,其有效范围在process内。因此,Q和Q非的赋值语句只能放在process里面。时序逻辑电路——触发器 带有Q非的D触发器的仿真信号法的仿真波形:变量法的仿真波形:时序逻辑电路——触发器JK触发器?真值表:?JK触发器:时序逻辑电路— —触发器JK触发器的VHDL描述Entity JK_FF is port ( J, K: in std_logic; clock,reset:in std_logic; Q, Qbar : ou t std_logic );End JK_FF; Architecture behav of JK_FF is signal state : std_logic ;Begin process( clock, reset) is variable jk: std_logic_vector(1 downto 0); begin jk:=J&K; if (reset=‘0’) then state<=‘0’; elsif rising_edge(clock) then case jk is when “11”=> state<=not state; when “10”=> state<=‘1’; when “01”=> state<=‘0’; when others => null; end case; end if;end process; Q<=state; Qbar<=not state ;end behav;注意:CASE语句要完整,所以在CASE JK的时候要加when others =>null; 时序逻辑电路——触发器JK触发器的仿真可见仿真波形与真值表一致。时序逻辑电路——触发器T触发器?真值表:?JK触发器:时序逻辑电路 ——触发器Entity T_FF is port ( T, clock, reset : in std_logic ; Q, Qbar : out std_logic );End T_FF;Architecture b ehav of T_FF isBegin process(clock, reset) var iable state: std_logic ; begin if (reset = ‘0’) then state:=‘0’; elsif rising_edge(clock) then if T=‘1’then state := not stat e; end if; end if ; Q<=state ; Qbar<= not state; end process;End behav ; T触发 器的VHDL描述:时序逻辑电路——触发器T触发器的仿真波形如下:可见仿真波形与真值表一致。时序逻辑电路——触发器寄存器的设计时序逻 辑电路——寄存器多位寄存器: 一个D触发器就是一位寄存器,如果需要多位寄存器,就要用多个D触发器构成。时序逻辑电路—— 寄存器Entity reg is generic( n: natural :=4 ); --实体类属中的常数 port ( D: in std_logic_vector(n-1 downto 0); clock, reset : in std_logic; Q: out std_logic_vector (n-1 downto 0) );End reg ;Architec ture behav of reg isBegin process(clock, reset) begin if (reset=‘0’) then Q<=( others=>‘0’); --表示Q赋全‘0’ elsif rising_edge(clock) then Q<=D; e nd if; end process;End behav ;多位寄存器的VHDL描述:时序逻辑电路——寄存器移位寄存 器:我们这里讨论的是串进并出的移位寄存器,即串行输入,在时钟的边沿移位进寄存器,形成并行输出时序逻辑电路——寄存器串进并出的移位寄 存器的VHDL描述: Entity sipo is generic( n : natural :=8); port ( a : in std_logic ; q: out std_logic_vect or(n-1 downto 0); clk : in std_logic );End sipo;A rchitecture behav of sipo isBegin process(clk) variable reg : std_logic_vector(n-1 downto 0); begin if risi ng_edge(clk) then reg : = reg ( n-2 downto 0) & a ; --左移移位寄存器; -- reg : = a & reg (n-1 downto 1); 右移移位寄存器 end if ; q<= reg ; end process;End behav;时序逻辑电路——寄存器串进并出的位寄存器的仿真 输入8位数据111001 00,从仿真波形可以看出,8位数据是从低位左移存储到寄存器中的。时序逻辑电路——寄存器 计数器的设计时序逻辑电路——计数器计数器的 作用主要是对脉冲的个数进行技术,以实现测量、计数和控制的功能,同时兼有分频功能。比如七位计数器,可对输入时钟进行七分频。时序逻辑电 路——计数器计数器计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路计数器的实现 Library ieee ;Use i eee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity cou nter is generic( n: natural :=4); port ( clk : in std_lo gic; reset : in std_logic ; count : o ut std_logic_vector(n-1 downto 0) );End counter;1、用“+”函数描述:时序逻辑电路 ——计数器计数器的实现 architecture ripple of counter is component T_FF is port( T : in std_logic ; clk:in std_logic; reset:in std_logic; Q : out std_logic; Qbar:out std_logic); end component ; --将前面描述好的T触发器定义为元件; signal carry: st d_logic_vector( n downto 0);Begin carry(0)<=clk; g0: for i in 0 to n-1 generate --循环 T1: T_ FF port map ( ‘1’, carry( i ), reset, count( i ), carry( i+1 ) ); end generate g0;End ripple ;时序逻辑电路——计数器计数器的实现 g0: for i in 0 to n-1 generate --循环 T1: T_FF port map ( ‘1’, carry( i ), reset, count( i ), carry( i+1 ) );可以分解成: T0: T_FF port map ( ‘1’, carry( 0 ), reset, count( 0 ), carry(1 ) ); T1: T_FF port map ( ‘1’, carry( 1 ), reset, count( 1 ), carry ( 2 ) );T2: T_FF port map ( ‘1’, carry( 2 ), reset, count( 2 ), c arry( 3 ) );T3: T_FF port map ( ‘1’, carry( 3 ), reset, count( 3 ), carry( 4 ) );……………………………………………………Tn-1: T_FF port map ( ‘1’, c arry( n-1 ), reset, count( n-1 ), co );上例程序中的循环:时序逻辑电路——计数器计数器的仿真 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形:①②注意:这里我们可以发现在奇数变为偶数的时候有一个小小的 变化。时 序逻辑电路——计数器计数器的仿真 ①②信号赋值的时候有延迟,在计数器由001变为010的时候,先是由count(0)<=0;car ry(1)<=1; -第一步count(1)<=1;所以count会先变为000,接着延迟一段时间后才变为010。同理, 对于011变为100的时候,有:count(0)<=0;carry(1)<=1; -第一步count(1)<=0;carry(2)<=1; -第二步count(2)<=1; -第三步故从011变为010,再变为100。时序逻辑电路——计数器乘法器的设计时序逻辑电路——乘法器利用一个r位的加法器(可控全加器)与2r位的移位寄存器(累加移位寄存器+乘数移位寄存器)组成r位乘法器。 时序逻辑电路——乘法器无符号数乘法器根据乘数的每一位是否为1进行计算,若为1则将被乘数移位相加。这种方法硬件资源耗用较少。以8位移位相加乘法器为例,其实现过程如下。先对乘数的最低位进行判断是否为1。如果为1,则把被乘数相加,然后被乘数向高位移1位,乘数向低位移1位;如果为0,则被乘数不相加而仍然向高位移1位,乘数向低位移1位。如此循环判断8次,结束运算实现代码见书本 D锁存器是电平敏感的寄存器,通过条件不完整的if语句产生寄存器,并且敏感参数表中包含D。D触发器是上升沿触发的寄存器,通过条件不完整的if语句产生寄存器,并且敏感参数表中不包含D。时钟上升沿的三种检测方法Clock’event and clock=‘1’;利用wait语句;由process语句和if语句结合实现。为了避免多余的寄存器引入,信号的赋值放在process语句外面,而变量的有效范围在process里面,其赋值语句只能放在process里面。时序逻辑电路——总结 |
|