01signal.com

在 input / output block内部使用 registers

介绍

在 FPGA中,每个 I/O port 在 logic fabric上都有自己的小区域。这个区域称为 IOB (Input / Output Block),包含支持此 I/O port功能所需的一切: 确保 I/O pin上正确电压和电流的模拟电路,以及一些特殊的 logic elements。

我应该指出,术语“IOB”是 Xilinx术语的一部分。每个 FPGA 供应商使用不同的术语。

IOB中几乎总是有 IOB registers 。这些 registers 是直接连接到 I/O port的 pin的 flip-flops 。

当 pin 是 input port时,某些 flip-flops 旨在使用: 这些 flip-flops的 D input 接 I/O port的 pin。因此,此类 flip-flop 执行来自外部世界的 signal 的 sampling 。

其他 flip-flops 作为 output port专用于 pin 。这些 flip-flops的 Q output 连接到 pin。

IOBs 的结构因 FPGA 而异。有的 IOBs 结构复杂,功能丰富,有的 IOBs 结构简单。通常, IOB register 是更大的 logic element(例如 SERDES)的一部分。因此,即使在描述 IOB的文档绘图中没有明确描述 flip-flops , FPGA的 I/O pins 仍然有可能具有 IOB registers。

为什么使用 IOB registers

使用 IOB registers 的主要动机是 timing: 由于这些 registers与 I/O port的 pin接近,因此以这种方式实现的 clock-to-output 是无与伦比的。同样对于 input ports, IOB register 最有可能实现所需的 timing。

但即使很容易满足 timing 要求,也有充分的理由坚持 IOB registers: 重复性。否则,对于 FPGA 项目的每个 implementation , I/O port的 pin 和 flip-flop 之间的 delay 是不同的。这是因为允许工具每次将 flip-flop 放在不同的位置。只要达到 timing constraints ,他们也可以更改 routing的 delay 。这不是问题,只要 PCB design 选对了,与外部元件的接口规划得当。但是,当确实存在此类问题时, delay 与 implementation 之间的差异可能会造成混淆: 有什么地方不行,你在 design上修了点东西,然后问题好像就解决了。但真正有所不同的是 I/O timing 某处的细微变化。

IOB registers 的使用保证了在 FPGA的 logic的开发过程中与外部元器件的电气接口不会被无意的改变。这使得在发生问题时更容易隔离问题。

请求 IOB registers

可能需要明确告诉 FPGA 工具使用 IOB registers。 synthesizer 通常负责执行此操作,因此此类 synthesis attribute 可与 Vivado一起使用:

(* IOB = "TRUE" *) input the_input,

也可以在 XDC 文件中执行相同的操作:

set_property IOB true [get_ports the_input]

另一种选择是将 synthesis attribute 添加到连接到输入的 register :

(* IOB = "TRUE" *) reg the_input_samp;

请注意, XDC 文件中的 attribute 可能还不够: 通常, synthesizer 需要复制 registers ,以便将 flip-flops 放入 IOB。当 flip-flop 的 output 也被 FPGA中的常规 logic 使用时,这是相关的。原因是 IOB 内部的 flip-flop 的 output 只能用于 port。因此需要另一个 flip-flop 来生产相同的 output,因此它可以用于 logic fabric。在这种情况下通常需要 synthesis attribute (如上所示)。

使用 Quartus,可以将此类命令添加到 QSF 文件中:

set_instance_assignment -name FAST_INPUT_REGISTER ON -to the_input
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to the_output

每个工具都有略微不同的方法来实现这一点。

Timing constraints

是否有任何理由为使用 IOB register的 port 编写timing constraints ?毕竟 IOB register只有一个可能的定位。是否可以得出 timing 将始终相同的结论,无论有无 timing constraints?

因此,即使在使用 IOB registers 时,编写 timing constraints 也主要有两个很好的理由。

第一个原因是确保使用 IOB register : 有时, logic design 的更改可能会无意中阻止对所有或部分 ports使用 IOBs 。发生这种情况时,工具很少抱怨。相反,不在 IOB 内部的 flip-flop 被静默使用。一个 timing constraint 可以防止这种情况: 如果 timing constraint 只有在所有相关的 flip-flops 都在自己的 IOBs里面才能实现,那么这些 flip-flops 的驱逐就不会悄无声息了: timing constraint 将因此失败。

第二个原因是这些工具可能会故意在 I/O port的 pin 和 IOB register 之间插入一个 delay (尽管并非所有 FPGAs 都支持此功能)。此 delay 的目的是相对于 thold 改进 timing (请参见 Quartus的示例)。使用 timing constraint 可以防止这种不希望的操作,只有在没有这个额外的 delay的情况下才能实现。

set_max_delay通常是合适的 timing constraint ,以确保与 IOB registers的一致使用。如果 FPGA tools 支持此命令的“datapath_only”选项(或类似功能),那就更方便了。

结论

应尽可能使用IOB registers 。 FPGA 工具可能不会自愿执行此操作,因此可能需要付出一些努力才能实现此目标。这项努力的回报不仅是最佳的 timing,而且还有 I/O ports的可重复行为。

此页面由英文自动翻译。 如果有不清楚的地方,请参考原始页面
Copyright © 2021-2024. All rights reserved. (6f913017)