Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 如何在片上RAM上放置元件_Vhdl_Ram_Intel Fpga - Fatal编程技术网

Vhdl 如何在片上RAM上放置元件

Vhdl 如何在片上RAM上放置元件,vhdl,ram,intel-fpga,Vhdl,Ram,Intel Fpga,我在做一些缓存,我在实体中使用一些表(大表),这些表由std_逻辑_向量组成,我在Quartus 2 web版中这样做 在模拟中一切都很好,但当我尝试合成它时,它只使用闩锁和/或组件 有没有办法指定Quartus为这些表使用内存模块,而不是这些组合元素?或者可以从VHDL代码本身做一些事情 library ieee; use ieee.std_logic_1164.all; package UTIL_PACK is type matrix16x8 is array (0 to 15)

我在做一些缓存,我在实体中使用一些表(大表),这些表由std_逻辑_向量组成,我在Quartus 2 web版中这样做

在模拟中一切都很好,但当我尝试合成它时,它只使用闩锁和/或组件

有没有办法指定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;
ieee库;
使用ieee.std_logic_1164.all;
包UTIL_PACK是
matrix16x8型是标准逻辑向量(0到7)的数组(0到15);
matrix2p4x8类型是matrix16x8的数组(0到2**4);
端包装;
图书馆ieee;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用work.util_pack.all;
实体RAM16B是
港口(
信号RD:在标准逻辑中;
信号WR:在标准逻辑中;
信号时钟:在标准逻辑中;
信号A:标准逻辑向量(7到0);
信号D:输入输出矩阵16x8;
信号FC:输出标准逻辑
);
终端实体;
RAM16B的体系结构RAM16B_IMPL是
信号存储器:matrix2p4x8:=((其他=>(其他=>(其他=>‘Z’)));
开始
运行:进程(clk)正在运行
可变时隙:整数范围0到15:=0;
开始
如果(clk='1'),则
时隙:=到_整数(无符号(A))rem 16;
如果(rd='1'),则

FC是的,您可以从VHDL代码中执行。为了确保Quartus理解您正在建模内存,您应该按照Altera推荐的HDL编码风格指南中的描述对其进行编码。看一看名为从HDL代码()推断内存函数的部分,然后相应地修改代码


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

如果您确实想确保使用硬内存块,您应该使用mega function向导创建一个自定义ram组件,或者直接从库中实例化一个altsyncram组件,并使用泛型来配置它(如果您不太熟悉这些选项,这可能会很棘手)。这会导致移植问题,但无论何时推断ram,通常都会出现移植问题。如果您确实需要迁移到其他地方,使用自定义库组件可以非常明显和容易地确定哪里可能有问题

至于您的具体实现,您无法将闩锁自动迁移到硬ram块中,硬ram块是边缘驱动设备。在您的流程中使用上升沿(clk)而不是clk='1'来修复此问题


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

这篇文档很好,但是您能给我一些关于这段特定代码的建议吗?我没有注意到他们在指定RAM模块的使用方面比我更多地使用了什么。我还收到了关于“推断双时钟RAM节点”的合成警告。这一部分关于分割数据输入和数据输出,帮助很大。我通常使用RISING_EDGE,我不知道为什么在这里使用它。谢谢!