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

  白驹过隙,寒假已经余额不足,回头想想,也就是看了两本书,做了几个并不大的工程,看着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

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

  上电延时  

  开发板接通电源后会有一小段不稳定的状态,在比较大的工程中,逻辑资源利用的比较多的情况下,如果加上电源后直接进行复位操作,同样会使寄存器不稳定,所以,类似于按键消抖的方法,我们也给板子加电源后延时50ms,当系统稳定后在进行复位操作,再看bingo的书时,他是将这两个个分成两个模块然后实例化到一起,但为了提高代码的可移植性,我将异步复位同步释放和上电延时50ms写在一个模块。具体实现如下。

 1 module sys_ctrl(
 2             input mclk,
 3             input rst_n,
 4             output sys_clk,
 5             output sys_rst_n
 6     );
 7     
 8        parameter SYS_DELAY = 24'd2500000;//delay50ms
 9     //parameter SYS_DELAY = 24'd25;//just test
10        
11        wire delay_done;//delay 50ms finish flag
12     reg rst_n1;
13     reg rst_n2;
14     reg [23:0] cnt;//count system delay 50ms
15     
16     always @(posedge mclk or negedge rst_n)//asynchronous reset synchronous release
17     begin
18         if(!rst_n)begin
19             rst_n1 <= 1'b0; 
20             rst_n2 <= 1'b0;
21         end
22     else begin
23         rst_n1 <= rst_n;
24         rst_n2 <= rst_n1;
25         end
26       end
27       
28       always @(posedge mclk)//It don't depend on rst_n when power up
29       begin
30           if(cnt == SYS_DELAY - 1'b1)
31               cnt <= cnt;
32           else if(cnt < SYS_DELAY - 1'b1)
33               cnt <= cnt + 1'b1;
34           else 
35               cnt <= 24'd0;
36           end
37       assign delay_done = (cnt == SYS_DELAY - 1'b1)?1'b1:1'b0;
38     
39       assign sys_clk = mclk;
40       assign sys_rst_n = delay_done & rst_n2;
41                   
42 endmodule

sys_ctrl

  对于较小的工程,进行这些操作与否也就无可厚非,如果对于一个项目,需要要求必须尽善尽美,FPGA的优势便是数字信号处理,速度快,我们在保持速度的前提下,还需要使其准确率也提高,尽量占用少量的资源。这样异步复位,同步释放的机制就体现出来了

转载请注明出处:NingHeChuan(宁河川)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–交货与库存调拨(134)-2预备步骤

2.3 预备步骤 可以检查事务 MD04 中的分销工厂(如,1100)是否有采购申请。如果没有采购申请,您可以进行以下步骤: - 物料由再订货点计划进...

2734
来自专栏北京马哥教育

想要自己搭建NAS服务器?看这篇文章,小白也能学会!(二)

? 本文为《想要自己搭建NAS服务器?看这篇文章,小白也能学会!》的第二篇,本片主讲内容为NAS服务器...

1.8K6
来自专栏smy

抛弃vue-resource拥抱axios

vue-resource用法 import Vue from 'vue' import VueResource from 'vue-resource' Vue....

5265
来自专栏FreeBuf

Kali Linux中前十名的Wifi攻击工具

无线网络的攻与防一直是比较热门的话题,由于无线信号可以被一定范围内的任何人接收到(包括死黑阔),这样就给WIFI带来了安全隐患;路由器生产厂商和网络服务供应商(...

2509
来自专栏SAP最佳业务实践

SAP最佳业务实践:重复制造(149)-4发料

1、MF60备料 在此活动中,您为生产备料。如果在生产存储地点有充足的库存可用,将不生成行项目。 必须有库存。 角色:车间主任 后勤- 生产-重复制造 -备料-...

4368
来自专栏空调论坛

空调自控系统全解析

(1) 空调区域的温度、湿度、压力等的控制,对于舒适空调,温湿度过高过低都影响舒适感,只有自控才能将温湿度自动控制在设计值;对于工艺空调,是生产工艺的必备条件。

843
来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–退货到供应商(136)-2采购退货

一、退货原因 1 退货原因:02 质检未通过(到冻结库存) 在收货过程中,质检未通过。因此,物料将被过帐到冻结库存并移动到用于退货的存储地点(例如,1060)。...

3424
来自专栏程序员互动联盟

【专业技术】如何检测USB是否已经插入?

usb是我们现代生活中不可或缺的一个东西,大家平常只要使用电脑,肯定都接触过usb吧。本篇文章对于大部分同学来说并没有实际意义,主要面向想了解USB的一些同学,...

3785
来自专栏FreeBuf

Kali Linux中优秀Wifi渗透工具TOP 10

这篇文章要讨论的是目前一个非常热门的话题:渗透无线网络以及如何防止无线网络被入侵。WiFi通常都是网络环境中的一个薄弱环节,因为WiFi信号可以在范围内的任何一...

4014
来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–转包(138)-3交货请求

3.4 MIGO创建外向交货请求 此活动为要发送到供应商的部件创建外向交货请求。 角色:仓库文员 后勤-物料管理-库存管理-货物一定-货物移动 (MIGO) ...

3626

扫码关注云+社区