0

我正在制作某种缓存,我在实体内部使用了一些表(大表),这些表由 std_logic_vectors 组成,我在 Quartus 2 网络版中执行此操作。

在模拟中一切正常,但是当我尝试合成它时,它只能使用锁存器、AND 和 OR 组件来完成。

有没有办法指定 Quartus 为这些表使用内存模块而不是这些组合元素?或者也许可以从 VHDL 代码本身完成一些事情。

library ieee;
use ieee.std_logic_1164.all;

package UTIL_PACK is
    type matrix16x8 is array (0 to 15) of std_logic_vector(0 to 7);
    type matrix2p4x8 is array (0 to 2**4) of matrix16x8;
end package;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.util_pack.all;

entity  RAM16B is

    port(
        signal RD: in std_logic;
        signal WR: in std_logic;
        signal CLK: in std_logic;
        signal A: in std_logic_vector(7 downto 0);
        signal D: inout matrix16x8;
        signal FC: out std_logic 
    );

end entity ;

architecture RAM16B_IMPL of RAM16B is
    signal memory: matrix2p4x8 := ((others => (others => (others => 'Z')))); 
begin 

run:process(clk)is
    variable slot:integer range 0 to 15 :=0;
    begin
        if(clk='1') then
            slot := TO_INTEGER(unsigned(A)) rem 16;
            if(rd = '1')then
                FC<='0';
                for i in 0 to 3 loop
                    D(i) <= memory(i)(slot);
                end loop;
                FC<='1';
            elsif(wr = '1')then
                FC<='0';
                for i in 0 to 3 loop
                    memory(i)(slot) <= D(i);
                end loop;
                FC<='1';
            else 
                FC <= 'Z';
                D <= ( others => ( others => 'Z' ));
            end if;
        else
            FC <= 'Z';
            D <= ( others => ( others => 'Z' ));
        end if;
    end process;

end architecture RAM16B_IMPL;

RAM由16块内存组成,每块16字节。我正在尝试并行读取更多数据,因此我每个周期读取/写入 16 个字节的数据。插槽定义了正在执行读/写的块。

4

2 回答 2

1

是的,你可以从你的 VHDL 代码中做到这一点。为了确保 Quartus 理解您正在对存储器进行建模,您应该按照 Altera 的推荐 HDL 编码样式指南中的描述对其进行编码。查看名为Inferring Memory Functions from HDL Code ( http://www.altera.com/literature/hb/qts/qts_qii51007.pdf ) 的部分,然后相应地修改您的代码。

从 Altera 建议的确切存储器模型开始可能是一个好主意,并确保 Quartus 使用 FPGA 的专用存储器位综合设计。接下来,您可以逐渐更改您的模型以实现所需的行为,始终综合并查看编译报告以确保您的更改没有偏离 Quartus 推断为内存块的内容。

于 2013-10-20T13:21:30.390 回答
1

如果你真的想确保你使用硬内存块,你应该使用宏功能向导来制作一个自定义 ram 组件,或者直接从库中实例化一个 altsyncram 组件并使用泛型来配置它。如果您对这些选项不是非常熟悉,这可能会很棘手)。这会导致移植问题,但是任何时候您推断 ram,您通常都会遇到移植问题。如果您确实需要迁移到其他东西,使用自定义库组件可以非常明显且轻松地确定您可能遇到的问题。

至于您的具体实现,您不可能将锁存器自动迁移到作为边缘驱动设备的硬内存块中。在您的过程中使用rising_edge(clk) 而不是clk='1' 来解决这个问题。

此外,芯片内部不支持三态操作,您需要独立的数据输入和数据输出端口。你得到了很多离散的逻辑,因为 and & or 门被用来模拟三态总线(并且因为上面的锁存问题)。

于 2013-10-20T14:57:09.163 回答