典型的复位电路,同步复位和异步复位。
同步复位指的是时钟有效沿来临的时候进行复位操作,同步复位使得电路为同步电路,能够利于仿真,缺点是要求复位信号要大于一个周期,否则无法保证成功复位,此外综合出来的电路实际上并没有利用器件的复位端,而是在输入端插入额外的逻辑电路,这样增加了额外的逻辑资源消耗。
异步复位是指的在任何时候只要复位信号有效即可复位,不占用额外的逻辑资源,充分利用器件的复位引脚,但是由于来临和结束时间未知,容易引起亚稳态现象。
二者相比较,同步复位需要引入额外的 MUX 电路控制 RST/S,对资源有一定的占用。因此同步复位的功耗相比较大。
举例代码,通过vivado综合后,比较二者的功耗。
同步复位:
module vld_cnt #(
parameter CNT_WIDTH = 8
)
(
input clk ,
input rst_n ,
input vld_in ,
output reg [CNT_WIDTH-1:0] cnt_out
);
reg [CNT_WIDTH-1:0] cnt_tmp;
always @ (posedge clk) begin
if (!rst_n) begin
cnt_tmp <= {CNT_WIDTH{1'b0}};
end
else if (vld_in) begin
cnt_tmp <= cnt_tmp + 1'b1;
end
else if (cnt_tmp >= 8'd8) begin
cnt_tmp <= {CNT_WIDTH{1'b0}};
end
else;
end
always @ (posedge clk) begin
if (!rst_n) begin
cnt_out <= {CNT_WIDTH{1'b0}};
end
else if (cnt_tmp >= 8'd8) begin
cnt_out <= cnt_out + 1'b1;
end
else;
end
以上代码,8个有效vld_in为一组进行计数,返回有效的组数。信号量都是采用同步复位。
综合后,电路的功耗如下:
异步复位:
module vld_cnt #(
parameter CNT_WIDTH = 8
)
(
input clk ,
input rst_n ,
input vld_in ,
output reg [CNT_WIDTH-1:0] cnt_out
);
reg [CNT_WIDTH-1:0] cnt_tmp;
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_tmp <= {CNT_WIDTH{1'b0}};
end
else if (vld_in) begin
cnt_tmp <= cnt_tmp + 1'b1;
end
else if (cnt_tmp >= 8'd8) begin
cnt_tmp <= {CNT_WIDTH{1'b0}};
end
else;
end
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_out <= {CNT_WIDTH{1'b0}};
end
else if (cnt_tmp >= 8'd8) begin
cnt_out <= cnt_out + 1'b1;
end
else;
end
综合后,电路的功耗如下:
同步复位电路总功耗:4.246W,异步复位电路总功耗:0.362W。二者比较明显异步复位电路功耗低于同步复位电路。