我使用的逻辑被设置为需要一个差分对时钟端口。然而,对于一个特定的应用程序,我只能输入一个单端时钟(由于硬件限制)。修改逻辑以接受单端时钟不是一种选择,因为涉及许多文件和代码行。有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口?例如,在我的顶层我想要一个像这样的端口:
input single_ended_clk
我想将其提供给具有以下端口的模块:
input diff_pair_clk_p;
input diff_pair_clk_n;
一个非常幼稚的方法是这样做:
mymodule m_i (
.diff_pair_clk_p(single_ended_clk),
.diff_pair_clk_n(~single_ended_clk),
);
但我认为这不是执行此操作的正确方法。
大多数芯片设计(无论是 ASIC 还是 FPGA)都会显式实例化时钟缓冲区,而不是推断它们。在 FPGA 领域,综合引擎通常不够智能,无法识别时钟并将缓冲器输出连接到专用时钟路由资源。因此,您确实可能需要显式实例化时钟缓冲区。
现在,有时您需要单端时钟缓冲器,有时您需要双沿时钟缓冲器。虽然您可以使用引用参数的生成语句来决定要实例化哪个缓冲区,但您无法通过这种方式控制芯片的端口列表。您可以将时钟缓冲区保留在较低级别的模块内。
我不建议在芯片内重新创建差分信号。这有几个问题。首先,差分时钟缓冲器期望连接到外部引脚,而不是内部缓冲信号。其次,正时钟和负时钟之间存在时序不匹配,这可能会在生成的时钟后缓冲区上产生故障,从而使您的设计变得一团糟。
相反,将 _n 和 _p 输入保留到子模块,并使用生成来选择要实例化的时钟缓冲区的类型。在单端时钟的情况下,_n 输入保持未连接状态,仅使用 _p 输入。
以下是 Xilinx FPGA 的示例。在其他类型的 FPGA 或 ASIC 库中,缓冲区原语的命名方式会有所不同。
module clock_buffer (
input pin_clk_p,
input pin_clk_n,
output clk_int
);
parameter DIFF = 0;
generate
if (DIFF = 1)
clk_buf IBUFGDS(
.I (pin_clk_p),
.IB (pin_clk_n),
.O (clk_int)
);
else
clk_buf IBUFG(
.I (pin_clk_p),
.O (clk_int)
);
endgenerate
endmodule
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)