01signal.com

在 Versal APAC FPGAs上使用 FIFOs

FIFO Generator在哪里?

使用 Versal FPGAs时, Xilinx 不提供 IP block 来实现可以在 Verilog 或 VHDL中的例化(instantiation)中使用的普通 FIFO 。众所周知的 FIFO Generator IP 不适用于这些 FPGAs。至少 Vivado 2022.1 及更早版本就是这种情况。

因此,如果将现有 FPGA 设计的 FPGA part 更改为 Versal FPGA,则可能需要对项目进行一些更改。几乎所有 FPGA 项目都使用 FIFO Generator。

Memory Generator也是如此: 有时用于创建 block RAMs 的 IP 在 Versal FPGAs 上也已被淘汰。然而,这 IP 使用较少,因为 block RAMs 通常是通过 inference创建的。换句话说,通常为了创建 RAM而声明 Verilog (或 VHDL)中的 array 。

请注意,具有 AXI 接口的 FIFOs 和 RAMs 仍可用作 IPs。缺乏对 Versal FPGAs 的支持仅与具有“native”接口的 FIFOs 和 block RAMs 有关。

有几个选项可以解决此问题。我将提出两种可能的方法。

有关 FIFOs的一般教程,请参阅本系列页面

选项1: 使用 Xilinx Parameterized Macros

Xilinx Parameterized Macros 在 Vivado 中适用于该软件支持的所有 FPGAs (即 series-7 FPGAs 和更高版本)。这些宏可以在例化中使用,就像在 Verilog 或 VHDL中的任何模块一样。他们的文档可以与 FPGA的 primitives 一起找到(例如,在 Versal Architecture Premium Series Libraries Guide, UG1485中)。

然而, primitives 和 Parameterized Macros之间有一个重要的区别: 当综合工具(synthesizer)遇到 primitive时,通常只会在 synthesized 网表中产生一个逻辑单元(logic element)。另一方面, Parameterized Macro会产生很多逻辑单元(logic elements),就像 Verilog 模块一样。

有几 parameterized macros 生产 FIFOs,特别是这两个:

这两款 macros 生产的 FIFOs 都有“native”接口,即 wr_en 、 rd_en等端口。几乎所有 FIFO Generator 可用的选项都可以通过设置 macro的例化参数(instantiation parameters)来启用。其中,这些 FIFOs 可以是“标准 FIFOs(Standard FIFOs)”或 First Word Fall Through (FWFT)。

还有一些 macros 用于实现不同种类的 RAMs 。无论如何,也有几种不同类型的 AXI-Stream FIFOs ,但这些都可以用 IP blocks创建,即使是 Versal FPGAs。

有关如何使用这些 macros的完整信息,请参阅相关的 Libraries Guide,即 UG1485 for Versal FPGAs。也可以通过 Vivado获得例化代码模板(instantiation template): 选择工具 > Language Templates (Tools > Language Templates)并转到 Verilog > Xilinx Parameterized Macros (XPM) > XPM > XPM_FIFO,然后根据需要从那里选择同步 FIFO (Synchronous FIFO)或异步 FIFO(Asynchronous FIFO)。

这是一个如何创建 baseline synchronous FIFO的示例,它与此页面上显示的相同。

module fifo_8x2048
  #(parameter width = 8, depth = 2048)
   (
    input  clk,
    input  rst,
    input  wr_en,
    input [(width-1):0] din,
    input  rd_en,
    output [(width-1):0] dout,
    output full,
    output empty
    );

   xpm_fifo_sync #(
		   .DOUT_RESET_VALUE("0"),
		   .ECC_MODE("no_ecc"),
		   .FIFO_MEMORY_TYPE("auto"),
		   .FIFO_READ_LATENCY(1),
		   .FIFO_WRITE_DEPTH(depth),
		   .FULL_RESET_VALUE(1),
		   .READ_DATA_WIDTH(width),
		   .READ_MODE("std"),
		   .SIM_ASSERT_CHK(0),
		   .USE_ADV_FEATURES("0000"),
		   .WAKEUP_TIME(0),
		   .WRITE_DATA_WIDTH(width)
		   )
   xpm_fifo_sync_inst (
      .almost_empty(),
      .almost_full(),
      .data_valid(),
      .dbiterr(),
      .dout(dout),
      .empty(empty),
      .full(full),
      .overflow(),
      .prog_empty(),
      .prog_full(),
      .rd_data_count(),
      .rd_rst_busy(),
      .sbiterr(),
      .underflow(),
      .wr_ack(),
      .wr_data_count(),
      .wr_rst_busy(),
      .din(din),
      .injectdbiterr(1'b0),
      .injectsbiterr(1'b0),
      .rd_en(rd_en),
      .rst(rst),
      .sleep(1'b0),
      .wr_clk(clk),
      .wr_en(wr_en)
   );
endmodule

选项#2: Embedded FIFO Generator

Embedded FIFO Generator 与著名的 FIFO Generator几乎相同,但 Embedded FIFO Generator 只能在 block 设计内部使用。

所以显而易见的解决方案是创建一个 block 设计并添加一 Embedded FIFO Generator。然后和之前的 FIFO Generator一模一样的设置这台 IP block 的参数。之后,将所有 FIFO的端口连接到外部端口。结果是 block 设计与 FIFO一样具有端口,并且行为类似于 FIFO,因此它是 FIFO。

这个解决方案有点难看,特别是因为 FIFO的端口的名称变得比平时长。例如,不是 wr_en,而是名称为 FIFO_WRITE_0_wr_en。

结论

尽管 FIFO Generator 从 Vivado的 IP Catalog 中消失是突然且无法解释的,但通常用 Parameterized Macro 或 block 设计替换这 IP 并不难。

在更广泛的背景下,即使对于支持它的 FPGAs ,停止使用 FIFO Generator 也是一个好主意,无论这如何影响将设计迁移到 Versal FPGAs的可能性。

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