如何在VHDL中强制使用block ram而不是LUT?

问题描述 投票:0回答:1

xc7s25csga225-1 FPGA Vivado v2023.2.2(64 位) VHDL

我不断收到错误:

[DRC UTLZ-1] 资源利用率:顶层设计中 F7 Mux 过度利用(此设计需要的 F7 Mux 单元多于目标器件中可用的单元。此设计需要 40806 个此类单元类型,但只有 7300 个兼容站点可用请分析您的综合结果和约束,以确保设计按预期映射到 Xilinx 原语。如果是这样,请考虑针对更大的设备。)

我认为这是因为综合在我的设计中使用 LUT 而不是 RAM 来实现一些 ROM。

综合报告告诉我:

ROM: Preliminary Mapping Report
+------------+------------+---------------+----------------+
|Module Name | RTL Object | Depth x Width | Implemented As | 
+------------+------------+---------------+----------------+
|cart        | ram        | 4096x8        | LUT            | 
|screen      | palette[0] | 128x24        | LUT            | 
+------------+------------+---------------+----------------+

使用报告告诉我:

  1. 内存

+----------------+------+-------+------------+-----------+-------+
|    Site Type   | Used | Fixed | Prohibited | Available | Util% |
+----------------+------+-------+------------+-----------+-------+
| Block RAM Tile |    0 |     0 |          0 |        45 |  0.00 |
|   RAMB36/FIFO* |    0 |     0 |          0 |        45 |  0.00 |
|   RAMB18       |    0 |     0 |          0 |        90 |  0.00 |
+----------------+------+-------+------------+-----------+-------+

我的“购物车”VHDL 看起来像:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity cart is
   port (addr      : in  std_logic_vector(11 downto 0);
         en        : in  std_logic;
         clk       : in  std_logic;
         data_out  : out std_logic_vector(7 downto 0);
         data_float: out std_logic);
end cart;

architecture behav of cart is
   type t_ram is array (0 to 4095) of std_logic_vector(7 downto 0);
   signal ram : t_ram := (
      x"85",x"2b",x"a5",x"84",x"30",x"00",x"29",x"0f",
-- [510 lines similar to this removed for brevity]
      x"00",x"00",x"98",x"fe",x"98",x"fe",x"98",x"fe"
   );
   attribute ram_style : string;
   attribute ram_style of ram : signal is "block";

   signal tmp : std_logic_vector(7 downto 0);
begin

   data_float <= not en;
   data_out <= tmp;

   process(clk,addr)
   begin
      tmp <= ram(to_integer(unsigned(addr)));
   end process;

end behav;

但它仍然以 LUT 的形式实现。

如何强制综合使用 FPGA 上的 RAM 块而不是 LUT ???

我尝试了各种不同的方法,例如使用带有或不带有 clk 的 case 语句。 似乎没有任何作用。 我尝试使用“IP Catalog”,但我根本不知道如何使其工作。 我尝试添加“-ram_style block”和“-rom_style block”。 我已经为此旋转了一个多星期,我非常沮丧。

vhdl fpga xilinx rom spartan
1个回答
0
投票

Block RAM 需要至少一个时钟的流水线延迟。由于没有延迟,即使您应用了 ram_style 属性,它也被迫使用 LUT RAM。

您是否漏掉了

if (clk'EVENT and clk = '1')

© www.soinside.com 2019 - 2024. All rights reserved.