Verilog设计_跨时钟域(CDC)

本文详细介绍了如何在数字系统中进行单bit信号从慢时钟域到快时钟域以及从快时钟域到慢时钟域的传输。对于慢到快的传输,可以通过两次同步来实现;而对于快到慢的传输,过程相对复杂,需要在快时钟下检测输入,然后在慢时钟下完成输出,并通过慢时钟对快时钟的反馈来控制传输的完成。示例代码使用了Verilog语言进行描述。
摘要由CSDN通过智能技术生成

单bit信号跨时钟域传输,慢到快和快到慢。


一、慢时钟域传递到快时钟域

慢到快很简单,可以直接打两拍同步,也不存在脉冲展宽的问题。

代码实现:

module clk_cross_slow2fast(
             input   clk_slow,
             input   clk_fast,
             input   rst_n,
             input   data_slow,
            output   data_fast
         );

         reg [1:0] sig_fast_r;

         always@(posedge clk_fast or negedge rst_n)begin
             if(!rst_n)begin
                 sig_fast_r <= 2'b0;
             end
             else begin
                 sig_fast_r <= {sig_fast_r[0],data_slow};
             end
         end

         assign data_fast = sig_fast_r[1];

endmodule

测试波形

二、快时钟域传递到慢时钟域

快时钟到慢时钟要稍微麻烦一些,在快时钟下输入数据,输出pulse_slow单脉冲信号和data_slow信号

基本思路:

1、快时钟检测到输入,赋值给有效信号signal_fast

2、慢时钟下将有效信号signal_fast赋值给signal_slow

3、慢时钟下完成输出

4、慢时钟的输出信号对快时钟的反馈,控制快时钟下signal_fast_r拉低,表示一次传输完成

代码实现:

module clk_cross_fast2slow(
             input   clk_slow,
             input   clk_fast,
             input   rst_n,
             input   data_fast,
            output   pulse_slow,
            output   data_slow
         );

         reg sig_fast;
         reg sig_slow;
         reg [1:0] sig_fast_r;
         reg [1:0] sig_slow_r;

         always@(posedge clk_fast or negedge rst_n)begin // 快时钟下保持
             if(!rst_n)begin
                 sig_fast <= 0;
             end
             else if(data_fast)begin
                 sig_fast <= 1;
             end
             else if(sig_fast_r[1])begin
                 sig_fast <= 0;
             end
             else begin
                 sig_fast <= sig_fast;
             end
         end

         always@(posedge clk_slow or negedge rst_n)begin // 传递给慢时钟域
             if(!rst_n)begin
                 sig_slow <= 0;
             end
             else begin
                 sig_slow <= sig_fast;
             end
         end

         always@(posedge clk_slow or negedge rst_n)begin // 慢时钟下保持
             if(!rst_n)begin
                 sig_slow_r <= 2'b0;
             end
             else begin
                 sig_slow_r <= {sig_slow_r[0],sig_slow};
             end
         end

         assign data_slow = sig_slow_r[1];
         assign pulse_slow = ~sig_slow_r[1] & sig_slow_r[0];

         always@(posedge clk_fast or negedge rst_n)begin // 慢时钟对快时钟的反馈
             if(!rst_n)begin
                 sig_fast_r <= 2'b0;
             end
             else begin
                 sig_fast_r <= {sig_fast_r[0],sig_slow_r[1]};
             end
         end

endmodule

测试波形


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clock_926

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值