Vhdl 如何在片上RAM上放置元件
我在做一些缓存,我在实体中使用一些表(大表),这些表由std_逻辑_向量组成,我在Quartus 2 web版中这样做 在模拟中一切都很好,但当我尝试合成它时,它只使用闩锁和/或组件 有没有办法指定Quartus为这些表使用内存模块,而不是这些组合元素?或者可以从VHDL代码本身做一些事情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)
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,我不知道为什么在这里使用它。谢谢!