2014-04-21 7 views
0

알테라의 ALTSYNCRAM 블록 중 하나에 추론하도록 작성한 알테라 FPGA 타겟을위한 메모리 모듈이 있습니다. 메모리가 1024x16이고 속성으로 지정된 메모리 초기화 파일이 있습니다. 합성 할 때, 합성 보고서는 원하는 RAM 블록 유형을 생성했음을 나타내며, 초기화 파일이 지정된 것임을 나타냅니다. Altera의 ModelSim 버전으로 시뮬레이션하려고 할 때 데이터 신호가 완전히 초기화되지 않은 상태에서 시작되어 왜 그럴 수 없는지를 알 수 있습니다. 포럼 등에서 살펴본 결과, ModelSim이 ".mif"형식을 지원하지 않을 수도 있지만 ".hex"를 지원하므로 초기화 파일을 ".hex"로 변경했습니다. 또한 상대 파일 경로가 문제가 될 수 있음을 읽었지 만 시뮬레이션 디렉토리를 확인한 결과 시뮬레이션을 시도 할 때 QuartusII가 초기화 파일을 해당 디렉토리에 복사 한 것처럼 보입니다.추측 된 RAM이 ModelSim 알테라 에디션에서 초기화되지 않습니다.

메모리가 초기화되지 않는 이유 및 초기화하는 방법에 대한 아이디어가 있습니까? CPU.vhd를 컴파일하는 동안

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
library work; 
--use work.types.all; 
entity CPU is 
--... 
end entity CPU; 
architecture rtl of CPU is 
--these types are actually included in a package 
subtype reg is std_logic_vector(15 downto 0); 
type mem is array (0 to 1023) of reg; 

--... 
    --memory read port 
    signal MR : reg; 
    signal MRA : std_logic_vector(9 downto 0); --flops 
    --memory write port 
    signal MW : reg; --flops 
    signal MWA : std_logic_vector(9 downto 0); --flops 
    signal MWE : std_logic; --flop 

    signal data : mem; 
    attribute ram_init_file : string; 
    attribute ram_init_file of data : signal is "RAM_init.hex"; 
    attribute ramstyle : string; 
    attribute ramstyle of data : signal is "no_rw_check"; 
begin 
--... 
    --memory spec 
    MR <= data(to_integer(unsigned(MRA(9 downto 0)))); 
    memory_process : process(clk) 
    begin 
     if (clk'event and clk = '1') then 
       if(MWE = '1') then 
        data(to_integer(unsigned(MWA(9 downto 0)))) <= MW; 
       end if; 
     end if; 
    end process; 
end architecture rtl; --CPU 

ModelSim을가 경고 나 오류를 표시하지 않으며,이 초기화 파일을로드의 표시가 않습니다

유추 메모리를 포함하는 크게 손질 모델

.

이것은 알테라 소프트웨어 또는 메모리 초기화 파일을 사용하는 나의 첫 번째 디자인이며, 문제가 정말 기본적인 것이거나, 근본적으로 잘못된 각도에서 접근하고 있습니다. 일반적으로 패키지에서 상수로 메모리를 정의 하겠지만 클래스 용이며 메모리 초기화 파일이 있어야합니다 (.mif 형식도 필요하지만 시뮬레이션과 합성 파일).

답변

0

Modelsim에서 시뮬레이션을 시작할 때 메모리를 초기화하는 데 사용할 수있는 "mem load"명령이있는 것 같습니다. 이 스레드의 끝에서보세요 :

Initialization altsyncram

+0

이것은 결국 내가 한 일입니다. 나는 "mem load -i RAM_init.dat -format 16 진수/경로/to/RAM/신호" 을 tcl 시뮬레이션 스크립트의 시작 부분에 추가했습니다. 형식은 ascii로 표현 된 일반 16 진수로, 1024 단어 메모리의 경우에도 훨씬 더 마르코 같은 .mif 파일과 비교하면 꽤 깁니다. 이 문제를 어떻게 해결할 것인가는 아니지만 등급을 매길 VHDL에 추가 조항을 추가하는 것을 피하고 싶습니다. – QuantumRipple

0

FPGA에서 RAM을 초기화 할 수 있는지 여부는 신디사이저와 사용중인 특정 FPGA에 따라 다릅니다. 일부 FPGA 제품군은이를 지원하지만 다른 FPGA 제품군은이를 지원하지 않습니다. 저는 이것이 당신이 듣고 싶은 대답이 아니라는 것을 알고 있습니다, 그러나 당신은 알테라의 문서를 점검 할 필요가 있습니다.

+0

특정 FPGA는 싸이 클론 II EP2C35F672C6입니다. 나는 그 기억 단위가 초기화 될 수 있다는 것을 안다. 합성 도구는 유추 된 메모리가 초기화 파일로 초기화된다는 것을 나타냅니다. 하드웨어에로드해야한다면 일정한 메모리 초기화로 자일링스 타겟 버전을 이미 성공적으로 시뮬레이트했기 때문에 디자인이 의도 한대로 작동 할 것으로 기대한다. 내 문제는 합성과 관련이 없으며 시뮬레이션과 함께 사용되며 ModelSim Altera Edition에서 메모리 초기화 파일을 사용하는 방법입니다. – QuantumRipple

0

Modelsim은 합성 속성에주의하지 않습니다. 이것이 공급 업체별 협약입니다. 다른 사용자 정의 속성과 마찬가지로 시뮬레이션에서 참조 할 수 있지만 일부 속성이 여러 타사 신서사이저에서 특수한 동작을 호출한다는 것을 알지 못합니다.

  1. 메모리 파일의 내용을 읽는 함수를 작성하고 data 신호의 초기화 중에 전화 : 당신이 시뮬레이션의 RAM을 초기화 할 경우

    다음 중 하나를 수행해야합니다 .

  2. 메모리 내용을 별도의 패키지에 정의 된 VHDL 상수로 변환하고 이니셜 라이저로 data 신호에 상수를 할당합니다. 스크립트로 자동화 할 수 있습니다.RAM에

    impure function read_mem(fname : string) return mem is 
        variable data : mem; 
    begin 
        -- ** Perform read with textio ** 
        ... 
        return data; 
    end function; 
    
    signal data : mem := read_mem(data'ram_init_file); 
    

    끝임 문서 :

  3. 의 Verilog 시스템 작업 $readmemh를 사용

옵션 1의 경우,이 함수는 형식이어야합니다 (혼합 언어 라이센스 ModelSim을 필요) 초기화가 희박하며 파일에서 읽는 대신 VHDL 프로세스에서 할당 된 초기화 된 데이터 만 보여줍니다. Xilinx documentation on RAM/ROM inferencing (p258)은 범용 VHDL로이를 수행하는 예제를 제공합니다. 동일한 기술을 사용하여 Altera를 목표로 한 설계를 시뮬레이션 할 수 있습니다. XST는 합성을 위해이 파일 I/O를 사용하는 것을 지원하지만 Quartus는 그것을 막을 수 있습니다. 그렇다면 합성 지향적 인 RAM 모델과 기능을 사용하여 초기화하는 시뮬레이션을위한 설정 사이를 전환하는 구성을 사용해야합니다.

자일링스 예제는 ASCII 바이너리로 파일을 읽는 방법만을 보여줍니다. 나는 general purpose ROM component을 가지고 있습니다.이 16 진수는 바이너리뿐만 아니라 필요한만큼 RAM에 적용 할 수 있습니다.