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 design 的 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 和更高版本)。这些宏可以在 instantiations中使用,就像在 Verilog 或 VHDL中的任何 module 一样。他们的文档可以与 FPGA的 primitives 一起找到(例如,在 Versal Architecture Premium Series Libraries Guide, UG1485中)。

然而, primitives 和 Parameterized Macros之间有一个重要的区别: 当 synthesizer 遇到 primitive时,通常只会在 synthesized netlist中产生一个 logic element 。另一方面, Parameterized Macro会产生很多 logic elements,就像 Verilog module一样。

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

这两款 macros 生产的 FIFOs 都有“native”接口,即 wr_en 、 rd_en等端口。几乎所有 FIFO Generator 可用的选项都可以通过设置 macro的 instantiation parameters来启用。其中,这些 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 : 选择 Tools > Language Templates 并转到 Verilog > Xilinx Parameterized Macros (XPM) > XPM > XPM_FIFO,然后根据需要从那里选择 Synchronous 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 design内部使用。

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

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

结论

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

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

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