2017-02-28 12 views
0

2 개의 3 비트 주소 레지스터와 2 개의 3to8 디코더를 사용하여 3 비트 레지스터의 크로스 바를 사용하여 64 바이트 RAM을 생성합니다. 다음은 VHDL 코드입니다.다중 출력 8 비트 레지스터가 동일한 출력 (VHDL)에 연결

library ieee; 
use ieee.std_logic_1164.all; 

entity ram88 is 
    port(a : in std_logic_vector (2 downto 0); 
     s0: in std_logic; 
     s1: in std_logic; 
     s: in std_logic; 
     e: in std_logic; 
     io_in: in std_logic_vector (7 downto 0); 
     io_out:out std_logic_vector (7 downto 0)); 

end ram88; 

architecture behavior of ram88 is 

    component reg3 is 
    port(a : in std_logic_vector (2 downto 0); 
      ss,e : in std_logic; --st and enable 
      b : out std_logic_vector (2 downto 0)); 
    end component; 

    component reg8 is 
    port(a : in std_logic_vector (7 downto 0); 
      ss,e : in std_logic; --st and enable 
      b : out std_logic_vector (7 downto 0)); 
    end component; 

    component decod8 is 
    port(a : in std_logic_vector (2 downto 0); 
      b : out std_logic_vector (7 downto 0)); 
    end component; 

    signal e1 : std_logic := '1'; 
    signal l0, l1 : std_logic_vector (2 downto 0); 
    signal ll0, ll1 : std_logic_vector (7 downto 0); 
    type arr2d is array (7 downto 0, 7 downto 0) of std_logic; 
    signal andij, fin_s, fin_e : arr2d; 

begin 

    e1 <= '1'; 

    reg0: reg3 port map (a => a, ss => s0, e => e1, b => l0); 
    reg1: reg3 port map (a => a, ss => s1, e => e1, b => l1); 
    decod0: decod8 port map(a => l0, b => ll0); 
    decod1: decod8 port map(a => l1, b => ll1); 

    mem_blks_ii: 
    for ii in 0 to 7 generate 
    mem_blks_jj: 
    for jj in 0 to 7 generate 
     andij(ii,jj) <= ll0(ii) and ll1(jj); 
     fin_s(ii,jj) <= andij(ii,jj) and s; 
     fin_e(ii,jj) <= andij(ii,jj) and e; 
     regij: reg8 port map(a=> io_in, ss=> fin_s(ii,jj), e => fin_e(ii,jj), b => io_out); 
    end generate mem_blks_jj; 
    end generate mem_blks_ii; 


end behavior; 

그런 다음 시뮬레이션을 위해 다음 테스트 단위를 사용합니다. 값 00000001을 메모리 주소 000x000에 설정합니다. 끝에서, 그것은 에이블 신호를 설정하여 값을 검색 :

library ieee; 
use ieee.std_logic_1164.all; 

entity ram88_bench is 

end ram88_bench; 

architecture behavior of ram88_bench is 

    component ram88 
    port(a : in std_logic_vector (2 downto 0); 
     s0: in std_logic; 
     s1: in std_logic; 
     s: in std_logic; 
     e: in std_logic; 
     io_in: in std_logic_vector (7 downto 0); 
     io_out:out std_logic_vector (7 downto 0)); 
    end component; 

    signal abar : std_logic_vector (2 downto 0); 
    signal s0bar, s1bar, sbar, ebar: std_logic; 
    signal io_in_bar, io_out_bar: std_logic_vector (7 downto 0); 

begin 

    ram0: ram88 port map(a=>abar, s0=> s0bar, s1=> s1bar 
         , s=> sbar, e=> ebar 
         , io_in => io_in_bar, io_out=> io_out_bar); 

    process 
    begin 

    -- set (0,1) for access point in memory 
    abar <= "000"; 
    s0bar <= '1'; 
    s1bar <= '0'; 
    wait for 2 fs; 
    s0bar <= '0'; 

    abar <= "000"; 
    s1bar <= '1'; 
    wait for 2 fs; 
    s1bar <= '0'; 

    -- store the value ... 
    ebar <= '1'; 
    sbar <= '1'; 
    io_in_bar <= "00000001"; 
    wait for 2 fs; 
    sbar <= '0'; 

    ---- temporary clear the value before retrieval 
    --sbar <= '0'; 
    --ebar <= '0'; 
    ---- io_in_bar <= "00000000";  
    --wait for 2 fs; 

    --retrieve the value ???? 
    ebar <= '1'; 
    sbar <= '0'; 
    wait for 6 fs; 

    wait; 

    end process; 

end behavior; 

문제는 io_out_bar의 값이 시뮬레이션의 끝에 00000001 미지수 "0X"강제로 대신 예상된다됩니다! 이유는 모르겠지만 모든 8 비트 RAM 레지스터가 동일한 출력에 연결되어 있기 때문에 어떤 것이 실제 검색 할 필요가 있는지 알 수는 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

+2

멀티플렉서를 사용하여 하나를 선택하십시오. 대안은 tristate 논리를 사용하는 것입니다,하지만 그건 내가 아는 현대의 FPGA에서 유효하지 않습니다. –

답변

3

