我正在尝试从我创建的2D数组中读取和写入:M。它似乎正在工作,但第一次读操作总是失败。我总是在阅读之前填充数组。
有时当我阅读时,那里会有从未输入的价值。我是VHDL编程的新手,但我的2D数组是否正确?我是否正确访问并写入?
当EN和WEN为1时,我想写。 当EN为1且WEN为0时,我想阅读。
data_in中的值进入数组。当我'读'它们时,它们会输出到data_out。
TIA,如果我没有提供足够的信息,请告诉我。
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY data_mem IS
PORT(
clk : IN STD_LOGIC;
addr : IN UNSIGNED(7 DOWNTO 0);
data_in : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
wen : IN STD_LOGIC;
en : IN STD_LOGIC;
data_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END data_mem;
ARCHITECTURE Description OF data_mem IS
signal tOUT : STD_LOGIC_VECTOR(31 DOWNTO 0);
type array2D is array (7 downto 0,31 downto 0) of std_logic;
signal M : array2D;
BEGIN
PROCESS(clk)
Begin
if (falling_edge(clk)) then
if (en = '1') then
if (wen = '0') then
--Read. data_out = M[addr]
for i in 0 to 31 loop
tOUT(i) <= M(to_integer(addr),i);
end loop;
else
--Write M[addr] <= data_in && data_out = 0
for i in 0 to 31 loop
M(to_integer(addr),i) <= data_in(i);
end loop;
tOUT <= (tOUT'range => '0');
end if;
else
--Function: N/A data_out = 0
tOUT <= (tOUT'range => '0');
end if;
end if;
END PROCESS;
data_out <= tOUT;
END Description;
答案 0 :(得分:1)
addr信号应 2 downto 0 ,或数组(255 downto 0,31 downto 0)。
当addr转换为整数时,它的取值范围为0到255(8位)。数组的第一个维度定义为 7 downto 0 ,因此当addr为8或更多时,它超出范围并且comportement未定义。
此外,我建议不要使用2D阵列,因为至少Xilinx无法正确合成它们。 std_logic_vector或记录的数组工作正常。正如评论中所建议的那样,您可以使用:
type array is array(7 downto 0) of std_logic_vector(31 downto 0);
...
tOUT <= M(to_integer(addr));
...
M(to_integer(addr)) <= data_in;