我有一个向量数组,希望使用 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 用户指南》听起来好像有一个 enable
和一个 write_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
和 enable
以及 write
全部放在一个 if
中而混淆。 > 语句 - 这是因为它们在推断 BRAM 时主要是“模板匹配”而不是“函数匹配”。您可能会发现,简单地拆分“enable if”和“write if”(就像我上面所做的那样),同时保持其余功能相同就足以使合成器执行所需的操作。
如果您使用的是 Xilinx 的 XST,那么您可以在文档中阅读有关推断 RAM 的所有内容(我的 XST 用户指南的第 204 页起 - 该章称为“RAM HDL 编码技术”)
关于xilinx - 为什么这个 VHDL 不推断 XST 中的 BRAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130764/