最近看 advanced fpga 以及 fpga 设计实战演练中有讲到复位电路的设计,才知道复位电路有这么多的门道,而不是简单的外界信号输入系统复位。
流程:
1. 异步复位:
优点:⑴大多数 DFF 都有异步复位端口,因此采用异步复位可以节约资源。
⑵设计相对简单。
⑶异步复位信号识别方便,而且可以很方便地使用 fpga 的全局复位端口。
缺点:⑴在复位信号释放时容易出现问题,亚稳态。
⑵复位信号容易受到毛刺的影响。这是由于时钟抖动或按键触发时的硬件原因造成的。
代码:一个 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. 同步复位:
优点:⑴降低亚稳态出现的概率。
⑵使所设计的系统成为 100%的同步时序电路,有利于时序分析,综合出来的 Fmax 一般较高。
⑶只有在时钟有效沿才有效,可以滤除高于时钟频率的毛刺。
缺点:⑴复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。
⑵大多数的 Dff 只有异步复位端口,会浪费较多的逻辑资源。
代码:
1 always @(posedge clk) 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 是已经同步化了的复位信号。
以上。
审核编辑 黄昊宇
全部0条评论
快来发表一下你的评论吧 !