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

10821 HDL error - Porting VHDL code from Xlinx to Altera

我正在尝试在 Quartus II 上用 VHDL 综合描述 RAM 块的代码。但是这段代码是为 Xlinx 芯片合成的。

这是https://opencores.org/project/cpu_lecture

讲座的一部分

这里关注实体header:

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 合成器不支持此代码中的 功能,以及如何以适当的方式修改它以进行合成。

这听起来像是(我最近了解到的)XY problem询问尝试的解决方案而不是实际问题

让此代码与 Intel (Altera) 一起工作的方法是找出这是哪种 RAM,并使用 Intel 的 IP 生成器生成相同的 RAM,然后将其连接到代码中的相同位置.您几乎肯定会发现 Intel RAM 的接口与 Xilinx 的接口并不完全相同。解决这个问题的一个好方法是为 Xilinx RAM 编写一个替代架构,并在该架构中实例化 Intel RAM,进行必要的名称更改、意义更改和任何其他所需的黑客攻击。这种层次结构的虚拟层称为 wrapper.

很可能 Xilinx RAM 也不能在 Xilinx 工具上合成,而只是一个模拟模型,旨在用于代替 Xilinx IP 生成器生成的 RAM 的输出。

您的错误消息的实际原因不是因为某些 "features in this code are not supported by the Quartus II synthesizer" 本身,而是因为 Quartus 未将代码识别为 RAM,因此正在尝试合成触发器。然后发现无法使用触发器合成代码(因为它正在模拟 RAM 的行为)。