2014-12-05 6 views
0

일부 레지스터에 대한 읽기 및 쓰기 작업을 처리하고 레지스터간에 데이터를 전송하기 위해 단일 버스를 사용하는 회로를 만들고 있습니다. 문제는 버스에서 읽기 (레지스터가 버스에서 읽기) 문제가 있다는 것입니다. 레지스터에 값을 할당하는 것은 작동하지 않습니다. 내가 쓸 신호를 사용하면 작동 할 것입니다!왜 INOUT이 작동하지 않습니까?

내 코드 : 당신이 생성 성명에서 lbl1 보면

LIBRARY IEEE; 
USE  IEEE.STD_LOGIC_1164.ALL; 

-- Entity: Circuit 
-- Description: Organizes read and write operation to the bus 
-- n is the size of word in a register, default is 16 
-- m is the number of selection lines in the decoder, so 2^m 
-- is the number of registers in the cicuit 

-- data_bus: the bus used to transfer data 
-- reg_read: input to a decoder determines which register to read from bus. 
-- reg_write: input to a decoder determines which register to write to bus. 
-- read: read signal 
-- write: write signal 
-- Clk: clock 
-- Rst: Reset 

ENTITY circuit IS 
    GENERIC(n : integer := 16; 
      m : integer := 2); 
    PORT(data_bus : INOUT STD_LOGIC_VECTOR(n-1 DOWNTO 0); 
     reg_read, reg_write : IN STD_LOGIC_VECTOR(m-1 DOWNTO 0); 
     read, write, Clk, Rst : IN STD_LOGIC); 

END circuit; 


ARCHITECTURE circuit_arch OF circuit IS 

-- Tristate buffers 
COMPONENT tsb IS 
    GENERIC (n : integer := 16); 

    PORT (E : IN STD_LOGIC; 
     Input : IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); 
     Output : OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0)); 
END COMPONENT; 


-- Registers 
COMPONENT ndff IS 
    GENERIC (n : integer := 16); 
    PORT(Clk,Rst,E : in STD_LOGIC; 
     d : IN STD_LOGIC_VECTOR(n-1 dOWNTO 0); 
     output : OUT STD_LOGIC_VECTOR(n-1 dOWNTO 0)); 

END COMPONENT; 

-- Decoders 
COMPONENT nDecoder IS 
    GENERIC (n : integer := 4); 
    PORT(E : IN std_logic; 
     S : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0); 
     output : OUT std_logic_vector(2 ** n - 1 DOWNTO 0)); 

END COMPONENT; 

TYPE output IS ARRAY (0 TO (2 ** m) - 1) OF STD_LOGIC_VECTOR (n-1 DOWNTO 0); 
SIGNAL read_dec, write_dec : STD_LOGIC_VECTOR(2 ** m - 1 DOWNTO 0); 
SIGNAL regs_out : output; 
SIGNAL test : STD_LOGIC_VECTOR(n-1 downto 0); 
BEGIN 


    -- Generate decoders 
    dec1: nDecoder GENERIC MAP(m) PORT MAP(read, reg_read, read_dec); 
    dec2: nDecoder GENERIC MAP(m) PORT MAP(write, reg_write, write_dec); 

    -- Generate registers 
    LOOP1: FOR i IN 0 TO (2 ** m) - 1 GENERATE 

    lbl1: ndff GENERIC MAP(n) PORT MAP(Clk, Rst,read_dec(i),data_bus, regs_out(i)); 

    END GENERATE; 

    -- Generate tristate buffers 
    LOOP2: FOR j IN 0 TO (2 ** m) - 1 GENERATE 

    lbl2: tsb GENERIC MAP(n) PORT MAP(write_dec(j), regs_out(j), data_bus); 

    END GENERATE; 

END circuit_arch; 
+0

"tsb"에 엔티티/아치를 추가하십시오. –

+0

디자인 대상 플랫폼은 무엇입니까? (FPGA, ASIC, Xilinx, Altera, Virtex, Stratix 등) – Paebbels

+0

[최소, 완전하며 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 제공하지 않은 방법으로보기 그것이 작동하지 않는다는 것을 알려주는 파형을 보여줄 수 있습니까? "신호를 쓰면 쓸 수 있습니다." 매우 모호한 것 같습니다. 방법론과 연결성은 설명하지 않습니다. – user1155120

답변

0

당신이 포트 맵을 확인할 수있는 것들 :

lbl1: ndff generic map(n) port map(clk, rst,read_dec(i),data_bus, regs_out(i)); 

은 위치 적 연관입니다.

port(clk,rst,e : in std_logic; 
     d : in std_logic_vector(n-1 downto 0); 
     output : out std_logic_vector(n-1 downto 0)); 

read_dec(i)는 레지스터 부하가 활성화임을 표시 : 포트 선언 요소 선언에 반영하면서 순서를 나타낸다.

그리고 읽기 버퍼 :

-- generate tristate buffers 
    loop2: for j in 0 to integer(2 ** m) - 1 generate 

    lbl2: tsb generic map(n) port map(write_dec(j), regs_out(j), data_bus); 

    end generate; 

표시 write_dec(j).

는 그들을 생성하기위한 디코딩을 검토하는 것은 보여줍니다

-- generate decoders 
    dec1: ndecoder generic map(m) port map(read, reg_read, read_dec); 
    dec2: ndecoder generic map(m) port map(write, reg_write, write_dec); 

readread_dec에 해당하며 writewrite_dec에 해당합니다.

레지스터로드 및 레지스터 출력 버퍼 인 에이블에 대해 역전을 활성화 한 것처럼 보입니다.

MVCE가 없어도 더 많은 사람이있을 수 있습니다. 응답자는 기본적인 시선 및 분석을 넘어서는 것은 아닙니다.

그리고 Paebbels가 목표 구현에 관해 묻는 이유는 모든 실제적인 목적을 위해 3 상태 내부 버퍼가 일반적으로 ASIC 구현으로 제한된다는 것입니다.

+0

이것은 내 의도입니다 :) ... 그러나 특정 요구 사항이 충족되면 FPGA의 합성 컴파일러에서 내부 INOUT 신호를 'FPGA'에 사용할 수도 있습니다. – Paebbels

+0

출력 선택기의 자연스러운 모양입니다. – user1155120