2012-06-13 4 views
2

Xilinx Spartan 6 FPGA의 코어 생성 블록 RAM을 양방향 데이터 버스에 연결하는 방법을 알아 내려고합니다. 내가 찾을 수있는 모든 예제는 데이터 포트를 개별적으로 사용한다고 가정하지만, 제 경우에는 양방향 데이터 버스로 사용해야합니다.양방향 버스의 블록 RAM

VHDL을 사용하고 있습니다. 로 인스턴스화

COMPONENT ram 
    PORT (
     clka : IN STD_LOGIC; 
     wea : IN STD_LOGIC_VECTOR(0 DOWNTO 0); 
     addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     dina : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) 
    ); 
END COMPONENT; 

은 다음과 같습니다 :

생성 된 구성 요소는 다음과 같이 정의되어있다

ram1 : ram 
    PORT MAP (
    clka => clk, 
    wea => r_w, 
    addra => addr, 
    dina => din, 
    douta => dout 
); 

누군가가 나에게라는 inout 포트에 dinadouta를 연결하는 처리 블록을 표시 할 수 있습니다 data?

나는 0 % 성공, 다음을 시도 :

process(clk) 
begin 
    if rising_edge(clk) then 
    if r_w = "1" then 
     -- Write 
     din <= data; 
     dout <= temp; 
    else 
     -- Read 
     din <= (others => 'Z'); 
     data <= dout; 
    end if; 
    end if; 
end process; 

당신의 도움을 주셔서 감사합니다!

+0

여기에'din'과'dout'은 무엇입니까? 신호? – detly

+0

아, 거기 포트 매핑에서 그들을 보지 못했습니다. 신경 쓰지 마. – detly

답변

3

첫째, 내부적으로 현대 FPGA (예 : 자일링스 스파르탄 -6로 얘기하는) 것을 이해하는 것이 중요합니다, 정말 진정한 양방향 라우팅 없다. 실제 양방향/삼상 신호는 I/O 핀에서만 사용할 수 있습니다. 내부 양방향/삼중 신호는 에뮬레이션 될 수 있지만 일반적으로 기존 HDL과의 인터페이싱을 위해서만 사용되며 새로운 것은 아닙니다.

이제 여부에 관계없이의 dinadata는 A "양방향"에 douta 단방향를 연결하기 위해 사실 트라이 스테이트 여부는, 거기, 당신은 메모리가 구동되지 않거나시기를 제어하는 ​​몇 가지 신호가 필요합니다. 이미 짧은 이름이 있으므로 "출력 사용"에 대해서는 oe으로 부르기로합니다. 이 신호는 의미있는 방식으로 디자인에 의해 제어되어야합니다.

dina <= data; 
data <= douta when oe = '1' else (others => 'Z'); 
:

는 다음과 같은 동시 코드 ( 하지 과정에서)으로 논리적으로 양방향 데이터 버스로 서로 다른 방향에서 두 개의 단방향 신호를 켜 플러스 출력 방향 선택을 가능하게 할 수 있음을 감안할 때
+0

이것이 'ram'엔티티의 데이터 출력을 다시 입력으로 라우팅하는 효과가 있을까요? 이것은 괜찮을지도 모르지만 ... – detly

+0

예, 출력이 운전 중일 때 RAM의 출력은 항상 입력으로 되돌아갑니다. 그러나 이것이 양방향 버스로 요구했던 것과 정확히 같습니다! =) oe = '0'일 때 RAM의 출력은 무의미합니다. – wjl

+0

글쎄, 상황에 따라 다르 겠지만, 꼭 누군가가 원하는 것이 아니야. 하나의 포트가 다른 포트를 구동하는 것을 피하기 위해 간접적 인 계층을 필요로하는 양방향 포트에 컴포넌트를 인터페이스했습니다. 그러나 나는 그것이 아마도 여기에 문제가되지 않는다는 것에 동의한다. – detly

1

블록에서 으로 구동해야하는 신호가 dout 신호로 보내려는 것 같습니다. 이는 하나의 문제를 설명 할 수 있습니다 (temp이 모두 'Z'가 아닌 경우).

다음에주의해야합니다. 지금 당장 테스트 할 항목이 없으므로 머리 꼭대기에 있습니다. 도움이되지 않으면 알려주세요.

동기식 프로세스가이 문제에 접근하는 가장 좋은 방법이라고 생각하지 않습니다. 내가해야 할 일이 있은 지 꽤 오래되었지만, 여기 내가 필요한 것 같아. 이는 프로세스가 아니라 아키텍처에서 올바르게 진행됩니다.

din <= data when (r_w = '1') else (others => 'Z'); 
data <= dout when (r_w = '0') else (others => 'Z'); 

설명 : 신호는 다양한 소스에 의해 구동되는 (또는 할당) 될 때, 이들 중 하나를 제외한 모두 'Z'이어야한다. 두 번째 라인은 'Z'에 의해 구동 될 data을 설정합니다. 그러나 이것은 실제로 포트를 통해 구동되도록 (리졸버의 관점에서) "해제합니다". 이 동기가 될해야하는 경우

것은,이 적응 사소한해야한다 - 그러나 '0''1'이 유일하게 가능한 경우가 std_logic위한 것이 아닙니다 기억, 그래서 case 블록에 else 절 또는 others에 대해 생각! 모든