2015-02-11 2 views
0

Я пытаюсь читать и писать из созданного 2D-массива: М. Кажется, он работает, но первые операции чтения всегда терпят неудачу. Я всегда заполняю массив перед чтением.Чтение и запись из 2D-массива в VHDL

Иногда, когда я читаю, там будет ценность, которая никогда не вводилась. Я довольно новичок в программировании 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; 
+1

Поскольку вы только когда-либо доступ целые слов, ваш код будет значительно проще, если вы сделаете вашу декларацию типа 'типа array2D является массив (7 Downto 0) из std_logic_vector (31 до 0). Вам не придется делать это для циклов, чтобы вытащить каждое 32-битное слово таким образом. Тот же эффект, хотя, возможно, и не технически «2D-массив». – fru1tbat

+1

Это, как говорится, я не вижу ничего плохого в коде, который вы отправили. Это может быть какой-либо код более высокого уровня, который вы не разместили. – fru1tbat

ответ

1

Сигнал адр должен быть 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; 
+0

Спасибо, я изменил объявление массива в соответствии с этим. Я еще не закончил верхний уровень, я просто использую файл формы Quartus для его проверки. Проблема с выпуском могла быть только аппаратной проблемой. Так как случайные числа в выходе будут напоминать предыдущие значения. –

+0

Вот как выглядит симуляция. Там случайное число на выходе по какой-то причине http://s10.postimg.org/safhowki0/Capture.jpg –

Смежные вопросы