10821 HDL错误 - 将VHDL代码从Xlinx移植到Altera

时间:2018-04-15 02:45:51

标签: vhdl fpga quartus

我正在尝试在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合成器不支持此代码中的女巫功能,以及如何通过合成方式以适当的方式对其进行修改。

1 个答案:

答案 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的行为)。