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 |
+------------+------------+---------------+----------------+
使用报告告诉我:
+----------------+------+-------+------------+-----------+-------+
| 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”。 我已经为此旋转了一个多星期,我非常沮丧。
Block RAM 需要至少一个时钟的流水线延迟。由于没有延迟,即使您应用了 ram_style 属性,它也被迫使用 LUT RAM。
您是否漏掉了
if (clk'EVENT and clk = '1')
?