【问题标题】:Read and Write from 2D array in VHDL在 VHDL 中读取和写入二维数组
【发布时间】: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 位字。相同的效果,虽然在技术上可能不是“二维数组”。
  • 话虽如此,我认为您发布的代码没有任何问题。它可能在您未发布的任何更高级别的代码中。

标签: arrays 2d vhdl


【解决方案1】:

addr信号应该是2 downto 0,或者数组(255 downto 0, 31 downto 0)

addr 转换为整数时,取值范围为 0 到 255(8 位)。数组的第一个维度被定义为7 down to 0,因此当addr if 8或更多时,它在范围之外并且comportement是未定义的。

此外,我建议不要使用 2D 数组,因为至少 Xilinx 无法正确合成它们。 std_logic_vector 或记录的数组可以正常工作。根据 cmets 的建议,您可以使用:

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;

【讨论】:

  • 谢谢,我更改了数组声明以匹配它。我还没有完成顶层,我只是使用Quartus波形文件来测试它。输出问题可能只是硬件问题。因为输出中的随机数会类似于之前的值。
  • 这是模拟的样子。由于某种原因,输出中有一个随机数s10.postimg.org/safhowki0/Capture.jpg
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 2019-10-16
  • 1970-01-01
  • 2017-01-03
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多