Loops 未使用循环计数器定义VHDL比较操作
我一直在尝试用vhdl语言制作一个SRAM芯片,其中包含任意数量的寄存器和使用泛型的寄存器大小,除了寻址部分之外,我几乎都能让它正常工作 为了制作任意大小的SRAM芯片,我首先用下面的端口图制作一个单元SRAM单元(我测试了它以确认它工作正常)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_
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))
的结果创建一个信号来简化您的代码,但这给了我与以前相同的错误。谢谢,我没有意识到这一点。为了解决这个问题,我创建了一个signaladdress\u比较:SRAM\u total代码>其中SRAM_total是标准逻辑的数组(n-1到0,m-1到0)代码>。然后我在这条语句中使用了这个信号,将布尔值转换成标准逻辑值address\u比较(I,J)。问题是有办法解决这个问题吗?OP在评论中提到了这一点,而你的回答没有。没有一个你怎么解决这个问题?谢谢,我没有意识到这一点。为了解决这个问题,我创建了一个signaladdress\u比较:SRAM\u total代码>其中SRAM_total是标准逻辑的数组(n-1到0,m-1到0)代码>。然后我在这条语句中使用了这个信号,将布尔值转换成标准逻辑值address\u比较(I,J)。问题是有办法解决这个问题吗?OP在评论中提到了这一点,而你的回答没有。通用SRAM芯片具有以下端口映射:“不,这是一个端口声明,通用子句丢失<
中的code>是VHDL中的保留字,不能用作标识符。缺少中间输出的类型、声明以及读取选择器(实际应为中间输出(I)(J)
)。隐式信号