前言
最近看advanced fpga 以及fpga设计实战演练中有讲到复位电路的设计,才知道复位电路有这么多的门道,而不是简单的外界信号输入系统复位。
流程:
1.同步复位:
优点:同步的典型优点是确保电路100%是同步电路;容易被STA;当作用于一些基于周期机制的功能模块时更易于仿真。
缺点:脉冲宽度满足一定的要求。总是需要一个时钟来完成对电路的复位。
代码:一个4bit的计数器。
1 always @(
posedge clk
/*or negedge sys_rst_n*/)
begin
2 if (~sys_rst_n)
begin
3 count <=
0;
4 end //if
5 else begin
6 count <= count +
1'b1;
7 end //else
8 end //always
仿真解析(下图):
时钟上升沿如果复位信号为低电平,复位开始,时钟上升沿若复位信号为高电平,复位结束。
2.异步复位:
优点:没有像同步复位那样插入到数据路径中;复位即刻生效。
缺点:复位信号被释放时可能出现亚稳态;对噪声的易感染性,可能导致虚假复位。
代码:
1 always @(
posedge clk
or negedge sys_rst_n)
begin
2 if (~sys_rst_n)
begin
3 count <=
0;
4 end //if
5 else begin
6 count <= count +
1'b1;
7 end //else
8 end //always
仿真解析(下图):
复位信号低电平时候,系统立刻进入复位态;
3.异步复位同步释放:(推荐使用)
优点:结合了同步复位与异步复位的优点。
缺点:容易受到噪声与宰脉冲的干扰。如果可能,最好对输入到fpga的异步复位信号先进行滤波与去抖动。
代码:
1 module rstn_as (
2 //input;
3 input wire clk,
4 input wire sys_rst_n,
5 //output;
6 output reg rst_n
7 );
8 reg rst_n_reg;
9 always @(
posedge clk
or negedge sys_rst_n)
begin
10 if (~sys_rst_n)
begin
11 rst_n <=
1'b0;
12 rst_n_reg <=
1'b0;
13 end //if
14 else begin
15 rst_n_reg <=
1'b1;
16 rst_n <=
rst_n_reg;
17 end //else
18 end //always
19
20 endmodule
wire rst_n;
rstn_as u1(
.clk (clk),
.sys_rst_n (sys_rst_n),
.rst_n (rst_n)
);
always @(
posedge clk
or negedge rst_n)
begin
if (~rst_n)
begin
count <=
0;
end //if
else begin
count <= count +
1'b1;
end //else
end //always
仿真解析(下图):
当复位信号低电平时,系统立即复位;当时钟上升沿检测到复位信号失效后,在下一个时钟上升沿拉高rst_n。新的rst_n是已经同步化了的复位信号。
以上。