---------------------------------------------------------------------------- -- horloge fonctionnement clock_fpga=50MHz ---------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity reception_RS232 is port( clock_fpga : in std_logic; RX : in std_logic; data_ok : out std_logic; data_recu : out std_logic_vector(7 downto 0)); end entity reception_RS232; architecture Behavioral of reception_RS232 is ------------------------------------------------------------------------ -- SIGNALS ------------------------------------------------------------------------ signal horloge_prelevement : std_logic :='0'; signal mot_complet : std_logic_vector(9 downto 0) :="0000000000"; signal compteur: std_logic_vector(3 downto 0):="0000"; signal compteur_baud: integer:=0; signal prelevement_enable : std_logic :='0'; begin ---------------------------------------------------------------------------- --reorganisation de la data recu; bit poid faible en premier------------ data_presente: process(prelevement_enable) begin if (prelevement_enable ='0') then data_recu(7) <= mot_complet(1); data_recu(6) <= mot_complet(2); data_recu(5) <= mot_complet(3); data_recu(4) <= mot_complet(4); data_recu(3) <= mot_complet(5); data_recu(2) <= mot_complet(6); data_recu(1) <= mot_complet(7); data_recu(0) <= mot_complet(8); end if; end process data_presente; ----------------------------------------------------------------------------- --reception des bits dans un registre à decalage---------------- --------------------------------------------------- mot_entier_recu: process(horloge_prelevement,compteur) begin if horloge_prelevement'event and horloge_prelevement='1' then compteur <= compteur + 1; mot_complet <= mot_complet(8 downto 0) & RX; data_ok <= '0'; end if; if compteur ="1010" then compteur<="0000"; data_ok <= '1'; end if; end process mot_entier_recu; ----------------------------------------------------------------------------- ------------------------------------------------------------------------ --horloge permettant de prelever au bon moment la data présente sur RX-- ------------------------------------------------------------------------ generation_horloge_prelevement: process(clock_fpga) begin if clock_fpga'event and clock_fpga='1' then if prelevement_enable = '1' then compteur_baud<=compteur_baud+1; if (compteur_baud =2604 and compteur ="0000") then --Frequence/(baud/2) horloge_prelevement<='1'; compteur_baud<=0; else if (compteur_baud =5208 and compteur /="0000") then --Frequence/(baud) horloge_prelevement<='1'; compteur_baud<=0; else horloge_prelevement<='0'; end if; end if; end if; end if; end process generation_horloge_prelevement; ----------------------------------------------------------------------------- ----------------------------------------------- --mise à 1 lorsque detection bit start-- --repasse à 0 à la fin de la reception du mot-- ----------------------------------------------- generation_prelevement_enable: process(RX,compteur) begin if (RX'event and RX='0') then if compteur="0000" then prelevement_enable<='1'; end if; end if; if (compteur="1010") then prelevement_enable<='0'; end if; end process generation_prelevement_enable; ----------------------------------------------------------------------------- end behavioral;