2012-05-11 2 views
4

프로그램 메모리 내용이 BRAM에 저장되는 프로세서 기반 설계를 시뮬레이션하고 있습니다. VHDL (유추 BRAM)을 사용하여 프로그램 메모리를 실현하고 있습니다. 디자인을 이식성있게 유지하기 위해 CoreGen을 피하려고합니다. 결국이 디자인은 FPGA로 갈 것입니다.VHDL의 BRAM_INIT

VHDL 제네릭을 사용하여 BRAM의 메모리 내용을 초기화하는 방법이 있는지 알고 싶습니다. 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; 

실제 프로그램은 더 이상 할 수 있지만이 패턴을