我正在尝试在Quartus II上用VHDL编写一个描述RAM块的代码。但是这个代码是为Xlinx芯片合成的。
这是https://opencores.org/project/cpu_lecture
讲座的一部分此处遵循实体标题:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity RAMB4_S4_S4 is
generic(INIT_00 : bit_vector := X"00000000000000000000000000000000"
& "00000000000000000000000000000000";
INIT_01 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_02 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_03 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_04 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_05 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_06 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_07 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_08 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_09 : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0A : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0B : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0C : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0D : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0E : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000";
INIT_0F : bit_vector := X"00000000000000000000000000000000"
& X"00000000000000000000000000000000");
port( ADDRA : in std_logic_vector(9 downto 0);
ADDRB : in std_logic_vector(9 downto 0);
CLKA : in std_ulogic;
CLKB : in std_ulogic;
DIA : in std_logic_vector(3 downto 0);
DIB : in std_logic_vector(3 downto 0);
ENA : in std_ulogic;
ENB : in std_ulogic;
RSTA : in std_ulogic;
RSTB : in std_ulogic;
WEA : in std_ulogic;
WEB : in std_ulogic;
DOA : out std_logic_vector(3 downto 0);
DOB : out std_logic_vector(3 downto 0));
end RAMB4_S4_S4;
给我带来麻烦的代码部分是:
if (rising_edge(CLKB)) then
if (ENB = '1') then
DOB(3) <= cv(DATA(conv_integer(ADDRB & "11")));
DOB(2) <= cv(DATA(conv_integer(ADDRB & "10")));
DOB(1) <= cv(DATA(conv_integer(ADDRB & "01")));
DOB(0) <= cv(DATA(conv_integer(ADDRB & "00")));
if (WEB = '1') then
DATA(conv_integer(ADDRB & "11")) <= cv1(DIB(3));
DATA(conv_integer(ADDRB & "10")) <= cv1(DIB(2));
DATA(conv_integer(ADDRB & "01")) <= cv1(DIB(1));
DATA(conv_integer(ADDRB & "00")) <= cv1(DIB(0));
end if;
end if;
end if;
我收到以下错误消息:
Error (10821): HDL error at RAMB4_S4_S4.vhd(129): can't infer register for "DATA[0]" because its behavior does not match any supported register model
正如我之前所说,我知道这段代码是为了合成Xlinx芯片。我不知道的是,Quartus II合成器不支持此代码中的女巫功能,以及如何通过合成方式以适当的方式对其进行修改。
答案 0 :(得分:1)
这听起来像我(我最近学到的是)XY problem:询问尝试的解决方案而不是实际的问题。
让这段代码与英特尔(Altera)合作的方法是找出这是什么类型的RAM,并使用英特尔的IP生成器生成相同的RAM,然后将其连接到同一位置代码。您几乎肯定会发现英特尔RAM的接口与Xilinx不完全相同。解决这个问题的一个好方法是为Xilinx RAM编写一个替代架构,并在该架构中实例化Intel RAM,进行必要的名称更改,改变感应以及其他任何需要的黑客攻击。这种层次结构的虚拟层称为包装器。
很可能Xilinx RAM不能在Xilinx工具上合成,而只是一个仿真模型,用于代替Xilinx IP发生器产生的RAM输出。
您的错误消息的实际原因并不是因为Quartus II合成器不支持此代码中的某些&#34;功能&#34;本身,但因为Quartus没有将代码识别为RAM,所以试图合成触发器。然后发现使用触发器无法合成代码(因为它正在模拟RAM的行为)。