2013-10-03 4 views
0

는이 코드std_logic_vector를 초기화하는 방법은 무엇입니까? 내가 잘하지만, 내선 벡터는 초기화되지 않은 상태로 유지 초기화이 RAM 모듈 STR 벡터에 대한 시뮬레이션을 실행하면

--RAM module 
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.numeric_std.all; 

entity RAM is 
    generic(
    address_length, data_length : integer); 
    port(
    addr  : in std_logic_vector(address_length-1 downto 0); 
    dat  : inout std_logic_vector(data_length-1 downto 0); 
    rd, wr, en : in bit); 
end entity RAM; 

architecture RAM_impl of RAM is 
    type mem is array(2**address_length-1 downto 0) of std_logic_vector(data_length-1 downto 0); 
begin 
    process(rd, wr, en)is 
    variable cont : mem; 
    begin 
    if(en = '1')then 
     if(wr = '1' and rd = '0')then 
     cont(to_integer(unsigned(addr))) := dat; 
     end if; 
     if(rd = '1' and wr = '0')then 
     dat <= cont(to_integer(unsigned(addr))); 
     end if; 
    end if; 
    end process; 
end architecture RAM_impl; 


--Test module 
library IEEE; 
use IEEE.STD_LOGIC_1164.all; 
use IEEE.numeric_std.all; 

entity Example4RAM is 
end entity Example4RAM; 

architecture Tester of Example4RAM is 
    signal rd, wr, en : bit; 
    signal str  : std_logic_vector(15 downto 0); 
    signal ext  : std_logic_vector(7 downto 0); 
begin 
    module : entity work.RAM(RAM_impl) 
    generic map(
     address_length => 16, 
     data_length => 8) 
    port map(str, ext, rd, wr, en); 
    tt : process is 
    begin 
    str <= X"0001"; 
    ext <= "00000000"; 
    rd <= '0'; wr <= '1'; 
    wait for 5 ns; 
    en <= '1'; 
    wait for 5 ns; 
    rd <= '0'; wr <= '0'; 
    wait for 10 ns; 
    rd <= '1'; wr <= '0'; 
    end process; 
end architecture Tester; 

있습니다. RAM 모듈에서 str은 벡터에 있고 ext는 inout 벡터입니다. 이것은 어떻게 든 문제를 만들고 있으며 누구나 해결책을 알고 있습니까? (어제부터 소스를 변경했으나 여전히 작동하지 않습니다.)

+1

RAM 엔티티 (및 아키텍처)를 보지 않고서는 어둠 속에서만 추측 할 수 있습니다. 두 번째 매개 변수 (명명 된 연결을 사용하지 않는 이유는 무엇입니까?)가 "out"또는 "inout"모드이면 대답이있을 것입니다. –

+0

Brian은 ext가 RAM에 대한 데이터 연결이고 연결된 드라이버 (예 : 모드 inout)에 ext (RAM, process tt) 용 두 개의 드라이버가 있다고 암시합니다. ext의 유효 값은 두 드라이버의 해상도입니다. 모든 'U'와 '모두'0이 모두 'U'로 변환됩니다. std_logic_vector는 확인 된 유형 또는 하위 유형 (-2008)입니다. RAM 설계 설명이 없으면 성공을 달성하는 방법을 예측하기 어렵습니다. 즉, RAM을 읽기 전에 모든 Z를 처리하지 않고 RAM이 아닐 수도 있습니다. – user1155120

+0

위의 코드를 수정하고 RAM을 확인하십시오. VHDL의 초보자이므로 어떤 제안이 도움이 될 것입니다. – Dejan

답변

2

RAM 모듈을 추가하고 테스트 자극을 사용하여 약간 수정했습니다 (wr이 유효하지 않은 경우 ext가 모든 'Z로 유도됩니다. .)를 통해

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity RAM is 
    generic (
     constant address_length: natural := 16; 
     constant data_length:  natural := 8 
    ); 
    port (
     signal str:  in  std_logic_vector (address_length-1 downto 0); 
     signal ext:  inout std_logic_vector (data_length-1 downto 0); 
     signal rd:  in  BIT; 
     signal wr:  in  BIT 
    ); 
end entity; 

architecture RAM_impl of RAM is 
    type ram_array is array (natural range address_length-1 downto 0) 
     of std_logic_vector (data_length-1 downto 0); 
    signal mem_array: ram_array; 
begin 


MEMORY: 
    process (str, ext, rd, wr) 
     variable addr: natural range 0 to 2**address_length -1 ; 
    begin 
     addr := TO_INTEGER(UNSIGNED(str)); -- heed the warnings 
     if wr = '1' then 
      mem_array(addr) <= ext; 
     end if; 
     if rd = '0' then 
      ext <= (others => 'Z'); 
     else 
      ext <= mem_array(addr); 
     end if; 
    end process; 


end architecture; 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
-- use IEEE.numeric_std.ALL; 

entity Example4RAM is 
end entity Example4RAM; 

architecture Tester of Example4RAM is 
signal rd,wr,clk: bit; 
signal str: std_logic_vector(15 downto 0); 
signal ext: std_logic_vector(7 downto 0); 
begin 

module: 
    entity work.RAM(RAM_impl) 
     generic map (
      address_length=>16, 
      data_length=>8 
     ) 
     port map (
      str, 
      ext, 
      rd, 
      wr 
     ) 
    ; 

tt: 
    process 
    begin 
     str<=X"0001"; 
     ext<="00000000"; 
     wait for 5 ns; 
     rd<='0';wr<='1'; 
     wait for 5 ns; 
     rd<='0';wr<='0'; 
     ext <= (others => 'Z'); -- ADDED 
     wait for 10 ns; 
     rd<='1';wr<='0'; 
     wait for 20 ns; -- ADDED 
     str <=X"0002"; -- ADDED 
     wait for 20 ns; -- ADDED 
     wait; 
    end process; 
end architecture Tester; 

자극에 대한 변화는 보여주는 RAM 주소 변경을 포함하는 파형에 초기화되지 않은 위치를 반환 'U의 (UU) 읽기 :

RAM write followed by RAM read with a subsequent different address

ghdl -a exampleram.vhdl 
ghdl -r Example4RAM --wave=Example4RAM.ghw 
../../../../libraries/ieee/numeric_std-body.v93:2098:7:@0ms:(assertion warning): 
NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0 
open *.ghw 
을3210

기본적으로 프로세스와 RAM은 둘 중 하나가 값을 내 보내지 않아야 할 때마다 모든 'Z'를 사용하여 드라이브를 확장합니다. 읽기 전에 쓰기는 str 주소 X "0001"에서 'U'값을 숨 깁니다. 보시다시피 주소가 초기화되지 않은 위치로 변경되면 'U'가 표시됩니다. 해상도는 RAM 읽기 데이터를 전달하거나 쓰기 데이터를 양방향 데이터 버스 (ext)의 RAM 어레이에 제공합니다.

(이것은 ghdl mcode 버전 (직접 컴파일, Windows의 경우처럼 명시적인 정교화가 필요하지 않음)으로 Mac에서 수행되었으며 GTKWave를 사용하여 표시되었습니다.

어설 션 경고 (metavalue detected)는 시간 0 (@ 0ms)에 str (all 'U 's)에 할당 된 기본값에서 비롯됩니다.

+0

고마워,이 사람이야! – Dejan