这里的时间是指信号传输的建立时间和保持时间。
建立时间:时钟有效沿到来之前数据必须保持稳定的最小时间;
保持时间:时钟有效沿到来之后数据必须保持稳定的最小时间;
实际上亚稳态是无法完全消除的,只能降低。
上述时间不够时,会使信号在0和1之间不定的漂浮如图:
在硬件逻辑电路中,可以通过打两拍的方式降低亚稳态。上代码:
module yawentai(
input clk,
input rst_n,
input signal_in,
output signal_out
);
/*
reg signal_r1;
reg signal_r2;
always@(posedge clk or negedge rst_n)
if(!rst_n)begin
signal_r1 <= 1'b0;
signal_r2 <= 1'b0;
end
else begin
signal_r1 <= signal_in;
signal_r2 <= signal_r1;
end
assign signal_out = signal_r2;
*/
reg [1:0]signal_r;
always@(posedge clk or negedge rst_n)
if(!rst_n)
signal_r <= 2'b0;
else
signal_r <= {signal_r[0],signal_in};
assign signal_out = signal_r[1];
endmodule
测试代码:
`timescale 1ns/1ns
`define clock_period 20
module yawentai_tb;
reg clk;
reg rst_n;
reg signal_in;
wire signal_out;
yawentai u_yawentai(
.clk (clk),
.rst_n (rst_n),
.signal_in (signal_in),
.signal_out (signal_out)
);
initial clk = 1;
always#(`clock_period/2)clk = ~clk;
initial begin
rst_n = 1'b0;
signal_in = 1'b0;
#(`clock_period*200)
rst_n = 1'b1;
#(`clock_period*200)
signal_in = 1'b1;
#2000;
$stop;
end
endmodule
仿真图:
可以看出相差正好时一个周期20ns