01signal.com

Versal APAC FPGAs에서 FIFOs 사용하기

FIFO Generator는 어디에 있습니까?

Versal FPGAs를 사용할 때 Xilinx는 Verilog 또는 VHDL의 instantiation 에서 사용할 수 있는 일반 FIFO를 구현하는 IP block을 제공하지 않습니다. 잘 알려진 FIFO Generator IP는 이러한 FPGAs에 사용할 수 없습니다. 이것은 적어도 Vivado 2022.1 이전의 경우입니다.

따라서 기존 FPGA design 의 FPGA part를 Versal FPGA로 변경하면 프로젝트에 약간의 변경이 필요할 것으로 보입니다. 거의 모든 FPGA 프로젝트는 FIFO Generator를 사용합니다.

Memory Generator도 마찬가지입니다. 때때로 block RAMs를 생성하는 데 사용되는 IP는 Versal FPGAs 에서도 제거되었습니다. 그러나 block RAMs는 종종 inference덕분에 생성되기 때문에 이 IP는 덜 사용됩니다. 즉, Verilog (또는 VHDL)의 array은 일반적으로 RAM을 생성하기 위해 선언됩니다.

AXI 인터페이스가 있는 FIFOs 및 RAMs는 여전히 IPs로 사용할 수 있습니다. Versal FPGAs 에 대한 지원 부족은 "native" 인터페이스가 있는 FIFOs 및 block RAMs 에만 관련됩니다.

이 문제를 해결하기 위한 몇 가지 옵션이 있습니다. 나는 두 가지 가능한 방법을 제안할 것이다.

FIFOs에 대한 일반 자습서는 이 페이지 시리즈를 참조하십시오.

옵션 1: Xilinx Parameterized Macros사용

Xilinx Parameterized Macros는 이 소프트웨어(즉, series-7 FPGAs 이상)에서 지원하는 모든 FPGAs 에 대해 Vivado 에서 사용할 수 있습니다. 이러한 매크로는 Verilog 또는 VHDL의 module 와 마찬가지로 instantiations에서 사용할 수 있습니다. 해당 문서는 FPGA의 primitives (예: Versal Architecture Premium Series Libraries Guide, UG1485)와 함께 찾을 수 있습니다.

그러나 primitives 와 Parameterized Macros사이에는 중요한 차이점이 있습니다. synthesizer가 primitive를 만나면 일반적으로 synthesized netlist에서 하나의 logic element 만 생성합니다. 반면 Parameterized Macro는 Verilog module와 마찬가지로 logic elements를 많이 생산합니다.

FIFOs를 생산하는 여러 parameterized macros가 있으며, 특히 다음 두 가지가 있습니다.

이 두 macros 에 의해 생산된 FIFOs 에는 "native" 인터페이스, 즉 wr_en 및 rd_en와 같은 포트가 있습니다. FIFO Generator 에서 사용할 수 있었던 거의 모든 옵션은 macro의 instantiation parameters를 설정하여 활성화할 수 있습니다. 무엇보다도 이러한 FIFOs는 "Standard FIFOs" 또는 First Word Fall Through (FWFT)가 될 수 있습니다.

다른 종류의 RAMs를 구현하기 위한 몇 가지 macros 도 있습니다. 그럼에도 불구하고 여러 종류의 AXI-Stream FIFOs가 있지만 Versal FPGAs의 경우에도 IP blocks로 생성할 수 있습니다.

이러한 macros를 사용하는 방법에 대한 전체 정보는 관련 Libraries Guide( Versal FPGAs용 UG1485 )를 참조하십시오. 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를 추가하는 것입니다. 그런 다음 이 IP block 의 매개변수를 이전 FIFO Generator와 동일하게 설정합니다. 그런 다음 FIFO의 모든 ports를 외부 ports에 연결합니다. 결과는 FIFO와 같은 ports가 있고 FIFO처럼 작동하는 block design이 므로 FIFO입니다.

이 솔루션은 특히 FIFO의 ports 이름이 평소보다 길어지기 때문에 약간 추합니다. 예를 들어, wr_en대신 FIFO_WRITE_0_wr_en라는 이름이 있습니다.

결론

Vivado의 IP Catalog 에서 FIFO Generator가 사라진 것은 갑작스럽고 설명할 수 없지만 일반적으로 이 IP를 Parameterized Macro 또는 block design로 교체하는 것은 어렵지 않습니다.

더 넓은 맥락에서, design을 Versal FPGAs로 마이그레이션할 가능성에 영향을 미치는 것과 상관없이 지원하는 FPGAs 에 대해서도 FIFO Generator 사용을 중단하는 것이 좋습니다.

이 페이지는 영어에서 자동으로 번역됩니다. 불분명한 사항이 있으면 원본 페이지를 참조하십시오.
Copyright © 2021-2024. All rights reserved. (6f913017)