0

我是 VHDL 编程的新手。该项目涉及检测内存阵列中的故障。我得到了错误的数据和地址。现在我想获取在内存数组中找到的特定地址的相应行号或列号。在 VHDL 中实现这一点的代码将不胜感激!这是我创建 SRAM 和执行读写操作的简单代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity memory is   

port(   Clock :     in std_logic;     
      Write :       in std_logic;
      Read  :  in std_logic;
      -- Addr  :     in std_logic_vector(7 downto 0);
     Data_in :  in std_logic_vector(7 downto 0);
     Data_out:  out std_logic_vector(7 downto 0);
    Data_out_f: out std_logic_vector(7 downto 0);
     add_out  : out std_logic_vector(7 downto 0)

);
end memory;

architecture behav of memory is

--Declaration of type and signal of a 256 element RAM
--with each element being 8 bit wide.
type ram_type is array (0 to 255) of    std_logic_vector(7 downto 0);
signal tmp_ram: ram_type:=(others=>"00000000");

signal Addr  :  std_logic_vector(7 downto 0):="00000000";

begin   

process(Clock,addr,Write,read)
begin

if (Clock'event and Clock='1') then

 if addr <"00001111" and write='1' and Data_in(7)/='U' then    

    addr <= addr + '1';

 elsif  addr >"00000000" and read='1' then

    addr <= addr - '1';    

 end if;

end if;  

end process;               

-- Write Functional Section
process(Clock,Write,Addr)
 begin        

    if Write='1' then

        tmp_ram(conv_integer(Addr)) <= Data_in;         

    end if;   

end process;       

process(Clock,Read,Addr)
 begin          
    if Read='1' then

        Data_out <= tmp_ram(conv_integer(Addr));            

    end if;   

end process;

end behav;
4

1 回答 1

0

假设您指的是 SRAM,行和列的排序方式特定于实际的硬件布局,并且对于使用 RAM 的 VHDL 代码通常并不重要(除非您真的对手动优化功耗感兴趣例如)。通常,一些最低有效位是指列,而最高有效位是指行。因此,如果您知道行数和列数,您可以将地址位拆分为行地址和列地址,尽管这仍然假设 SRAM 内部没有其他布局。

如果您将 RAM 编码为 VHDL 中的数组(让综合工具为您推断 RAM),您只需编写一个包含 RAM 中字数的一维数组。例如:

type ram_type is array(0 to g_DATA_DEPTH-1) of std_logic_vector(g_DATA_WIDTH-1 downto 0);

g_DATA_DEPTH=1024,很明显RAM的实际结构是不明确的:可能是1x1024、2x512、4x256等。

因此,最好将 RAM 视为一维字数组,而不是将其分成行和列。

于 2013-09-23T13:41:21.820 回答