当前位置: 首页 > 编程学习 > 其它语言 > Verilog > 正文

异步复位、同步释放机制:系统完美稳定

2018-04-23 来源:博客园/NingHeChuan

白驹过隙,寒假已经余额不足,回头想想,也就是看了两本书,做了几个并不大的工程,看着QQ群里面一些大神们聊天,时不时有的没的还插几句,一句话没人理也是正常事情。有时候还帮同是菜鸟的网友解决问题,好不尴尬!在大神们的只言片语中,也汲取出来一点对行业的认识,数电、模电和信号处理这几门课没有系统的学习没有学确实基础比较差,被前辈指教后也是深深认识到自己太急于求成了,晚上的博文鱼龙混杂、千篇一律,所以还不如静下心来读一本好书。学到的只是就应该用出来,才能成为自己的东西,下面的异步复位,同步释放机制,是我根据自己的理解总结出来的。

D触发器的两种表示形式

同步复位

1 always @(posedge mclk)
2 begin
3          if(!rst_n)//if(rst_p)
4                    q <= 1’b0;
5          else
6                    q <= d;
7 end

异步复位

1 always @(posegde mclk or negdege rst_n)
2 或always @(posedge mclk or posedge rst_n)
3 begin
4          if(!rst_n)//if(rst_p)
5                    q <= 1’b0;
6          else
7                    q <= d;
8 end

同步复位即复位信号随系统时钟的边沿触发起作用,异步复位即复位信号不随系统时钟的边沿触发起作用,rst_n表示低电平复位与rst_p表示高电平复位,记得当时还被同步置数和异步置数困扰了好久,现在顺便也总结一下吧!

D触发器同步置数,异步置数。

异步复位,同步置数

1 always @(posegde mclk or negedge rst_n)
2 begin
3          if(!rst_n)
4                    q <= 1’b0
5          else if(en)//enable使能信号,当en为高电平时D触发器触发
6                    q <= d;
7          else
8                    q <= q;
9 end

异步复位,同步置数

1 always @(posedge mclk or negedge rst_n)
2 begin
3          if(!rst_n)
4                    q <= 1’b0;
5          else if(en) //enable使能信号,当en为高电平时D触发器触发
6                    q <= d;
7          else
8                    q <= q;
9 end

同步异步无非就是一个是否受系统时钟边沿触发,如果想要异步就直接加一个敏感信号就好了。不过一般工程中的书写形式就是异步复位,不过这种设计方法也有弊端,所以下面总结一下异步复位、同步释放的设计思想。(竞争与冒险)

异步复位、同步释放机制。

这是异步复位的结构图,D触发器是复位优先级高于clk优先级,所以采用通异步复位的方法,但是异步复位D触发器存在竞争与冒险,比如当clk的上升沿和rst_n的下降沿同时来临的时候这时候系统应该听谁的,同样当clk的上升沿和rst_n的上升沿同时来临的时候容易使寄存器出现亚稳态。

再来看看同步复位的逻辑结构图,同步复位虽然解决了当clk的边沿来临的时候rst_n的边沿也正好来临所出现的冒险与竞争,但是从综合的电路上可以看出,多了一个组合逻辑,选择器(MUX),可想而知如果所有的复位都是这样,那会多浪费多少资源。那么有没有更好的解决办法呢?答案是有,那就是异步复位同步释放机制。

 1 always @(posedge mclk or negedge rst_n)//asynchronous reset synchronous release
 2 begin
 3   if(!rst_n)begin
 4     rst_n1 <= 1'b0; 
 5     rst_n2 <= 1'b0;
 6   end
 7   else begin
 8     rst_n1 <= rst_n;
 9     rst_n2 <= rst_n1;    
10   end
11 end

这是复位信号同步化代码,系统时钟不变化,还是采用异步复位的方法,但是当复位信号操作时会进入一个同步寄存器,使得复位信号同步化,这样既避免了异步复位的冒险与竞争,又避免了同步复位耗费太多资源。只需要将复位信号同步化编写成独立模块,然后顶层例化就好了。系统时钟信号不变化。