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

标签 xilinx synthesis virtex

我有一个向量数组,希望使用 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 的默认行为,尽管也可以设置其他样式。

或者,这些工具可能会被 selenable 以及 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/

相关文章:

comparison -/= 如何转换为 vhdl 中的实际硬件

fpga - 如何读取 JTAG 链中 Virtex 5 的状态寄存器?

c - 试图使连续的 FIFO 数据流

fpga - UIO 设备上的 mmap EINVAL 错误

c - 为什么xilinx使用指针将数据存储为数组?

vhdl - VHDL 的 IEEE 库中的可合成定点/浮点

javascript - 如何使用 WebAudio API 模拟模块化合成的 VC 触发行为?

embedded - 如何为 Avnet Virtex4 使用 OLED 显示器?

fpga - 如何验证 Xilinx Virtex 5 上的读回数据?

Xilinx FSBL 文档