1.同步复位:只有在时钟上升沿来的时候,复位信号才有有效。(当时钟上升沿以外的时刻都检查不到复位信号)表示:always @(posedge clk)
异步复位:无论时钟上升沿是否到来,复位信号都有效。(当时钟上升沿或者复位信号有效时,都可以判断是否复位)表示:always @(posedge clk or negedge rst)
2.同步复位:他只在时钟上升沿去判断是否复位,所以降低了亚稳态出现的概率,但会消耗FPGA更多的资源
异步复位:因为FPGA有自带的异步复位专用端口,所以节约资源。但是当时钟上升沿和复位信号一起到时,就不知道采集到的数据到底是1还是0
3.异步复位同步释放电路图
点击此处添加图片说明文字
当reset_n为0时,它连接的是reg3和reg4的清零端,所以两个输出为0,又因为它的输出连得是reg1和reg2的清零端,所以系统输出out_a和out_b为0,从而实现了复位清零的效果
当reset_n由0变为1时,在第一个时钟周期时,vcc会输入reg3,reg4保持0,第二个时钟周期时reg3和4都会变为1,所以输出就可以跳出复位信号
4.电路的代码如图所示:
代码如下:
module sync_async_rst(
input clk,
input rst,
input data_a,
input data_b,
output out_a,
output out_b
);
reg reg1,reg2;
reg reg3,reg4;
wire arst;
assign out_a = reg1;
assign out_b = reg2;
assign arst = reg4;
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
reg3 <= 0;
reg4 <= 0;
end
else
begin
reg3 <= 1;
reg4 <= reg3;
endA
end
always @(posedge clk or negedge arst)
begin
if(!arst)
begin
reg1 <= 0;
reg2 <= 0;
end
else
begin
reg1 <= data_a;
reg2 <= data_b;
end
end
endmodule
5.测试文件:
`timescale 1 ns/ 1 ps
module rst_tb();
/********************系统输入**********************/
reg clk;
reg rst;
reg data_a;
reg data_b;
wire out_a;
wire out_b;
initial
begin
clk = 1'b1;
rst = 1'b0;
data_a = 0;
data_b = 0; A
#100 rst = 1'b1;
#100 data_a = 1;
#100 data_b = 1;
#100 data_a = 0;
#100 data_b = 1;
#100 data_a = 1;
#100 data_b = 0;
$stop;
end
always #10 clk = ~clk;
sync_async_rst sync_async_rst(
.clk(clk),
.rst(rst),
.data_a(data_a),
.data_b(data_b),
.out_a(out_a),
.out_b(out_b)
);
endmodule
仿真图:
点击此处添加图片说明文字