-- txserie.vhd -- Eurobot 2004 : APB Team -- Auteur : Pierre Prot -- ------------------------------------------- -- Port série TX pour le fpga robot -- ------------------------------------------- -- -- * Prend 3 adresses mémoire : -- 0 - Txdata -- 1 - Flag : (x ! x ! x ! x ! Empty ! Full/Int ! FLI1 ! FLI0) -- 2 - Config : (x ! x ! x ! On/Off ! Purge ! IntEn ! BdR1 ! BdR0) -- * Mettre le bit On/Off à 1 pour activer la transmission -- * Chaque écriture dans txdata charge la donnée dans la fifo -- * Dès que le registre à décalage est vide, il enlève le dernier élément de -- la fifo et le transmet -- * Deux bits de stop -- * Quand la fifo est pleine, met le flag Full/Int à 1 et génère une -- interruption. Il faut alors mettre à 0 le bit IntEn, qui sera remis à 1 à -- la prochaine écriture dans la fifo -- * On peut lire l'état de la pile dans le registre de flags -- * On peut vider la pile en mettant Purge à 1 -- * Baudrate disponible : -- BdR1/0 ! Baudrate -- 00 ! 9600 -- 01 ! 19200 -- 10 ! 57600 -- 11 ! 115200 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; use work.nono_const.all; entity txserie is generic ( -- adresses des différents registres du module. A_DATA : T_ADDRESS ; A_CONFIG : T_ADDRESS ; A_FLAG : T_ADDRESS -- si autre choses à déclarer... ); port ( rst : in std_logic; clk : in std_logic; rw : in std_logic; -- read (0) / write (1) bus_data : inout T_DATA; bus_address : in T_ADDRESS; masterck: in std_logic; txout: out std_logic; minIRQ: out std_logic ); end txserie; architecture rtl of txserie is component regIO generic(adr : T_ADDRESS); port( bus_address: in T_ADDRESS; bus_data: inout T_DATA; input: in T_DATA; output: out T_DATA; rw: in std_logic; load: in std_logic; ck: in std_logic; rst: in std_logic ); end component; component fifo is port( data_in: in T_DATA; data_out: out T_DATA; ck: in std_logic; ck_in: in std_logic; ck_out: in std_logic; flags: out std_logic_vector(5 downto 0); purge: in std_logic ); end component; component transmitter port( data_in: in T_DATA; ck: in std_logic; flag: out std_logic; txout: out std_logic ); end component; component clockgene port( ckin: in std_logic; ckout: out std_logic; param: in std_logic_vector(1 downto 0) ); end component; component decoder generic(adr : T_ADDRESS); port( bus_address: in T_DATA; cs: out std_logic ); end component; signal fifoEmpty: std_logic; signal fifoFull: std_logic; --signal fifoLI1: std_logic; --signal fifoLI0: std_logic; --signal BdR1: std_logic; --signal BdR0: std_logic; signal purge: std_logic:='0'; signal txck: std_logic; signal confreg: T_DATA; signal flagreg: T_DATA; signal interflag: std_logic_vector(5 downto 0); signal datareg: T_DATA; signal inter_data: T_DATA; signal txempty: std_logic:='1'; signal csFifo: std_logic; signal fifockin: std_logic; signal fifockout: std_logic; begin FIFO1: fifo port map( data_in=>bus_data, data_out=>inter_data, ck=>masterck, ck_in=>fifockin, ck_out=>fifockout, flags=>interflag(5 downto 0), purge=>confreg(3) ); flagreg(5 downto 0)<=interflag; fifockin<=csFifo and clk and not rw; fifockout<=txempty and not fifoempty ; -- à vérifier !!! Cette ligne est valable pour txempty=1 quand le tx est vide TX1 : transmitter port map( data_in=>inter_data, ck=>txck, flag=>txempty, txout=>txout ); CLOCK1 : clockgene port map( ckin=>masterck, ckout=>txck, param=>"11" --confreg(1 downto 0) ); --geneck<='1'; --confreg(4) and masterck; -- On/Off et masterck fifofull<=interflag(4); fifoEmpty<=interflag(5); -- Config : (x ! x ! x ! On/Off ! Purge ! IntEn ! BdR1 ! BdR0) RCONF : regIO generic map(adr=>A_CONFIG) port map( bus_address=>bus_address, bus_data=>bus_data, input=>(others => '0'), output=>confreg, rw=>rw, load=>'0', ck=>clk, rst=>'0' ); -- Flag : (x ! x ! Empty ! Full/Int ! FLI3 ! FLI2 ! FLI1 ! FLI0) RFLAG : regIO generic map(adr=>A_FLAG) port map( bus_address=>bus_address, bus_data=>bus_data, input=>flagreg, output=>open, rw=>rw, load=>'1', ck=>clk, rst=>'0' ); -- la sortie intout est active si la pile est pleine ET si le bit de conf est -- activé minIRQ<=flagreg(4) and confreg(2); -- IntEn et fifoFull DECOD : decoder generic map(adr=>A_DATA) port map( bus_address=>bus_address, cs=>csFifo ); end rtl;