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

Loops 未使用循环计数器定义VHDL比较操作,loops,generics,vhdl,ram,Loops,Generics,Vhdl,Ram,我一直在尝试用vhdl语言制作一个SRAM芯片,其中包含任意数量的寄存器和使用泛型的寄存器大小,除了寻址部分之外,我几乎都能让它正常工作 为了制作任意大小的SRAM芯片,我首先用下面的端口图制作一个单元SRAM单元(我测试了它以确认它工作正常) component SRAM_Cell_vhdl port ( IN : in std_ulogic; Select_Chip : in std_ulogic; Write_Enable : in std_

我一直在尝试用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单元

有办法解决这个问题吗?

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

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;
loop1:0到n-1中的I生成
循环2:对于0到m-1中的J生成
信号2首先,您的代码不是。如果是的话,会更有帮助。我想下面的备选方案应该有效

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;
loop1:0到n-1中的I生成
循环2:对于0到m-1中的J生成

signal2运算符
=
返回一个布尔值。那么,这个表达式呢

Chip_Select and (I = to_integer(unsigned(address)))
当与类型为
std\u-ulogic
的输入端口关联时,需要使用类型为
std\u-ulogic
的输入、类型为
boolean
的输入和类型为
std\u-ulogic
的返回值的
运算符版本。(此类型列表称为其签名)。不存在此类版本的
运算符

有一个版本的
运算符,具有两个类型为
std_-ulogic
的输入和类型为
std_-ulogic
的返回值。因此,为了使用它,编译器试图找到一个版本的
=
操作符,该操作符返回一个
std\u ulogic
。没有这样的版本。这就是你的错误

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

loop1:0到n-1中的I生成
循环2:对于0到m-1中的J生成
如果Chip_Select='1'和(I=to_integer(无符号(地址)),则

CS(I)(J)运算符返回布尔值。那么,这个表达式呢

Chip_Select and (I = to_integer(unsigned(address)))
当与类型为
std\u-ulogic
的输入端口关联时,需要使用类型为
std\u-ulogic
的输入、类型为
boolean
的输入和类型为
std\u-ulogic
的返回值的
运算符版本。(此类型列表称为其签名)。不存在此类版本的
运算符

有一个版本的
运算符,具有两个类型为
std_-ulogic
的输入和类型为
std_-ulogic
的返回值。因此,为了使用它,编译器试图找到一个版本的
=
操作符,该操作符返回一个
std\u ulogic
。没有这样的版本。这就是你的错误

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

loop1:0到n-1中的I生成
循环2:对于0到m-1中的J生成
如果Chip_Select='1'和(I=to_integer(无符号(地址)),则

CS(I)(J)上述代码基本上是整个文件减去实体和架构声明。上述解决方案不起作用,因为VHDL不允许从无符号到标准逻辑的转换。我试图通过为
I=to_integer(unsigned(address))
的结果创建一个信号来简化代码,但这给了我与以前相同的错误。上面的代码基本上是整个文件减去实体和体系结构声明。上述解决方案不起作用,因为VHDL不允许从无符号到标准逻辑的转换。我试图通过为
I=to_integer(unsigned(address))
的结果创建一个信号来简化您的代码,但这给了我与以前相同的错误。谢谢,我没有意识到这一点。为了解决这个问题,我创建了一个signal
address\u比较:SRAM\u total其中
SRAM_total是标准逻辑的数组(n-1到0,m-1到0)。然后我在这条语句中使用了这个信号,将布尔值转换成标准逻辑值
address\u比较(I,J)。问题是有办法解决这个问题吗?OP在评论中提到了这一点,而你的回答没有。没有一个你怎么解决这个问题?谢谢,我没有意识到这一点。为了解决这个问题,我创建了一个signal
address\u比较:SRAM\u total其中
SRAM_total是标准逻辑的数组(n-1到0,m-1到0)。然后我在这条语句中使用了这个信号,将布尔值转换成标准逻辑值
address\u比较(I,J)。问题是有办法解决这个问题吗?OP在评论中提到了这一点,而你的回答没有。通用SRAM芯片具有以下端口映射:“不,这是一个端口声明,通用子句丢失<
中的code>是VHDL中的保留字,不能用作标识符。缺少
中间输出的类型、声明以及读取选择器(实际应为
中间输出(I)(J)
)。隐式信号