2014-12-05 1 views
0

Я делаю схему, которая обрабатывает операции чтения и записи в некоторых регистрах и использует одну шину для передачи данных между регистрами, проблема в том, что при чтении с шины (регистр считывается с шины) он работает хорошо, но при попытке для присвоения значения в регистре он не работает. Обратите внимание, что если бы я использовал сигнал для записи, он будет работать !!!Почему INOUT не работает?

Мой код:

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 в генерации заявления вы найдете Portmap:

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); 

read соответствует read_dec и write соответствует write_dec.

Это, безусловно, похоже на то, что у вас есть возможности для реверсирования для нагрузок регистров и разрешения выходного буфера регистров.

Может быть больше, но без MVCE кто-то, кто отвечает, не может выйти за рамки основного обзора и анализа.

И причина, по которой Paebbels спросила о реализации цели, заключается в том, что для всех практических целей встроенные буферы tristate обычно ограничиваются реализациями ASIC.

+0

Это было мое намерение :) ... но также можно использовать внутренние сигналы INOUT в «FPGA» (в компиляторах синтеза для FPGA), если выполняются определенные требования. – Paebbels

+0

Это похоже на естественное место для селектора вывода. – user1155120