[Programmation] baud rate
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

baud rate



  1. #1
    hamza_lahlou

    Unhappy baud rate


    ------

    salut
    j'ai besoin d'aide!!! j'ai un programme en vhdl ( UART) dans la déclaration des sigaux ils ont déclarer la constante baud rate comme suite :
    --divisuer de baude rate

    Constante bauDivide :std_logic_vector (6 downto 0 ) ="1101101" ;
    ca signéfie quoi ?? :/

    -----
    Dernière modification par Jack ; 18/12/2015 à 17h09. Motif: titre

  2. #2
    Jack
    Modérateur

    Re : baud rate

    Je suppose qu'il existe une horloge de référence qui est divisée par 109 (1101101 en binaire) pour obtenir la vitesse de transmission désirée.

  3. #3
    jiherve

    Re : baud rate

    Bonsoir,
    En effet c'est l'idée, mais le ratio exact de division dépendra du code utilisé.
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    hamza_lahlou

    Re : baud rate

    oui il existe une horloge de 24 Mhz. et une autre de 100 Mhz. mais pour quo diviser sur 109 O.o

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : baud rate

    Bonjour
    donnes voir le code car avec les valeurs d'horloges existantes on ne tombe pas sur une fréquence classique pour un UART.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    Murayama

    Re : baud rate

    Bonsoir!

    109, c'est le rapport qu'il faut pour envoyer à 300 baud à partir d'un quartz horloger
    (en principe présent dans la plupart des systèmes).

    Pascal

  8. #7
    hamza_lahlou

    Re : baud rate

    vola le code:
    Code:
    ----------------------------------------------------------------------------------
    -- Auteur: LAHLOU HAMZA
    -- Create Date:    15:20:50 06/21/2015 
    -- Design Name: 
    -- Module Name:    uart_ent - uart_arch 
    -- Project Name: Protocole UART
    -- Target Devices: 
    -- Tool versions: 
    -- Description: 
    --
    -- Dependencies: 
    --
    -- Revision: 
    -- Revision 0.01 - File Created
    -- Additional Comments: 
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    ---- Uncomment the following library declaration if instantiating
    ---- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;
    
    entity uart_ent is
        Port ( txd : out  STD_LOGIC:='1';
               rxd : in  STD_LOGIC;
               clk : in  STD_LOGIC;
               dbin : in  STD_LOGIC_VECTOR (7 downto 0);
               dbout : out  STD_LOGIC_VECTOR (7 downto 0);
               wr : in  STD_LOGIC;
               rst : in  STD_LOGIC:='0');
    end uart_ent;
    
    architecture uart_arch of uart_ent is
    ---------------------------------------------------
    ---Déclaration des machines d'états
    ---------------------------------------------------
    
    --- machine d'état de réception 
     type rstate is (
          strIdle,          --état idle
          strEigthDelay,     --temporisation de 8 cycles d'horloge 
          strGetData,        --sauvegarde de 8 bits de données
          strCheckStop      --retour à l'état de repos
     );
    
    
    --- machine d'état de transfért 
     type tstate is (
          sttIdle,          --état idle
          sttTransfer,       --chargement de la donnée dans le registre a décalage
          sttShift          --décalage a droite de registre
     );
    
    ---------------------------------------------------
    ---Déclaration des Signaux
    ---------------------------------------------------
    ---diviseur de baude rate
         constant baudDivide :std_logic_vector(6 downto 0) := "1101101";
    
    ---registre de réception
         signal rdReg : std_logic_vector(7 downto 0) := "00000000";
    
    ---registre a décalage de réception 
         signal rdSReg : std_logic_vector(8 downto 0) := "111111111";
    
    ---registre de transmission 
         signal tfReg : std_logic_vector(7 downto 0);
    
    ---registre a décalage de transmission
         signal tfSReg :std_logic_vector(9 downto 0) := "1111111111";
    
    ---compteur utlisé par rCLK
         signal clkDiv :std_logic_vector(7 downto 0) :="00000000";
    
    ---compteur utilisé tCLK
         signal rClkDiv :std_logic_vector(3 downto 0) :="0000";
    
    ---compteur utlisé pour la témporisation
         signal ctr :std_logic_vector(3 downto 0) :="0000";
    
    ---compteur utilisé pour la temporisation dans la transmission 
         signal tfCrt :std_logic_vector(3 downto 0) :="0000";
    
    ---horloge de réception 
         signal rClk :std_logic :='0';
    
    ---horloge de transmission 
         signal tClk: std_logic;
    
    ---compte le nombre de bits lu
         signal dataCtr :std_logic_vector(3 downto 0) :="0000";
    
    ---enclenche le bloc de controle d'erreur
         signal CE :std_logic;
         signal ctRst : std_logic :='0';
         signal load :std_logic :='0';
         signal shift :std_logic :='0';
         signal tClkRST : std_logic :='0';
         signal rShift :std_logic :='0';
         signal dataRST :std_logic :='0';
         signal dataIncr :std_logic :='0';
    
    ---état présent de la machine d'état de réception 
        signal strCur :rstate :=strIdle;
    
    ---état suivant de la machine d'état de réception 
         signal strNext :rstate;
    
    ---état présent de la machine d'état de transmission 
         signal sttCure :tstate := sttIdle;
    
    ---état suivant de la machine d'état de transmission 
         signal sttNext :tstate;
    
    --------------------------------------------------------------
    ---fonction du module 
    --------------------------------------------------------------
    
    begin
    DBOUT <= rdReg;
    tfReg <= DBIN ;
    
    ---fonction de diviseur d'horloge
    
       process (CLK,clkDiv)
    
         begin
           if( CLK='1' and CLK'event )then
             if( clkDiv = baudDivide) then
               clkDiv <= "00000000";
             else
               clkDiv <= clkDiv +1;
             end if;
           end if;
         end process ;
       process (clkDiv,rClk, CLK )
    
    ---fonction de rclk
    
         begin
           if (CLK ='1' and CLK'event )then
             if clkDiv ="1101101" then
               rClk <= not rClk;
             else
    			  rClk <= rClk ;
             end if;
    		 end if ;
         end process; 
    	  
       process(rClk)
    
         begin
           if (rClk ='1' and rClk'event )then
             rClkDiv <= rClkDiv +1;
           end if; 
         end process;
      tClk <= rClkDiv(3);
    
    --Définition de tclk
    
       process (rClk, ctRst)
         begin 
           if rClk ='1' and rClk'event then 
             if ctRst ='1' then
               ctr <="0000";
             else
               ctr <= ctr +1;
             end if;
           end if;
         end process;
    
       process (tClk,tClkRST)
         begin 
           if (tClk ='1' and tClk'event )then 
             if tClkRST ='1' then
               tfCtr <= "0000";
             else
               tfCtr <= tfCtr +1 ;
             end if;
           end if ;
         end process ;
    
    --- processus de controle d'erreur
    
       process (rClk, CE)
         begin 
           if rClk ='1' and rClk'event then 
             if CE ='1' then 
               rdReg (7 downto 0) <= rdSReg (7 downto 0);
             end if ;
           end if;
         end process ;
    
    ---processus de controle de registre a décalage de réception 
         
       process (rClk, rShift)
         begin 
           if rClk ='1' and rClk'event then 
             if rShift ='1' then 
               rdSReg <= (RXD & rdSReg (8 downto 1));
             end if;
           end if;
         end process;
    
    ---processus de contage de nombre de bits recues
    
       process (rClk, dataRST)
         begin 
           if (rCLK='1' and rClk'event) then 
             if dataRST='1' then 
               dataCtr <="0000";
             else 
    			if dataIncr ='1' then 
               dataCtr <= dataCtr +1;
             end if;
           end if;
    		 end if ;
         end process;
    
    ---machine d'état de réception 
    
       process (rClk,RST)
         begin
           if (rClk ='1' and rClk'event) then 
             if RST ='1' then 
               strCur <= strIdle;
             else 
               strCur <= strNext;
             end if; 
           end if;
         end process;
    
    ---processus de gestion  de réception de données
    
       process (strCur, ctr, RXD, dataCtr, rdSReg, rdReg)
         begin 
           case strCur is 
             when strIdle  =>
                  dataIncr <= '0';
                  rShift  <= '0';
                  dataRST  <= '0';
    
                  CE       <= '0';
                  if RXD ='0' then 
                        ctRst <= '1';
                        strNext <= strEigthDelay;
                  else
                        ctRst <='0';
                        strNext <= strIdle;
                  end if;
    
             when strEigthDelay =>
                  dataIncr <= '0';
                  rShift   <= '0';
    
                  CE       <= '0';
                  if ctr (2 downto 0) ="111" then
                         ctRst <= '1',
                         dataRST <= '1';
                         strNext <= strGetData;
    
                  else
                         ctRst <= '0';
                         dataRST <= '0';
                         strNext <= strEigthDelay;
                  end if;
    
             when strGetData =>
                  CE <='0';
                  dataRst <='0';
                  
                  if ctr(3 downto 0) ="1111" then 
                         ctRst <= '1';
                         dataIncr <= '1';
                         rShift  <= '1' ;
                  else
                         ctRst <= '0';
                         dataIncr <= '0' ;
                         rShift <= '0';
                  end if; 
    
                  if dataCtr = "1001" then
                         strNext <= strCheckStop ;
                  else
                         strNext <= strGetData ; 
                  end if; 
       
             when strCheckStop =>
                  dataIncr <= '0';
                  rShift <= '0'; 
                  dataRst <= '0';
                  ctRst <= '0';
                  CE <= '0';
                  strNext <= strIdle ;
           end case;
         end process;
    
    --- machine d'état de transfert
    
         process (tClk, RST)
           begin 
             if ( tClk='1' and tClk'event) then 
               if RST ='1' then
                 sttCur <= sttIdle;
               else
                 sttCur <= sttNext ;
               end if;
             end if;
           end process ;
    
    --- process de gestion de la transmission 
      
       process (sttCur,tfCtr, tfReg , tClk )
         begin 
           case sttCur is 
             when sttIdle =>
                  tClkRST <= '0';
                  shift <= '0'; 
                  load <= '0';
                    sttNext <= sttIdle;
                  else
                    sttNext <= sttTransfer; 
                  end if;
    
             when sttTransfer =>
                  shift <= '0';
                  load  <= '1';
                  tClkRST <= '1' ;
                  sttNext <= sttShift;
    
             when sttShift =>
                  shift <= '1';
                  load <= '0';
                  tClkRST <= '0';
                  if tfCtr = "1011" then 
                    sttNext <= sttIdle;
                  else
                    sttNext <= sttShift;
                  end if ;
           end case; 
    		 
         end process;
    Dernière modification par Jack ; 05/01/2016 à 19h20. Motif: Ajout balises code

  9. #8
    jiherve

    Re : baud rate

    Bonsoir,
    Ici c'est une réception forcement synchrone et la fréquence utilisée est 1/220 de l'horloge d'entrée clk.
    remarque (je n'ai pas tout analysé) dans :
    Code:
    process (clkDiv,rClk, CLK )
    
    ---fonction de rclk
    
    begin
    if (CLK ='1' and CLK'event )then
    if clkDiv ="1101101" then
    rClk <= not rClk;
    else
    rClk <= rClk ;
    end if;
    end if ;
    end process;
    le else ne sert à rien d'autre qu'a consommer du temps de simulation.
    utiliser la balise code c'est mieux, accessible en mode avancé
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    hamza_lahlou

    Re : baud rate

    bonsoir,
    pouvez vous m'expliquer la partie de déclaration des signaux !? parce que je comprends pas pour quoi l'un est forcé a 10 bits l'autre a 8 bits ....etc
    merci bcp

  11. #10
    jiherve

    Re : baud rate

    Bonjour,
    les signaux sont forcement déclarés avec un type et une taille :
    std_logic_vector(7 downto 0) cela fait donc 8bits il est donc facile de comprendre le reste.
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    hamza_lahlou

    Re : baud rate

    bnsr,
    oui j'ai compris le principe mais le problème est par exemple ce signal
    --registre a décalage de transmission------------------------------------
    signal tfSReg :std_logic_vector(9 downto 0) := "1111111111";
    pour quoi il a 10 bits et il sont tous a 1..
    c'est pas par rapport au nombre de bit a décaler ? genre si on veut décaler n bit il nous faut un signal de (n+1) tous a 1 ?? si c'est le cas notre trame est constituer de 8 bits + 2 bits de start et stop O.o
    merci

  13. #12
    jiherve

    Re : baud rate

    Re
    là tu es dans le cas où on initialise le signal en même temps que celui ci est déclaré , ce n'est pas une tres bonne methode car cela ne correspond en aucun cas à ce qui se passe avec une initialisation physique, c'est quelquefois utile avec le simulateur,et pour certains synthétiseurs cela peu induire la géneration de bascules ayant un set plutôt qu'un reset.
    Ceci dit un registre de transmission UART s'initialise avec des "1" car comme les translateurs TTL RSxx sont généralement inverseurs cela correspond à l'etat 'iddle' de la ligne, le start bit doit etre alors un '0' .
    J'ai regardé ton code partie émission a priori il manque un if et , mais là c'est plutot une habitude personnelle mais fondée sur des dizaines de bug que j'ai du aller dénicher dans de nombreux design (j'ai moi même péché étant débutant), je n'aime pas trop qu'une machine à état soit séparée en 2 : la partie séquentielle d'un coté, le combinatoire de l'autre car c'est comme çà que l'on y injecte, à l'insu de son plein gré, des signaux asynchrones qui constitueront l'arme secrète et à retardement de Murphy.
    Code:
    --- machine d'état de transfert
    
         process (tClk, RST)
           begin 
             if ( tClk='1' and tClk'event) then 
               if RST ='1' then
                 sttCur <= sttIdle;
               else
                 sttCur <= sttNext ;
               end if;
             end if;
           end process ;
    
    --- process de gestion de la transmission 
      
       process (sttCur,tfCtr, tfReg , tClk )
         begin 
           case sttCur is 
             when sttIdle =>
                  tClkRST <= '0';
                  shift <= '0'; 
                  load <= '0';
    ICI IL MANQUE QUELQUE CHOSE
                    sttNext <= sttIdle;
                  else
                    sttNext <= sttTransfer; 
                  end if;
    
             when sttTransfer =>
                  shift <= '0';
                  load  <= '1';
                  tClkRST <= '1' ;
                  sttNext <= sttShift;
    
             when sttShift =>
                  shift <= '1';
                  load <= '0';
                  tClkRST <= '0';
                  if tfCtr = "1011" then 
                    sttNext <= sttIdle;
                  else
                    sttNext <= sttShift;
                  end if ;
           end case; 
    		 
         end process
    JR
    l'électronique c'est pas du vaudou!

  14. #13
    hamza_lahlou

    Re : baud rate

    quece qu'il manque ?? j'arrive pas a me situer :/

  15. #14
    jiherve

    Re : baud rate

    Bonsoir,
    il manque un if!
    JR
    l'électronique c'est pas du vaudou!

  16. #15
    hamza_lahlou

    Re : baud rate

    bnjr,
    oui c'est
    if txd <= '1'; c'est ca je pense ???!!!!

  17. #16
    jiherve

    Re : baud rate

    Bonsoir,
    Moi je n'en sais rien car je ne suis pas le concepteur du code.
    JR
    l'électronique c'est pas du vaudou!

  18. #17
    hamza_lahlou

    Re : baud rate

    bnsr,
    if wr ='1' ; ???!!!

  19. #18
    hamza_lahlou

    Unhappy Re : baud rate

    bnsr,
    j'essaye de simuler le programme uart que j'ai publié la fois passée mais je ne sais pas ou est le problème
    ( le if qui manque c'est ( if wr = '0' then )
    a chaque fois que je lance la simulation pour voir est ce que le programme fonctionne normalement ( je règle l'horloge a 100 MHZ,
    je donne une valeur a DBIN exemple "01010101" )a mon avis c'est que deux entrer qu'il faut toucher , les autres sont tous réglées.
    parce que tt est déclarer dans le programme.....
    Une autre question ?
    est quand je lance la simulation a 100 ns, est ce qu'il attendre la fin de simulation ou non..je l'ai laissé plus d'une heure mais elle n'est pas terminée ??

    svp si quelqu'un a une idée de comment simuler ( je serai reconnaissant ) ...
    merci

  20. #19
    jiherve

    Re : baud rate

    Bonsoir
    Quel est ton simulateur ?
    JR
    l'électronique c'est pas du vaudou!

  21. #20
    hamza_lahlou

    Re : baud rate

    je travail avec le logiciel ACTIVE HDL 8.3
    merci

  22. #21
    hamza_lahlou

    Re : baud rate

    bnsr,
    svp qiuelqu'un peut me dire est ce que je peux simuler ce programme de L'UART sans utiliser la carte ou non
    parce que j'essaye mais tjrs il ya un bug et je ne sais pas ou est le problème ...
    si quelqu'un veut m'aider je serai reconnaissant.merci

  23. #22
    jiherve

    Re : baud rate

    Bonjour
    Oui tu peux simuler sans la carte si cela ne compile pas ou ne fonctionne pas c'est que le code est foireux.
    JR
    l'électronique c'est pas du vaudou!

  24. #23
    hamza_lahlou

    Re : baud rate

    mais tjrs probleme et je ne sais pas c quoi .. svp estce que vous pouvez l'aider....parce que j'envoi les données sur DBIN et je recois rien dans DBOUT....
    la machine d'état de transfert reste tjrs dans le décalage puis transmission .decalage --> transmission :/
    Dernière modification par hamza_lahlou ; 07/04/2016 à 17h15.

Discussions similaires

  1. TPE raté ?
    Par invitef0d7822d dans le forum TPE / TIPE et autres travaux
    Réponses: 3
    Dernier message: 22/03/2010, 21h06
Découvrez nos comparatifs produits sur l'informatique et les technologies.