在学习FPGA初期,有一个很重要的概念——亚稳态,亚稳态的产生是因为信号在不同时钟域的传递时在时钟上升沿到来的时候信号正好发生了变化,寄存器的建立时间不满足要求,寄存器自然也不知道有没有正确的接收到信号,就产生了亚稳态。对于这个问题比较常见的处理方式是通过打拍处理,一般打两拍就可以阻断亚稳态的传递了。但是,这里有一个问题,这个打拍的方式只能适合慢时钟域传递到快时钟域,快时钟域一定能采样到慢时钟域的信号这是这种方式可行的条件之一。如果我们的需求是快时钟域传递到慢时钟域呢,慢时钟域并不一定能采集到快时钟域的突发信号,慢时钟域的上升沿可能还没有到来,快时钟域的信号可能已经都消失了。
这时候有两种方式处理,一是通过握手进行处理,当快时钟域的突发信号出现时发送一个请求,没有应答一直保持,所以慢时钟域一定能够接收到请求信号的。但是这种方式写的时候太费劲,另外一种方式是扩位,刚学习的时候一直没明白什么意思,这里我给你们提供一段代码,大家一看就知道是怎么回事了。大家可以根据自己的需要自行更改。
module sign_process (
input fast_clk,
input slow_clk,
input sign_in,
output reg sign_out
);
reg [15:0] sign_r;
always @(posedge fast_clk) begin
sign_r <= {sign_r, sign_in};
end
always @(posedge slow_clk) begin
if (sign_r) begin
sign_out <= 1'b1;
end
else begin
sign_out <= 1'b0;
end
end
endmodule