2012-05-11 8 views
4

Я имитирую процессорную конструкцию, где содержимое программной памяти хранится в BRAM. Я реализую память программы с помощью VHDL (вывод BRAM). Я стараюсь избегать CoreGen, потому что я хочу сохранить дизайн портативным. В конце концов, этот проект перейдет к FPGA.BRAM_INIT в VHDL

Я ищу, чтобы узнать, есть ли способ инициализировать содержимое памяти BRAM с использованием генераторов VHDL? Я понимаю, что Coregen использует файл COE для инициализации BRAM, но есть ли у нас способ VHDL-кода для этого?

Позвольте мне знать ваши альтернативные предложения.

ответ

9

Да, это конечно возможно. Взгляните на Xilinx Synthesis Tool (XST) User guide, в частности на страницу 187.

Код, который они рекомендуют для этого, приведен ниже. В руководстве пользователя есть примечания относительно форматирования файла, который будет считаться. Обратите внимание, что этот код не напрямую использовать дженерики, но я мог себе представить, что вы могли бы установить постоянный или общий для хранения имени файла ...

-- 
-- Initializing Block RAM from external data file 
-- 
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use std.textio.all; 

entity rams_20c is 
port(clk : in std_logic; 
    we : in std_logic; 
    addr : in std_logic_vector(5 downto 0); 
    din : in std_logic_vector(31 downto 0); 
    dout : out std_logic_vector(31 downto 0)); 
end rams_20c; 
architecture syn of rams_20c is 
    type RamType is array(0 to 63) of bit_vector(31 downto 0); 
    impure function InitRamFromFile (RamFileName : in string) return RamType is 
     FILE RamFile : text is in RamFileName; 
     variable RamFileLine : line; 
     variable RAM : RamType; 
    begin 
     for I in RamType’range loop 
     readline (RamFile, RamFileLine); 
     read (RamFileLine, RAM(I)); 
     end loop; 
     return RAM; 
    end function; 
signal RAM : RamType := InitRamFromFile("rams_20c.data"); 
begin 
    process (clk) 
    begin 
     if clk’event and clk = ’1’ then 
     if we = ’1’ then 
      RAM(conv_integer(addr)) <= to_bitvector(din); 
     end if; 
     dout <= to_stdlogicvector(RAM(conv_integer(addr))); 
     end if; 
    end process; 
end syn; 
+0

Спасибо. Мне удалось использовать его в качестве имени файла. – boffin

1

С другой стороны, не пробуйте использовать дженерики или чтение файлов; просто объявите постоянный массив в пакете. Поместите его в пакет, а не в основную архитектуру, и вы даже можете записать пакет автоматически с помощью скрипта (скажем, чтения выхода ассемблера или текстового файла).

library ieee; 
use ieee.std_logic_1164.all; 

package ProgMem is 

type Word is std_logic_vector(7 downto 0); 

constant ROM : array (0 to 3) of Word := 
    (
     X"C3", 
     X"00", 
     X"00", 
     "UUUUUUUU");   

end package Progmem; 

Настоящая программа может быть больше, но это иллюстрирует рисунок на

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

  • Нет связанных вопросов^_^