【发布时间】:2015-02-11 21:15:05
【问题描述】:
我正在尝试从我创建的二维数组中读取和写入:M。它似乎正在工作,但第一个读取操作总是失败。我总是在阅读之前填充数组。
有时当我阅读时,那里会有从未输入过的价值。我对 VHDL 编程相当陌生,但是我的二维数组正确吗?我是否正确访问和写入它?
当 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;
【问题讨论】:
-
由于您只访问整个单词,如果您将类型声明为
type array2D is array (7 downto 0) of std_logic_vector(31 downto 0),您的代码将显着简化。您不必执行这些 for 循环来以这种方式提取每个 32 位字。相同的效果,虽然在技术上可能不是“二维数组”。 -
话虽如此,我认为您发布的代码没有任何问题。它可能在您未发布的任何更高级别的代码中。