----------------------------------------------------------------------------
-- 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 emission_RS232 is
port(
   clock_fpga        : in std_logic;
   valide_data_envoi: out std_logic;
   valide_data_recu: out std_logic;
   envoi_enable     :in std_logic;
   TX                : out std_logic;
   data_envoi       : in std_logic_vector(7 downto 0));


end entity emission_RS232;

architecture Behavioral of emission_RS232 is


------------------------------------------------------------------------
-- SIGNALS
------------------------------------------------------------------------

signal horloge_envoi : std_logic :='0';
signal mot_complet : std_logic_vector(9 downto 0) :="0000000000";
signal compteur: std_logic_vector(4 downto 0):="00000";
signal compteur_baud: integer:=0;
signal horloge_enable : std_logic :='0';
signal data_bis : std_logic_vector(7 downto 0) :="00000000";


begin

----------------------------------------------------------------------------
--reoganisation de la data a envoyer; bit poids faible en premier------------

  data_bis(0)<= data_envoi(7);
  data_bis(1)<= data_envoi(6);
  data_bis(2)<= data_envoi(5);
  data_bis(3)<= data_envoi(4);
  data_bis(4)<= data_envoi(3);
  data_bis(5)<= data_envoi(2);
  data_bis(6)<= data_envoi(1);
  data_bis(7)<= data_envoi(0);



----------------------------------------------------------------------------
  definition_horloge_enable: process (envoi_enable,compteur)

--mise à 1 lorsque l'on veut envoyer le mot--
--repasse à 0 à la fin de l'envoi--

    begin
     if  compteur = "00000" then
        if (envoi_enable'event and envoi_enable='1')   then
            horloge_enable<='1';

         end if;
     else
         if compteur="01110" then
           horloge_enable<='0';
         end if;
      end if;
    end process definition_horloge_enable;

 ---------------------------------------------------------------------------


 ----------------------------------------------------------------------------
  definition_valide_envoi: process (compteur)

--la mise à 1 de "valide_data_recu" indique que le mot a été envoyé--
--cela permet de sélectionner le futur mot à envoyer--

--la mise à 1 de "valide_data_envoi" permet d'envoyer le futur--
--(celui-ci doit être rebouclé sur l'entree "envoi_enable"--


    begin
     if  compteur = "01100" then
           valide_data_recu<='1';
          elsif compteur="00000" then
           valide_data_envoi<='1';
     else
           valide_data_envoi<='0';
           valide_data_recu<='0';
     end if;
    end process definition_valide_envoi;

 ---------------------------------------------------------------------------


  --envoi mot complet: ajout des bits start et stop+ envoi du mot en serie
  -- avec registre à decalage----------------------------------------------

  mot_entier_envoi: process (horloge_envoi,compteur)
    begin
      if (horloge_envoi'event and horloge_envoi='1') then
        compteur<=compteur+1;
        mot_complet <= mot_complet(8 downto 0) & '1';
      end if;
      if compteur ="01110" then
            compteur<="00000";
      elsif compteur ="00000" then
            mot_complet<= '0' & data_bis & '1';
      else
             TX <= mot_complet(9);
      end if;
  end process mot_entier_envoi;


  -----------------------------------------------------------------------------
  --horloge permettant le fonctionnement du registre à decalage---------------
  ---------------------------------------------------------------------------
generation_horloge_envoi: process(clock_fpga)
   begin
     if clock_fpga'event and clock_fpga='1' then
      if horloge_enable ='1' then
           compteur_baud<=compteur_baud+1;
           if (compteur_baud =5208 ) then
              horloge_envoi<='1';
              compteur_baud<=0;
           else
                 horloge_envoi<='0';
           end if;
      else
          horloge_envoi<='0';
      end if;
     end if;
   end process generation_horloge_envoi;
-----------------------------------------------------------------------------


end behavioral;
