在逻辑中使用单端端口期待差异对?

2024-01-10

我使用的逻辑被设置为需要一个差分对时钟端口。然而,对于一个特定的应用程序,我只能输入一个单端时钟(由于硬件限制)。修改逻辑以接受单端时钟不是一种选择,因为涉及许多文件和代码行。有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口?例如,在我的顶层我想要一个像这样的端口:

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(使用前将#替换为@)

在逻辑中使用单端端口期待差异对? 的相关文章

  • [从零开始学习FPGA编程-24]:进阶篇 - 基本组合电路-编码器与译码器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125247358 目录 前言 Veri
  • 在 Verilog 中生成 For 循环中实例化模块

    我正在尝试使用 Verilog 实例化一些模块generate块 因为我将实例化可变数量的它们 genvar i generate for i 1 i lt 10 i i 1 begin status whatever status clk
  • Spartan-3E 上的随机数生成

    我需要在 Spartan 3E FPGA 上为我的遗传算法生成伪随机数 并且我想在 verilog 中实现它 您能给我任何关于此的指示吗 当然 Adam 的随机生成器是不可合成的 您必须显式创建一个LFSR 以下示例可能会有所帮助 它是一个
  • Quartus Prime 中的“多个常量驱动程序”Verilog 错误

    我正在致力于用 Verilog 设计一个有限状态机来表示堆栈 该模块如下 module state machine s Enable Clock Resetn c OF Err UF Err input 2 0 s input Enable
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • 比较数字进行排序然后得到中值

    使用按位或比较运算符对五个整数进行排序可以通过以下方式实现 首先获取最大的数字 然后获取第二大的数字 然后获取第三大的数字 依此类推 这是我获取最高数字的代码 include
  • 如何使用 Verilog 宏模拟 $display?

    我想创建一个具有多个参数的宏 就像 display 一样 我的代码看起来像这样 但它不起作用 define format macro A write s sformatf A 这就是我调用 format macro 的方式 format m
  • 如何在 verilog 中不使用 while() 循环(用于综合)?

    我已经养成了开发大量测试平台并使用 for 和 while 循环进行测试的习惯 没关系 问题是我已经将这种习惯用于对应该可综合的电路进行编码 XST等拒绝合成代码 无需对合成参数进行额外修改 例如 while num lt test num
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 信号连接到以下多个驱动器

    我尝试运行以下命令并收到此错误 这是 Verilog 代码 module needle input referrence input penalty output index 7 0 inout input itemsets input r
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • 如何获取值数组作为 plusargs?

    如何获取值数组作为参数 我需要从命令行获取一组未定义大小的命令 如何将这些参数放入数组或队列中 Eg CMDS READ WRITE READ N WRITE 它应该被带到一个数组中 value plusargs不支持数组 但支持字符串 看
  • Verilog 错误:必须连接到结构网络表达式

    我收到错误 output or inout port Qout must be connected to a structural net expression 我评论了下面代码中发生错误的行 代码被修剪 压缩 我搜索了答案 似乎我无法将输
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