跨时钟:单 bit 两级同步,多 bit 格雷码 + FIFO,窄脉冲转电平
1.单比特两级同步器
reg q1,q2;
always@(posedge dst_clk or negedge rst_n)begin
if(!rst_n) begin q1<=0;q2<=0;end
else begin q1<=din; q2<=q1; end
end
assign dout = q2;
- 信号从慢时钟→快时钟 / 跨时钟,容易亚稳态(采样不稳、跳变)
- 打两拍:第一拍缓存、第二拍稳定输出
- 只适合:单 bit 信号(reset、req、busy);不能用于多 bit 数据(会乱码)
2.格雷码转换
- 格雷码特点:每次只变 1bit
- 多 bit 跨时钟(FIFO 读写指针),用格雷码 + 两级同步,杜绝多 bit 同时翻转导致亚稳态报错
//如下二进制转格雷码:
assign wr_gray = (wr_ptr >> 1) ^ wr_ptr;
//空:读写指针完全相同
//满:最高2位相反,其余位相同
3.窄脉冲跨时钟(防丢脉冲)
短脉冲只维持 1 个时钟,直接同步会丢;
- 先在源时钟:把脉冲变成「电平翻转」
-// 源时钟:脉冲转电平翻转
always@(posedge src_clk) if(pulse_in) toggle <= ~toggle;
- 目的时钟同步后,检测边沿,还原脉冲
always@(posedge dst_clk){s1,s2} <= {toggle,s1};
assign pulse_out = s1 ^ s2;
- 用途:中断脉冲、握手短信号跨域