跨时钟域传输处理面临的基本问题:消除亚稳态
1.打两拍
`timescale 1ns/1ns
module odd_sel(
input clk,
input rst_n,
input reg d,
output q
);
reg reg_r1;
reg reg_r2;
always@(posedge clk or negedge rst_n)
begin
if(!rst)
begin
d <= 1'b0;
reg_r1 <= 1'b0;
reg_r2 <= 1'b0;
end
else
{reg_r2,reg_r1} <= {reg_r1,d};
end
endmodule
2.异步FIFO(多bit)
FIFO的英文全称是First In First Out,即先进先出。FPGA使用的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓_存,或者高速异步数据的交互也即所谓的跨时钟域信号传递。它与FPGA内部的RAM和ROM的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像RAM和ROM那样可以由地址线决定读取或写入某个指定的地址。
标准的FIFO是延迟一个时钟传输数据,经验来看,FIFO初始化时最好打十拍。
3.格雷码
这里不展开讨论,有需要的可以百度,主要还是用于消除亚稳态