资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
EDA 技 术 与 应 用第19讲 时序逻辑电路设计触发器计数器在时序电路中时钟信号是非常重要的,它是时序电路的执行条件和同步信号。在用VHDL描述时序逻辑电路时,通常采用时钟进程的形式来描述,也就是说,时序逻辑电路中进程的敏感信号是时钟信号。时钟作为敏感信号的描述方式有两种:1.时钟信号显示地出现在PROCESS语句后面的敏感信号表中。2. 时钟信号没有显示地出现在PROCESS语句后面的敏感信号表中,而是出现在WAIT语句的后面。在时序逻辑电路中,时钟是采用边沿来触发的,时钟边沿分为上升沿和下降沿。以下是这两种边沿的描述方式。对于上升沿,其物理意义是指时钟信号的逻辑值是从0跳变到1。下面是时钟上升沿的几种描述形式: EDA 技 术 与 应 用上升沿描述:描述1:label1:PROCESS(clk)BEGINIF(clkEVENT AND clk = 1)THENAND PROCESS;描述2:label2:PROCESS(clk)BEGINWAIT UNTIL clk = 1;AND PROCESS; EDA 技 术 与 应 用下降沿描述:描述1:label1:PROCESS(clk)BEGINIF(clkEVENT AND clk = 0)THENAND PROCESS;描述2:label2:PROCESS(clk)BEGINWAIT UNTIL clk = 0;AND PROCESS; EDA 技 术 与 应 用EDA 技 术 与 应 用时序逻辑电路设计 一)时序电路特殊信号的描述时钟信号和复位信号1、时钟信号描述常用的描述方式:1)进程的敏感信号是时钟信号,在 进程内部用if 语句描述时钟的边沿条件 。EDA 技 术 与 应 用如:process (clock_signal)beginif (clock_edge_condition) thensignal_out = signal_in ;其它时序语句end if ;end process ; EDA 技 术 与 应 用2)在进程中用wait until语句描述时钟信号,此时进程将没有敏感信号。如:process beginwait until (clock_edge_condition);signal_out = signal_in ;其它时序语句end process ; EDA 技 术 与 应 用注意:a.在对时钟边沿说明时,一定要注明是上升沿还是下降沿。b.一个进程中只能描述一个时钟信号。c.wait until 语句只能放在进程的最前面或最后面。3)时钟边沿的描述时钟上升沿:(clockevent and clock = 1)时钟下降沿:(clockevent and clock = 0) EDA 技 术 与 应 用2、触发器的复位信号描述1)同步复位:在只有以时钟为敏感信号的进程中定义。如:process (clock_signal)beginif (clock_edge_condition) thenif (reset_condition) thensignal_out = reset_value;elsesignal_out = signal_in ;end if ;end if ;end process ; EDA 技 术 与 应 用2)异步复位:进程的敏感信号表中除时钟信号外,还有复位信号。如:process (reset_signal, clock_signal)beginif (reset_condition) thensignal_out = reset_value;elsif (clock_edge_condition) thensignal_out = signal_in ; end if ;end process ; EDA 技 术 与 应 用二) 常用时序电路设计1、触发器(Flip_Flop) -1)D触发器EDA 技 术 与 应 用异步置位/复位D触发器EDA 技 术 与 应 用同步复位D触发器EDA 技 术 与 应 用比较:异步置位的锁存器(Latch)EDA 技 术 与 应 用library ieee;use ieee.std_logic_1164.all;entity t_ff isport(t, clk : in std_logic;q : buffer std_logic);end t_ff;architecture rtl of t_ff isbeginprocess(clk)beginif clkevent and clk=1 thenif t=1 thenq=not q;elseq=q;end if;end process;end rtl;TClkQQ2)T触发器EDA 技 术 与 应 用library ieee;use ieee.std_logic_1164.all;entity rs_ff isport(r, s, clk : in std_logic;q, qn : buffer std_logic);end rs_ff;architecture rtl of rs_ff isbegin process(r, s, clk)beginif clkevent and clk=1 thenif s = 1 and r = 0 then q=0; qn=1;elsif s=0 and r=1 then q=1; qn=0;elsif s=0 and r=0 then q=q; qn=q n;else null;end if;end if;end process;end rtl;SClkQQR SRQQn00QQn 0110 1001 113)RS触发器EDA 技 术 与 应 用4) JK触发器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY JKff_v1 ISPORT(J,K: IN STD_LOGIC; clk: IN STD_LOGIC;set: IN STD_LOGIC;reset: IN STD_LOGIC;Q,QB: OUT STD_LOGIC);END JKff_v1;ARCHITECTURE behave OF JKff_v1 ISSIGNAL Q_temp,QB_temp: STD_LOGIC;EDA 技 术 与 应 用BEGINPROCESS (clk,set,reset)BEGINIF (set =0 AND reset =1)THENQ_temp = 1;QB_temp = 0;ELSIF (set =1 AND reset =0)THENQ_temp = 0;QB_temp = 1;ELSIF (clkEVENT AND clk = 1)THENIF(J=0 AND K=1)THENQ_temp = 0;QB_temp = 1;EDA 技 术 与 应 用ELSIF(J=1 AND K=0)THENQ_temp = 1;QB_temp = 0;ELSIF(J=1 AND K=1)THENQ_temp = NOT Q_temp ;QB_temp = NOT QB_temp;END IF;END IF;Q = Q_temp;QB = QB_temp;END PROCESS;END behave;EDA 技 术 与 应 用JK触发器仿真波形EDA 技 术 与 应 用3、计数器计数器分为:同步计数器异步计数器(1)同步计数器同步计数器指在时钟脉冲(计数脉冲)的控制下,构成计数器的各触发器状态同时发生变化的计数器。EDA 技 术 与 应 用带允许端的十二进制计数器EDA 技 术 与 应 用可逆计数器(加减计数器)EDA 技 术 与 应 用可逆计数器仿真结果:EDA 技 术 与 应 用例:六十进制(分、秒)计数器EDA 技 术 与 应 用EDA 技 术 与 应 用60进制计数器仿真结果:EDA 技 术 与 应 用(2)异步计数器异步计数器又称为行波计数器,它的低位计数器的输出作为高位计数器的时钟信号。异步计数器采用行波计数,使计数延迟增加,计数器工作频率较低。描述异步计数器与同步计数器的不同主要体现在对各级时钟脉冲的描述上。EDA 技 术 与 应 用例:由8个触发器构成的行波计数器:EDA 技 术 与 应 用基本元件 dffr 的描述:EDA 技 术 与 应 用采用元件例化描述8位行波计数器:EDA 技 术 与 应 用8 位行波计数器仿真结果:6.2 60进制递增计数器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY cntm60v ISPORT( en : IN std_logic;clear : IN std_logic;load : IN std_logic; dl,dh : IN std_logic_vector(3 downto 0);clk : IN std_logic;cout : out std_logic;ql : buffer std_logic_vector(3 downto 0);qh : buffer std_logic_vector(3 downto 0) );EDA 技 术 与 应 用EDA 技 术 与 应 用END cntm60v;ARCHITECTURE behave OF cntm60v ISsignal ent2 : std_logic;BEGIN PROCESS (clk)VARIABLE tmpl,tmph :std_logic_vector(3 downto 0);BEGINIF(clear=0) THENtmpl:=“0000“;tmph:=“0000”; - -异步清零ELSIF(clkEVENT AND clk = 1) THEN IF load=0 THENtmpl:=dl;tmph:=dh; - - 同步置数elsif(en=1) thenif (tmpl=“1001“) thentmpl:=“0000”; - -个位计数器9+1=0 if(tmph=“0101“) thentmph:=“0000”; - -十位计数器5+1=0 59+1=0else tmph:=tmph+1;end if;elsetmpl:=tmpl+1; end if; EDA 技 术 与 应 用end IF; -end lf (load)END IF; -end if clearql = tmpl;ent2 = tmpl(3) and tmpl(0) and en; qh=tmph;cout=tmph(2) and tmph(0) and ent2; - -计数器为59时进位信号 cout 输出1。END PROCESS
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号