2.6 复位电路设计思想
2.6.1 同步复位
同步复位的复位信号仅在时钟的上升沿有效,不容易产生由干扰导致的误动作,具有良好的稳定性。复位信号加在触发器的D输入端。对应的VHDL硬件描述应该把复位信息放在if/else的if模块中,而其他的逻辑处理放在else模块中。
1. 编码方式及典型电路
同步复位采用if/else 优先编码,但是在这种情况下如果编码不是很严格,会产生两个问题:
(1)在一些基于逻辑等式的仿真器中,组合逻辑会阻碍复位信号到达触发器。
(2)由于复位树的高扇出会使复位信号相对于时钟信号是一个“晚到达信号”。
下面是一个带同步复位和加载信号的8 位计数器的例子,图2-41为其综合电路。需要注意的是,reset 信号不包含在敏感信号列表中,同时reset 信号在if/then 的编码方式中具有最高优先权。
例2-7 同步复位计数器的VHDL编码。
library ieee; use ieee.std logic 1164.all; use ieee.std logic unsigned.all; entity ctr8sr is prot ( clk :in std logic; rst n :in std logic; d :in std logic; ld :in std logic; q :out std logic vector(7 downto 0); co :out std logic); end ctr8sr;
architecture rtl of ctr8sr is signal count:std logic vector(8 downto 0); begin co<=count(8); q<=count(7 downto 0); process(clk) begin if(clk′event and clk=′1′)then if(rst n=′0′)then count<=(others=>′0′); --sync reset elsif(ld=′1′)then count<=′0′&d; --sync load else count<=count+1; --sync increment end if; end if; end process; end rtl;
图2-41 同步复位计数器的综合电路
2. 同步复位的优、缺点
(1)同步复位的优点:
① 同步复位可以保证设计100%同步。
②同步复位可以确保复位仅在时钟信号的有效沿发生,时钟起到了过滤复位信号小毛刺的作用。然而,如果这些抖动在时钟沿附近发生,则触发器有可能出现亚稳态。
③ 同步复位易于进行基于周期的仿真。
(2)同步复位的缺点:
①同步复位需要一个脉冲延展器来保证复位信号具有一定的脉冲宽度,以确保能够在时钟的有效沿被采样到。
②进行多时钟设计时,复位脉冲宽度是需要重点考虑的一点,可以通过计数器来实现复位信号的多周期宽度。
③ 在仿真过程中,同步复位信号有可能被X 态掩盖。
④ 如果ASIC 或FPGA 含有内部三态总线,为防止内部三态总线在芯片加电时的竞争,同步复位的芯片必须有一个上电异步复位。
2.6.2 异步复位
对异步复位处理不当会造成严重的设计后果。设计者进行复位设计的初衷是想把电路复位到一个可知状态,然而往往会忽视异步复位的最大问题——复位释放。由于异步复位引脚一般直接连在触发器上,而且通常是低电平有效,所以有可能会导致亚稳态的出现。
1. 编码方式及典型电路
与同步复位信号编码方式不同的是,在异步复位中,复位信号reset 包含在敏感列表中。为了能够得到正确的异步复位触发器,敏感列表应当仅在复位信号的上升沿或下降沿有效。下面是一个带异步复位的8 位计数器的例子,图2-42为其综合电路。
图2-42 异步复位计数器的综合电路
例2-8 异步复位计数器的VHDL编码。
library ieee; use ieee.std logic 1164.all; use ieee.std logic unsigned.all; entity ctr8ar is port( clk :in std logic; rst n :in std logic; d :in std logic; ld :in std logic; q :out std logic vector(7 downto 0); co :out std logic); end ctr8ar; architecture rtl of ctr8ar is signal count:std logic vector(8 downto 0); begin co<=count(8); q<=count(7 downto 0); process(clk) begin if(rst n=′0′)then count<=(others=>′0′); --sync reset
elsif(clk′event and clk=′1′)then if(ld=′1′)then count<=′0′&d; --sync load else count<=count+1; --sync increment end if; end if; end process; end rtl;
2. 异步复位的优、缺点
(1)异步复位的优点:
①异步复位最大的优点是数据通路可以不依赖时钟而确保复位时刻可控。受数据通路时序的要求,不可能通过在数据通路上添加逻辑门或增加连线延迟来处理同步复位,而使用异步复位可以保证不将reset 信号加载到数据通路上。
② 电路可以不依赖时钟信号进行复位。
(2)异步复位的缺点:
异步复位导致设计变成了异步时序电路,如果复位信号出现毛刺,将会导致触发器的误动作,影响设计的稳定性。最为严重的是,由于复位信号与时钟关系不确定,如果异步复位信号在触发器时钟有效沿附近释放,则可能导致亚稳态的出现,从而影响设计的可靠性。
如图2-43所示,trecovery是指原本有效的复位信号释放(对低电平有效的复位信号而言就是上升沿)与紧跟其后的第一个时钟有效沿之间所必须的最小时间。tremoval是指时钟有效沿与紧跟其后的原本有效的异步复位信号变得无效之间所必须的最小时间。如果复位信号的上升沿(假设复位信号低电平有效)落在trecovery和tremoval之间,则触发器输出端的值将是不确定的,在这段时间里Q端会出现毛刺、振荡或固定在某一个电压值,而不一定等于数据输入端的值,这段时间称为决断时间(Resolution Time)。经过决断时间之后Q端将稳定在0 或1,但究竟是0 还是1,则是随机的,与输入信号没有必然联系。亚稳态实质上是介于0和1电平之间的一个状态。
图2-43 异步复位时序图
2.6.3 触发器组模块的复位
如果一个模块是由一组触发器组成的(如移位寄存器),则在设计中应该只复位第一个触发器,后续的触发器仅作为数据寄存器使用,不能对它们复位。
(1)不好的触发器组的VHDL描述及对应电路(如图2-44所示)。
library ieee; use ieee.std logic 1164.all; entity badFFstyle is port( clk :in std logic; rst n :in std logic; d :in std logic; q2 :out std logic); end badFFstyle; architecture rtl of badFFstyle is signal q1:std logic; begin process(clk) begin if(clk′event and clk=′1′)then if(rst n=′0′)then q1<=′0′; else q1<=d; q2<=q1; end if; end if; end process; end rtl;
图2-44 触发器组对应的电路结构
(2)好的触发器组VHDL描述及对应电路(如图2-45所示)。
library ieee; use ieee.std logic 1164.all; entity goodFFstyle is port( clk :in std logic; rst n :in std logic; d :in std logic; q2 :out std logic); end goodFFstyle; architecture rtl of goodFFstyle is signal q1:std logic; begin process(clk) begin if(clk′event and clk=′1′)then if(rst n=′0′)then q1<=′0′; else q1<=d; end if; end if; end process; process(clk) begin if(clk′event and clk=′1′)then q2<=q1; end if; end process; end rtl;
图2-45 触发器组对应的电路结构
在上述第一种写法中,增加了不必要的附加逻辑,即将rst n作为第二个触发器的使能信号,导致输出不稳定甚至错误。
2.6.4 复位电路的同步化方法
同步复位电路中的亚稳态完全可以避免;异步复位电路中的亚稳态无法回避,只能力求将影响降到可容忍的范围内。解决这个问题的方法是采用如图2-46 所示的复位同步电路。
图2-46 同步复位电路模型
library ieee; use ieee.std logic 1164.all; entity asyncresetFFstyle is port( clk :in std logic; asyncrst n :in std logic; rst n :out std logic); end asyncresetFFstyle; architecture rtl of asyncresetFFstyle is signal rff1:std logic; begin process(clk,asyncrst n) begin if(asyncrst n=′0′)then rff1<=′0′; rst n<=′0′; elsif(clk′event and clk=′1′)then rff1<=′1′; rst n<=rff1; end if; end process; end rtl;
同步复位信号的作用是产生一个稳定的与时钟同步的复位信号。要得到与时钟同步的信号不难,关键在于如何保证信号的稳定,即确保亚稳态的影响降到可容忍的程度,这就是采用两级触发器组成同步器的原因。
如图2-46所示,第一级主复位触发器数据端输入绑定在高电平,随着异步复位信号的撤销,输入端的时钟采样被允许,输出端再输出到第二级主复位触发器,经过一级时钟同步,得到一个主复位信号masterrst n。主复位信号通过复位分配缓冲树到达设计中的各个目的寄存器与触发器。为什么如图2-46所示的同步器电路能解决异步复位的问题呢?这归结于以下两点:①复位同步器的使用将异步复位信号变成与时钟同步的复位信号,同时使用两级触发器组成复位同步器又使同步器本身发生亚稳态的可能大大减少。②复位分配缓冲树的使用纠正了主复位信号传播到各目的触发器的传播延时差异,保证复位信号传播的一致。