未使用循环计数器定义的 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;
其中 CS
是 std_ulogic
的某种数组。
我一直在尝试使用泛型在 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;
其中 CS
是 std_ulogic
的某种数组。