未使用循环计数器定义的 VHDL 比较操作

VHDL Comparison Operation Not Defined with Looping Counter

我一直在尝试使用泛型在 vhdl 中制作一个具有任意数量的寄存器和寄存器大小的 SRAM 芯片,除了寻址部分,我几乎已经让它工作了。

为了制作任意大小的 SRAM 芯片,我首先使用以下端口映射制作一个单元 SRAM 单元(我对其进行了测试以确认它可以工作)。

component SRAM_Cell_vhdl
port (
        IN : in std_ulogic;
        Select_Chip : in std_ulogic;
        Write_Enable : in std_ulogic;
        Out1 : out std_ulogic
);

通用SRAM芯片有如下端口映射:

port (
    Datain : in std_logic_vector(m-1 downto 0);
    address: in std_logic_vector(n-1 downto 0);
    Chip_Select: in std_logic;
    Output_Enable: in std_logic;
    Write_Enable: in std_logic;
    Out2: out std_logic_vector(m-1 downto 0)
);

我尝试进行寻址的方式是,当它生成 SRAM 时,它会检查循环计数器是否等于地址。如果是,它将将该位写入 SRAM 单元,如果不是,则不会。

  loop1: for I in 0 to n-1 generate
    loop2: for J in 0 to m-1 generate
            SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map
                (Datain(J), Chip_Select and (I = to_integer(unsigned(address))), Write_Enable and Chip_Select, intermediate_out(I, J));
        end generate loop2;
    end generate loop1;

但是,我在 I = to_integer(unsigned(address))) 收到一个错误,告诉我它无法确定操作 "=" 的定义。我认为循环计数器是一个整数,我将地址转换为整数的方式应该是在两个整数之间进行比较。我想到的另一种方法是使用 if 语句比较 I 和地址,但我担心它不会生成所有需要的 SRAM 单元。

有没有办法解决这个问题?

首先,你的代码不是MCVE。如果是的话会更有帮助。我想下面的替代方案应该有效。

loop1: for I in 0 to n-1 generate
  loop2: for J in 0 to m-1 generate

    signal2 <= Write_Enable and Chip_Select;

    check1: if (I = to_integer(unsigned(address))) generate
      signal1 <= Chip_Select and std_ulogic(unsigned(address));      
    end generate check1;

    SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map (Datain(J), signal1 , signal2 , intermediate_out(I, J));

  end generate loop2;
end generate loop1;

此外,我更喜欢在 port map

中使用 命名关联 而不是 位置关联

= 运算符 return 是一个布尔值。所以,表达式

Chip_Select and (I = to_integer(unsigned(address)))

std_ulogic类型的输入端口关联时,需要具有std_ulogic类型输入的and运算符版本, boolean 类型的输入和 std_ulogic 类型的 return 值。 (这个类型列表称为它的 signature)。不存在 and 运算符的此类版本。

and 运算符有一个版本,它有两个 std_ulogic 类型的输入和一个 return 类型 std_ulogic 的值。因此,为了使用它,您的编译器正在尝试找到 return 是 std_ulogic= 运算符版本。不存在这样的版本。因此你的错误。

解决这个问题不是直截了当的,因为您需要一组芯片 select 信号。所以,你需要这样的东西(因为没有MCVE,我还没有测试过):

loop1: for I in 0 to n-1 generate
  loop2: for J in 0 to m-1 generate
    if Chip_Select = '1' and (I = to_integer(unsigned(address))) then
      CS(I)(J) <= '1';
    else
      CS(I)(J) <= '0';
    end if;
    SRAM_Cell_vhdl1 : SRAM_Cell_vhdl port map (Datain(J), CS(I)(J), Write_Enable and Chip_Select, intermediate_out(I, J));
  end generate loop2;
end generate loop1;

其中 CSstd_ulogic 的某种数组。