gpt4 book ai didi

xilinx - 为什么这个 VHDL 不能在 XST 中推断 BRAM?

转载 作者:行者123 更新时间:2023-12-04 18:18:51 25 4
gpt4 key购买 nike

我有一个向量数组,我想使用 ISE 13.4 将它们存储在 Virtex-5 上的 Block RAM 中。它是 32Kb,应该适合 1 个 BRAM,但它都存储在逻辑中。我的系统使用 AMBA APB 总线,所以我检查选择线和启用线。请帮助我理解为什么这段代码不能推断出 BRAM。注意:这是一个更容易理解的虚拟示例,应该可以帮助我处理其他代码。

architecture Behavioral of top is
type memory_array is array (63 downto 0) of std_logic_vector(31 downto 0);
signal memory : memory_array;

attribute ram_style: string;
attribute ram_style of memory : signal is "block";

begin

process(Clk)
begin
if(rising_edge(Clk)) then
if(Sel and Wr_en and Enable) = '1' then
memory(to_integer(Paddr(5 downto 0))) <= Data_in;
elsif(Sel and not Wr_en and Enable) = '1' then
Data_out <= memory(to_integer(Paddr(5 downto 0)));
end if;
end if;
end process;

end Behavioral;

我声明 ram_style数组的 block但 XST 报告说: WARNING:Xst:3211 - Cannot use block RAM resources for signal <Mram_memory>. Please check that the RAM contents is read synchronously.
看来问题在于 read_enable 条件,但 Virtex 5 用户指南听起来像是有 enablewrite_enable在 BRAM 硬 block 上。我可以一直驱动​​输出,但我不想这样做,那样会浪费功率。还有其他想法吗?

最佳答案

您的逻辑可能与您设备的 BRAM 的工作方式不匹配(取决于设备,存在各种限制)。通常,data_out在启用 RAM 的每个时钟周期更新,而不仅仅是“不写入时” - 试试这个:

process(Clk)
begin
if(rising_edge(Clk)) then
if(Sel and Enable) = '1' then
Data_out <= memory(to_integer(Paddr(5 downto 0)));
if wr_en = '1' then
memory(to_integer(Paddr(5 downto 0))) <= Data_in;
end if;
end if;
end if;
end process;

我将 Data_out 分配“向上”移动,以明确它获得“旧”值 - 这是 BRAM 的默认行为,尽管也可以设置其他样式。

或者,这些工具可能会被 sel 混淆。和 enablewrite全部在一个 if声明 - 这是因为它们在推断 BRAM 时主要是“模板匹配”而不是“功能匹配”。您可能会发现,简单地将“enable if”和“write if”(如我上面所做的)分开,同时保持其余功能相同,就足以使合成器完成所需的工作。

如果您使用的是 Xilinx 的 XST,那么您可以在文档中阅读所有关于推断 RAM 的内容(我的 XST 用户指南的第 204 页 - 这一章称为“RAM HDL 编码技术”)

关于xilinx - 为什么这个 VHDL 不能在 XST 中推断 BRAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com