--Sistemas de Aquisição de Dados, TPC nº10 --Implementação em VHDL do protocolo de comunicações GPIB --11/06/2007 --André Bastos da Cunha --nº53757 --LEFT library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity GPIB_VHDL is Port ( ATN : out STD_LOGIC; DIO : out STD_LOGIC_VECTOR (7 downto 0); out_DAV : out STD_LOGIC; out_NRFD : out STD_LOGIC; out_NDAC : out STD_LOGIC; in_DAV : in STD_LOGIC; in_NRFD : in STD_LOGIC; in_NDAC : in STD_LOGIC; in_DIO : in STD_LOGIC_VECTOR (7 downto 0)); end GPIB_VHDL; architecture Behavioral of GPIB_VHDL is type STATE_TYPE is (S0, S1, S2, S3, S4, S5); attribute ENUM_ENCODING: STRING; attribute ENUM_ENCODING of STATE_TYPE:type is "000 001 010 011 100 101"; signal state, nextstate: STATE_TYPE; --nota: a sequência de estados é definida no test bench "teste.tbw" através dos --sinais de controlo in_DAV, in_NRFD, in_NDAC e in_DIO. begin process (in_DAV, in_NRFD, in_NDAC, in_DIO, state) begin state <= nextstate; case state is --no primeiro estado, inicializam-ze as linhas de handshake e --o dispositivo decide se é TALKER ou LISTENER when S0 => out_DAV <= '1'; out_NRFD <= '0'; out_NDAC <= '0'; --os três primeiros bits da palavra definem o papel do dispositivo e --os restantes codificam a identificação do dispositivo. --quando o dispositivo recebe um comando igual a 010 00001 é um TALKER; --o comando dá entrada no DIO e uma vez que há um comando a ser processado, --a linha ATN vai a 1. --salta-se então para o primeiro estado TALKER. if in_DIO = "01000001" then DIO <= in_DIO; ATN <= '1'; out_DAV <= '1'; nextstate <= S1; --quando o dispositivo recebe um comando igual a 001 00001 é um LISTENER; --o comando dá entrada no DIO e uma vez que há um comando a ser processado, --a linha ATN vai a 1. --salta-se então para o primeiro estado LISTENER. --nota: o VHDL parece não apreciar estados incondicionais, como tal introduziu-se --na condição de partida para o LISTENER a imposição de NRFD a 1 (FALSE) uma vez que --este parâmetro é alterado de imediato no estado seguinte. elsif in_DIO = "00100001" then DIO <= in_DIO; ATN <= '1'; out_NRFD <= '1'; nextstate <= S4; --os restantes endereços referem-se a outros dispositivos e como tal, --o nosso dispositivo não reage. --como nenhum comando foi efectuado, a linha ATN vai a 0. else ATN <= '0'; nextstate <= state; end if; --TALKER: when S1 => --verifica se o NFRD está a 1 (FALSE), ouy seja, se os LISTENERS estão --preparados para receber os dados e em caso positivo, inicia a transferência --de dados através das linhas DIO. --uma vez que nenhum comando está a ser emitido, ATN vai a 0. if in_NRFD = '1' then DIO <= in_DIO after 1us; ATN <= '0'; nextstate <= S2; end if; when S2 => --desta forma, os dados iniciam a validação indo DAV para 0 (TRUE) e --saltamos para o próximo estado. if in_NRFD = '1' then out_DAV <= '0'; nextstate <= S3; end if; when S3 => --assim que os LISTENERS tiverem aceitado os dados, espera-se que NDAC --venha a 1 (FALSE) e como tal a validação terminou e DAV vem a 1 (FALSE). --com o fim da validação, termina o TALKING e salta-se para o estado inicial. if in_NDAC = '1' then out_DAV <= '1'; nextstate <= S0; end if; --LISTENER: when S4 => --aguarda a validação dos dados, caso esta aconteça indo DAV para 0 (TRUE), --o LISTENER começa a "ouvir" dando início à transferência de dados nas linhas --DIO e impondo o valor de NRFD a 0 (TRUE) uma vez que está ocupado a ouvir --alguém. --uma vez que nenhum comando está a ser emitido, ATN vai a 0. --assim que a transferência esteja completa, assuma-se 5us depois de ter sido --iniciada, o valor de NDAC vai a 1 (FALSE) uma vez que o dispositivo acabou --de aceitar dados. if in_DAV = '0' then out_NRFD <= '0' after 1us; DIO <= in_DIO; ATN <= '0'; out_NDAC <= '1' after 5us; nextstate <= S5; end if; when S5 => --depois de aguardar a validação, assim que esta termina e DAV vem a 1 (FALSE) --NDAC volta a 0 (TRUE) uma vez que não aceitou dados e volta-se ao estado inicial. if in_DAV = '1' then out_NDAC <= '0' after 1us; nextstate <= S0; end if; end case; end process; end Behavioral;