异步复位同步释放---关于复位的问题
2014-11-06 08:46
453 查看
一个简单的异步复位的例子
我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。
即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。
一个简单的同步复位的例子
和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。
那么同步复位和异步复位到底孰优孰劣呢?
只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。
再看下面一个两级寄存器异步复位的例子
正常情况下,clk的上升沿c更新为b,b更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b_reg0和c_reg0的{launch edge –stup,launch edge+hold}时间只外,那么一切都会正常。但如果恰恰相反,会出现什么情况呢? rst_n的上升变化出现在了clk上升的建立保持时间上,此时clk检测到的rst_n的状态就会是一个亚稳态(是0是1不确定)。从代码里我们看到如果此时b_reg0和c_reg0认为rst_n为0,那么依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时的rst_n的不确定性,就可能出现4种情况,即b_reg0和c_reg0都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?
上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。
异步复位、同步释放
如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。
最好的异步复位、同步释放--------复位方法
对应的Verilog程序如下
要是代码改成
那么综合出来的RTL电路
--------------------------------------------------------------
改进的最终复位电路如下----------------------------------------
1 module test 2 ( 3input clk, 4input rst_n, 5input data_in, 6output reg out 7); 8always @ (posedge clk or negedge rst_n) 9if(!rst_n) out <= 1'b0; 10 else out <= data_in; 11endmodule
我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。
即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。
一个简单的同步复位的例子
1 module test 2 ( 3input clk, 4 input rst_n, 5 input data_in, 6 output reg out 7); 8 always @ (posedge clk ) 9if(!rst_n) out <= 1'b0; 10else out <= data_in; 11 endmodule
和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。
那么同步复位和异步复位到底孰优孰劣呢?
只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。
再看下面一个两级寄存器异步复位的例子
1 module test 2 ( 3 input clk, 4 input rst_n, 5 input a, 6 output reg c 7); 8 9reg b; 10 always @ (posedge clk or negedge rst_n) 11if(!rst_n) b <= 1'b0; 12else b <= a; 13 14 always @ (posedge clk or negedge rst_n) 15if(!rst_n) c <= 1'b0; 16else c <= b; 17 18 endmodule
正常情况下,clk的上升沿c更新为b,b更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b_reg0和c_reg0的{launch edge –stup,launch edge+hold}时间只外,那么一切都会正常。但如果恰恰相反,会出现什么情况呢? rst_n的上升变化出现在了clk上升的建立保持时间上,此时clk检测到的rst_n的状态就会是一个亚稳态(是0是1不确定)。从代码里我们看到如果此时b_reg0和c_reg0认为rst_n为0,那么依然保持复位清零,而如果认为rst_n为1,那么就跳出复位。因为此时的rst_n的不确定性,就可能出现4种情况,即b_reg0和c_reg0都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?
上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。
异步复位、同步释放
1 module test 2 ( 3 input clk, 4 input rst_n, 5 input a, 6 output reg c 7); 8 9 reg b,rst_nr; 10 always @ (posedge clk) 11rst_nr <= rst_n; 12 13 always @ (posedge clk or negedge rst_nr) 14if(!rst_nr) b <= 1'b0; 15else b <= a; 16 17 always @ (posedge clk or negedge rst_nr) 18if(!rst_nr) c <= 1'b0; 19else c <= b; 20 21 endmodule
如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。
最好的异步复位、同步释放--------复位方法
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity test is port( sys_clk: in std_logic; rst_in : in std_logic; rst_out: out std_logic ); end test; architecture behave of test is begin rst_pro : process(sys_clk,rst_in) begin if rst_in = '0' then rst_out <= '0'; elsif rising_edge(sys_clk) then rst_out <= '1'; end if; end process rst_pro; end behave;
对应的Verilog程序如下
1 module test 2 ( 3input clk, 4input rst_n, 5output reg rst_out 6); 7 8 always @ (posedge clk,negedge rst_n) 9 if(!rst_n) 10 rst_out<=1'b0; 11else 12 rst_out<=1'b1; 13endmodule
要是代码改成
1 module test 2 ( 3input clk, 4 input rst_n, 5 output reg rst_out 6); 7 8 always @ (posedge clk,negedge rst_n) 9 if(!rst_n) 10 rst_out<=rst_n; 11 else 12 rst_out<=1'b1; 13 endmodule
那么综合出来的RTL电路
--------------------------------------------------------------
改进的最终复位电路如下----------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | module rst ( input clk, input rst_n, output reg rst_out ); reg R1; always @ ( posedge clk, negedge rst_n) if (!rst_n) begin R1 <= 1'b0; rst_out <= 1'b0; end else begin R1 <= 1'b1; rst_out <= R1; end endmodule |
相关文章推荐
- 异步复位同步释放---关于复位的问题
- FPGA:同步复位,异步复位以及异步复位同步释放
- 同步复位与异步复位——异步复位同步释放
- 如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转)
- FPGA同步复位,异步复位以及异步复位同步释放实例分析
- FPGA同步复位,异步复位以及异步复位同步释放实例分析
- 关于有限状态机FSM同步复位的问题
- [转]同步复位,异步复位以及异步复位同步释放
- Verilog中同步复位,异步复位,异步复位同步释放
- 同步复位,异步复位以及异步复位同步释放(转载)
- 异步复位同步释放的方法以及多时钟系统的复位设计
- 三种复位方式: 同步复位、异步复位、异步复位同步释放
- 关于“同步请求下Firefox 3中XHR的onreadystatechange事件不会触发”问题
- 关于未对齐指针释放问题(Non-aligned pointer being freed)
- 关于动态窗口的释放和ThemeEngine的问题
- 异步复位、同步释放
- 关于同一个网站下Session却不能同步的问题
- JS中关于对内存的释放问题[待续]
- 关于java socke同步的问题
- 关于rm删除文件空间不释放的问题