时序电路的ⅤHDL设计 时序电路的结构与特点 p.552图7-37 存当状态出正 时序电路的信号变化特点: 同步时序电路以时钟信号为驱动:电路内部信号的变化 (或输出信号的变化)只发生在特定的时钟边沿:其他时刻 输入信号的变化对电路不产生影响; 要点:执行条件的控制; 时钟边沿的检测 执行条件的控制 采用进程描述可以有效控制执行条件,若进程以时钟信 号(clk)为唯一敏感信号,则只有当时钟信号变化时,进程 才执行;在其他时刻,任何输入信号的变化对电路(进程) 不起作用 时钟边沿的检测 为了确保电路状态只在时钟的特定边沿(上升/下降)发 生变化,需要对时钟边沿进行检测
时序电路的 VHDL 设计 时序电路的结构与特点 p.552 图 7-37 时序电路的信号变化特点: 同步时序电路以时钟信号为驱动;电路内部信号的变化 (或输出信号的变化)只发生在特定的时钟边沿;其他时刻 输入信号的变化对电路不产生影响; 要点:执行条件的控制; 时钟边沿的检测; 执行条件的控制 采用进程描述可以有效控制执行条件,若进程以时钟信 号(clk)为唯一敏感信号,则只有当时钟信号变化时,进程 才执行;在其他时刻,任何输入信号的变化对电路(进程) 不起作用; 时钟边沿的检测 为了确保电路状态只在时钟的特定边沿(上升/下降)发 生变化,需要对时钟边沿进行检测;
VHDL通常采用属性语句检测时钟边沿; 与时钟有关的属性语句: clk'event boolean 有变化时为tru clk'last value clk在变化之前的值 例:上升沿的检测: clk'event and clk='1 clk'event and clklast value=o 在由上升沿导致的进程执行时,上述两个表达式的值都 为tue;利用这种表达式构成条件语句中的关系判断,就可以 保障电路状态在特定边沿变化 注意:上述属性语句只能在子结构中应用(作为局部量); 例p643表738 D触发器的设计 方式1 use ieee std logic 1164. all port(d, clk: in std logic; q: out std logic); end koffi architecture beh of kdffl 进程采用wait语句,只在上升沿执行 wait until clk'event and clk='1
VHDL 通常采用属性语句检测时钟边沿; 与时钟有关的属性语句: clk'event boolean clk 有变化时为 true; clk'last_value clk 在变化之前的值; 例:上升沿的检测: clk'event and clk='1' ; clk'event and clk'last_value='0' ; 在由上升沿导致的进程执行时,上述两个表达式的值都 为 true;利用这种表达式构成条件语句中的关系判断,就可以 保障电路状态在特定边沿变化; 注意:上述属性语句只能在子结构中应用(作为局部量); 例 p.643 表 7-38 D 触发器的设计 方式 1 library ieee; use ieee.std_logic_1164.all; entity kdff1 is port ( d,clk: in std_logic; q: out std_logic); end kdff1; architecture beh of kdff1 is begin process --进程采用 wait 语句,只在上升沿执行; begin wait until clk'event and clk='1' ;
end process 方式2 architecture beh of kdff2 is process(clk)-进程采用敏感表,在上升/下降沿都执行; if clk'event and clk= Then q<=d;-赋值只在上升沿进行 else null end it end process: 例2p643表7-37 带复位端的D触发器的设计 library lee use ieee std logic 1164. all entity kdff2 is port(d, clk, clr: in std logic, ut std logic) end kdna architecture beh of kdff2 is process( clk, clr))-进程采用敏感表,执行的结果通过 -条件语句控制 if clra'l'then q<=o'; qn<= 复位信号优先于时钟 elsif clk event and clk='I'then q ot d end if end process
q<=d; end process; end beh; 方式 2 architecture beh of kdff2 is begin process(clk) --进程采用敏感表,在上升/下降沿都执行; begin if clk'event and clk='1' then q<=d; --赋值只在上升沿进行; else null; end if; end process; end beh; 例 2 p.643 表 7-37 带复位端的 D 触发器的设计 library ieee; use ieee.std_logic_1164.all; entity kdff2 is port ( d,clk,clr: in std_logic; q,qn: out std_logic); end kdff2; architecture beh of kdff2 is begin process (clk,clr) --进程采用敏感表,执行的结果通过 begin --条件语句控制; if clr='1' then q<='0' ;qn<='1'; --复位信号优先于时钟; elsif clk'event and clk='1' then q<=d; qn<= not d; end if; end process; end beh;
时序电路的基本单元设计 根据触发控制的不同,时序电路的基本单元主要有锁存 器( Latch)和触发器(fip-fop)两类 Latch锁存器:输出受时钟电平控制,在一段时间内可 受输入变化影响发生而变化;(电平控制) fip-fop触发器:输出只在时钟边沿时刻发生变化,输入 信号变化不能直接导致输出变化;(边沿控制) 目前数字集成电路中采用最多的时序单元器件为 D latch 和 D flip-flo 例p678表8-4 D latch的设计:在满足使能条件时将输入D传递给输出Q; library ieee use ieee std logic 1164 all entity klatch is port( d, clk: in std le g out std logic) end klatch architecture beh of klatch is process(clk, d) if clk='l'then q<=d end it end process end beh
时序电路的基本单元设计 根据触发控制的不同,时序电路的基本单元主要有锁存 器(Latch)和触发器(flip-flop)两类; Latch 锁存器:输出受时钟电平控制,在一段时间内可 受输入变化影响发生而变化;(电平控制) flip-flop 触发器:输出只在时钟边沿时刻发生变化,输入 信号变化不能直接导致输出变化;(边沿控制) 目前数字集成电路中采用最多的时序单元器件为 D latch 和 D flip-flop; 例 p.678 表 8-4 D latch 的设计:在满足使能条件时将输入 D 传递给输出 Q; 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;
该电路中,d和clk的任何变化都会导致进程执行:在clk 为1的时间段内,d的变化就会导致q的立即变化; 与Dnip-nop的比较:p679表86 process( clk 'event and clk='l then q<=d end if end process 如果ck没有变化或不等于1,则d的变化不会导致q的变化 在p678680,还列出了 D latch的结构设计、带有异步置 位和复位功能的 D flip-flop的设计 Register寄存器 寄存器通常由多位触发器连接而成,通常可分为锁存寄存 器和移位寄存器两类 例p680表88 16位锁存寄存器设计: 带有时钟使能控制和输出三态控制; library ieee use ieeestd logic 1164.all; entity kregl6 is port( clk, clken, oe,clr: in std logic d in std logic vector(l to 16) q: out std logic vector(I to 16));
该电路中,d 和 clk 的任何变化都会导致进程执行;在 clk 为 1 的时间段内,d 的变化就会导致 q 的立即变化; 与 D flip-flop 的比较:p.679 表 8-6 process ( clk ) begin if clk'event and clk='1' then q<=d; end if ; end process ; 如果 clk 没有变化或不等于 1,则 d 的变化不会导致 q 的变化; 在 p.678—680,还列出了 D latch 的结构设计、带有异步置 位和复位功能的 D flip-flop 的设计; Register 寄存器 寄存器通常由多位触发器连接而成,通常可分为锁存寄存 器和移位寄存器两类; 例 p.680 表 8-8 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));
nd kreg16 architecture beh of kregl6 is signal ig: std logic vector(I to 16); if clr='I'then iq0) elsif clk'event and clk=1' then coke I' then 1q <=d: end if if oe=I'then q<=iq: 多种功能的寄存器设计比较 use ieee std logic 1164. all; ntity regine port(d, clk, clr, pre,load, data: in bit q1, 2, 93, 94, q5, 96, q7: out bit); architecture beh of reginf is clk为1时寄存d wait until clk=1'ql<=d;,-利用ck上升沿传递信号 clk为0时寄存d
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'0'); elsif clk'event and clk='1' then if clken = '1' then iq'Z'); end if; end process ; end beh; 多种功能的寄存器设计比较 library ieee; use ieee.std_logic_1164.all; entity reginf is port(d,clk,clr,pre,load,data: in bit; q1,q2,q3,q4,q5,q6,q7: out bit); end reginf; architecture beh of reginf is begin -- clk 为 1 时寄存 d process begin wait until clk='1'; q1<=d; --利用 clk 上升沿传递信号; end process; -- clk 为 0 时寄存 d process
wait until clk=0,q2<=d,-利用clk下降沿传递信号 end process 带异步清零,ck上升沿时寄存d process(clk, clr) be if clr'I' then q3<=0 elsif clk'event and clk=I then q3<=d end if 带异步清零,clk下降沿时寄存d process(clk, clr if clr'I'then q4<=0 elsif clk'event and clk=o' then q4<=d end if end 带异步预置高电平功能,clk上升沿时寄存d process(clk, pre) if pre='l then q5 elsif clk'event and clk=lthen q5<=d end process 带异步预置数功能,clk上升沿时寄存d process(clk, load, data) if load=l'then g6<=data elsif clk'event and clk=I' then q6<=d; end process, 带异步预置高电平和清零功能,clk上升沿时寄存d process(clk, clr, pre)
begin wait until clk='0'; q2<=d; --利用 clk 下降沿传递信号; end process; -- 带异步清零,clk 上升沿时寄存 d process(clk,clr) begin if clr='1' then q3<='0'; elsif clk'event and clk='1' then q3<=d; end if; end process; -- 带异步清零,clk 下降沿时寄存 d process(clk,clr) begin if clr='1' then q4<='0'; elsif clk'event and clk='0' then q4<=d; end if; end process; --带异步预置高电平功能,clk 上升沿时寄存 d process(clk,pre) begin if pre='1' then q5<='1'; elsif clk'event and clk='1' then q5<=d; end if; end process; -- 带异步预置数功能,clk 上升沿时寄存 d process(clk,load,data) begin if load='1' then q6<=data; elsif clk'event and clk='1' then q6<=d; end if; end process; -- 带异步预置高电平和清零功能,clk 上升沿时寄存 d process(clk,clr,pre) begin
if clr'l'then q7<=0 elsif pre=l' then q7<= elsif clk'event and clk='I'then q7<=d end if end beh 一般时序电路(状态机)的设计 当的状态输 流水线存流水统 时钟输 时钟信号 Moore电路:输出完全由电路状态决定; Mealy电路:输出与外部输入直接相关;状态不变时输出可能 变化; More电路的设计思想 以状态转换图作为基础;对每一次触发条件,根据当前状态 和输入条件,决定下一状态;同时给出下一状态的输出 例简单的 Moore状态机设计 设计思想:采用type语句对不同状态进行定义;再将输出与 状态建立对应关系; I NPUT use ieee std logic 1164. all s0/0 S1/1 enti port(clk, input, reset: in std logic output: out std logic); architecture beh of statmach is type is(so, s1);
if clr='1' then q7<='0'; elsif pre='1' then q7<='1'; elsif clk'event and clk='1' then q7<=d; end if; end process; end beh; 一般时序电路(状态机)的设计 Moore 电路:输出完全由电路状态决定; Mealy 电路:输出与外部输入直接相关;状态不变时输出可能 变化; Moore 电路的设计思想 以状态转换图作为基础;对每一次触发条件,根据当前状态 和输入条件,决定下一状态;同时给出下一状态的输出; 例 简单的 Moore 状态机设计 设计思想:采用 type 语句对不同状态进行定义;再将输出与 状态建立对应关系; library ieee; use ieee.std_logic_1164.all; entity statmach is port(clk,input,reset: in std_logic; output: out std_logic); end statmach; architecture beh of statmach is type state_type is (s0,s1);
process(clk) if reset=l' then stst if input='I then st10 S2/11 ID=7 S4/11 S3/10 D=9 设计思路:采用二进制常数定义不同的状态;输出直接与状 态的后2位对应;先确定状态的变化,再将状态的后2位输 出 library ieee use ieee std logic 1164 all
signal st: state_type; begin process(clk) begin if reset='1' then stst if input='1' then st<=s0; else st<=s1; end if; end case; end if; end process; output<='1' when st=s1 else'0'; end beh; 例 Moore 状态机的设计 该状态机有 5 个状态,转换图如下所示:其中输入控制 ID 为 4 位二进制数,对应为 1 位 16 进制数; 设计思路:采用二进制常数定义不同的状态;输出直接与状 态的后 2 位对应;先确定状态的变化,再将状态的后 2 位输 出; library ieee; use ieee.std_logic_1164.all;
vector(3 downto 0); y: out std logic vector( I downto 0)); end moore2. architecture beh of moore2 signal st: std logic vector(2 downto 0) constant sO: std logic vector(2 downto 0): =000 constant sl: std logic vector(2 downto 0): =010 constant s2: std logic vector(2 downto 0): =01 constant s3: std logic vector(2 downto 0): =110 constant s4: std logic vector(2 downto 0): ="lll process(clk, rst) if rst='I' then st if id=x"3"then stst if id=x" 7"then st if id=x"7"then st if id=x"b"then stst<=s0 end case nd if y<=st(I downto 0)
entity moore2 is port(clk,rst: in std_logic; id: in std_logic_vector(3 downto 0); y: out std_logic_vector(1 downto 0)); end moore2; architecture beh of moore2 is signal st: std_logic_vector(2 downto 0); constant s0:std_logic_vector(2 downto 0):="000"; constant s1:std_logic_vector(2 downto 0):="010"; constant s2:std_logic_vector(2 downto 0):="011"; constant s3:std_logic_vector(2 downto 0):="110"; constant s4:std_logic_vector(2 downto 0):="111"; begin process(clk,rst) begin if rst='1' then st if id=x"3" then st st if id=x"7" then st if id=x"7" then st if id=x"b" then stst<=s0; end case; end if; end process; y<=st(1 downto 0); end beh;