질문은 Minimal, Complete and Verifiable example이 아니며 솔루션을 시연하는 데 도움이됩니다. 인스턴스에 대한 몇 가지 신속하고 더러운 실체 : 모든 8 비트 RAM 레지스터가 동일한 출력에 연결되어 있기 때문에

library ieee; 
use ieee.std_logic_1164.all; 

entity reg3 is 
    port (
     a:  in std_logic_vector (2 downto 0); 
     ss,e: in std_logic; 
     b:  out std_logic_vector (2 downto 0) 
    ); 
end entity; 

architecture foo of reg3 is 
begin 
    b <= a when ss = '1' and e = '1'; 
end architecture; 

library ieee; 
use ieee.std_logic_1164.all; 

entity decod8 is 
    port (
     a:  in std_logic_vector (2 downto 0); 
     b:  out std_logic_vector (7 downto 0) 
    ); 
end entity; 

architecture foo of decod8 is 
    use ieee.numeric_std.all; 
begin 
    process (a) 
     variable idx: natural range 0 to 7; 
    begin 
     idx := to_integer(unsigned(a)); 
     b <= (others => '0'); 
     b(idx) <= '1'; 
    end process; 
end architecture; 

library ieee; 
use ieee.std_logic_1164.all; 

entity reg8 is 
    port (
     a:  in std_logic_vector (7 downto 0); 
     ss,e: in std_logic; 
     b:  out std_logic_vector (7 downto 0) 
    ); 
end entity; 

architecture foo of reg8 is 
begin 
    b <= a when ss = '1' and e = '1'; 
end architecture;  

... 나는 생각, 우리가 검색해야 진정한 가치가 어느 확인할 수 없습니다 . 이 문제를 어떻게 해결할 수 있습니까? 당신은 제대로 추측

, 모든 8 비트 레지스터는 io_out 드라이브.

여기에 제공된 아이디어는 RAM에 제공된 색인에 따라 한 번에 하나씩 만 선택하는 것입니다. 이 예에서는 l0l1 래치의 동일한 쓰기 주소를 사용하여 출력을 위해 64 개의 8 비트 레지스터 중 하나를 선택하는 데 사용됩니다.

그것은 행동 적 여기에 순수 할,하지만 인스턴스화 멀티플렉서 (선택기)와 함께 할 수있다 :

architecture behavior of ram88 is 

    component reg3 is 
    port(a : in std_logic_vector (2 downto 0); 
      ss,e : in std_logic; --st and enable 
      b : out std_logic_vector (2 downto 0)); 
    end component; 

    component reg8 is 
    port(a : in std_logic_vector (7 downto 0); 
      ss,e : in std_logic; --st and enable 
      b : out std_logic_vector (7 downto 0)); 
    end component; 

    component decod8 is 
    port(a : in std_logic_vector (2 downto 0); 
      b : out std_logic_vector (7 downto 0)); 
    end component; 

    signal e1 : std_logic := '1'; 
    signal l0, l1 : std_logic_vector (2 downto 0); 
    signal ll0, ll1 : std_logic_vector (7 downto 0); 
    type arr2d is array (7 downto 0, 7 downto 0) of std_logic; 
    signal andij, fin_s, fin_e : arr2d; 
    type mux is array (7 downto 0, 7 downto 0) of -- ADDED 
       std_logic_vector (7 downto 0); 
    signal mux88: mux;        -- ADDED 
    signal idxii, idxjj: natural range 0 to 7;  -- ADDED 
    use ieee.numeric_std.all;      -- ADDED 

begin 

    e1 <= '1'; 

    idxii <= to_integer(unsigned(l0));    -- ADDED 
    idxjj <= to_integer(unsigned(l1));    -- ADDED 

    reg0: reg3 port map (a => a, ss => s0, e => e1, b => l0); 
    reg1: reg3 port map (a => a, ss => s1, e => e1, b => l1); 
    decod0: decod8 port map(a => l0, b => ll0); 
    decod1: decod8 port map(a => l1, b => ll1); 

    mem_blks_ii: 
    for ii in 0 to 7 generate 
    mem_blks_jj: 
    for jj in 0 to 7 generate 
     andij(ii,jj) <= ll0(ii) and ll1(jj); 
     fin_s(ii,jj) <= andij(ii,jj) and s; 
     fin_e(ii,jj) <= andij(ii,jj) and e; 
    -- regij: reg8 port map(a=> io_in, ss=> fin_s(ii,jj), e => fin_e(ii,jj), b => io_out); -- CHANGED 
    regij: reg8 port map(a=> io_in, ss=> fin_s(ii,jj), e => fin_e(ii,jj), b => mux88(ii,jj));  -- CHANGED 
    end generate mem_blks_jj; 
    end generate mem_blks_ii; 

    io_out <= mux88(idxii, idxjj); -- ADDED READBACK MUX 

end behavior; 

그리고 그 제공 : RAM 다시 읽어

ram88_bench_fixed.png

.

8 x 8 by 8 비트 std_logic_vector 값은 두 개의 추가 된 인덱스로 선택된 64 b 비트 값 중 하나를가집니다. 인스턴스화 된 구성 요소로 구성 할 경우 모든 논리 게이트가 RAM과 팬 버퍼에 사용되는 래치와 크기가 같고 쓰기 조종보다 약간 큰 위치를 종합하고 계산합니다 논리.

+0

고마워요! 매우 포괄적 인 답변! – argasm