我一直在尝试使用泛型在 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 单元。
有没有办法解决这个问题?
该=
运营商将返回一个布尔值。所以,表达式
Chip_Select and (I = to_integer(unsigned(address)))
当与 type 的输入端口关联时,std_ulogic
需要具有and
typestd_ulogic
输入、type 输入和 typeboolean
返回值的运算符版本std_ulogic
。(这个类型列表称为它的签名)。不and
存在这种版本的运算符。
有一个and
运算符版本,它具有两个 type 输入std_ulogic
和一个type返回值std_ulogic
。因此,为了使用它,您的编译器正在尝试查找=
返回std_ulogic
. 不存在这样的版本。因此你的错误。
解决这个问题并不简单,因为您需要一系列芯片选择信号。所以,你需要这样的东西(因为没有 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
?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句