在做项目的时,我们经常会使用到多个时钟。每一个时钟在FPGA内部都会形成一个时钟域,如果一个时钟域中要用到另外一个时钟域的信号,也就形成了跨时钟域的操作,这时候要格外小心。
一、实际使用背景
假设在项目中需要在clk_b时钟域中用到用到来自clk_a中的信号。那么此信号就需要从clk_a时钟域跨越到clk_b中因此我们要建立一个同步计数器,该设计器从clk_a 中获取信号,然后再clk_b中创建一个新的信号。并从作为输出。模型如下:
在此设计中、我们假设输入的信号与clk_a和clk_b相比变化缓慢,那么需要做的就是使用两个触发器将信号从clk_a转移到clk_b。
二、模板
模块 Signal_CrossDomain( 输入 clkA,//在该示例中我们实际上不需要clkA,但这是出于完整性的考虑,因为在其他示例中将需要它, 输入 SignalIn_clkA, 输入 clkB, 输出 SignalOut_clkB ); //我们使用两级移位寄存器将SignalIn_clkA同步到clkB时钟域 reg [1:0] SyncA_clkB; 总是 @(posedge CLKB)SyncA_clkB [0] <= SignalIn_clkA; //注意,我们使用CLKB 总是 @(posedge CLKB)SyncA_clkB [1] <= SyncA_clkB [0]; //注意,我们使用clkB 分配 SignalOut_clkB = SyncA_clkB [1]; //同步到新的信号(=准备中使用)CLKB域 endmodule
三、分析
这两个触发器具有延迟信号的副作用,例如在一下波形中,可以看到俩个触发器将慢速运动的信号同步或者说是延迟到clk_b时钟域中。其实这种方法我们在同时钟域中也用过,经常用来数据对齐。
原文地址:https://www.cnblogs.com/lgy-gdeu/p/12356217.html
时间: 2024-10-12 04:38:29