首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个VHDL不能在XST中推断BRAM?

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

Stack Overflow用户
提问于 2012-06-21 10:25:05
回答 3查看 3.7K关注 0票数 2

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

代码语言:javascript
复制
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用户指南让人感觉在BRAM硬盘上有一个enable和一个write_enable。我可以一直驱动输出,但我不想这样做,那样会浪费电力。还有其他想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-22 02:36:01

我尝试了许多不同的组合,这里是我唯一有效的组合:

代码语言:javascript
复制
en_BRAM <= Sel and Enable;

process(Clk)
begin
    if(rising_edge(Clk)) then       
        if(en_BRAM = '1')then
                if(Wr_en = '1') then
                    icap_memory(to_integer(Paddr(5 downto 0))) <= Data_in;
                else
                    Data_out <= icap_memory(to_integer(Paddr(5 downto 0)));         
                end if;
        end if;
    end if;
end process;

因此,我认为使能需要在整个RAM上,它只能是1个信号。那么写使能也只能是1个信号,并且读必须只是一个else语句(不是if/elsif)。这将根据64位Windows 7上ISE 13.3中的XST实例化BRAM。

票数 1
EN

Stack Overflow用户

发布于 2012-06-21 16:59:07

你的逻辑可能与你的设备的BRAM的工作方式不匹配(根据设备的不同,有各种限制)。通常,data_out会在启用随机存取存储器的每个时钟周期内更新,而不仅仅是“不写入时”更新--试试这个:

代码语言:javascript
复制
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的默认行为,尽管也可以设置其他样式。

或者,这些工具可能会被selenablewrite混淆在一条if语句中-这是因为在推断BRAM时,它们主要是“模板匹配”而不是“函数匹配”。您可能会发现,只需将"enable if“和"write if”(如上所述)分开,同时保持其余功能不变,就足以让合成器执行所需的操作。

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

票数 2
EN

Stack Overflow用户

发布于 2012-06-21 10:33:57

是否为设备上的BRAM块使用适当的宏?我发现这比依赖合成工具要好得多,不是很愚蠢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11130764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档