Bonjour,
je suis actuellement étudiant en électronique et dans un projet je dois programmer une liaison RS232 en vhdl afin de communiquer entre une carte DE1 ( Altera ) et mon ordinateur.
J'ai déjà réalisé et réussit la transmission mais actuellement je bloque sur la réception.
J'ai donc états
** initial => pour initialiser mes variables.
** Start => pour détecter le bit de start soit le 0
** receptiondonnees => pour récupérer les 8 bits du caractère avec l'aide d'un compteur ( Cet état fonctionne )
** Stop => pour détecter le bit de stop soit le 1
** transfertdonnees => pour afficher le caractère reçu sur mes leds
J'utilise aussi un diviseur de fréquence ( celui créé pour ma transmission à 19200 ) donc celui ci fonctionne.
Merci de votre aide.
Mon code est le suivant :
Code:library ieee; use ieee.std_logic_1164.all; entity receptionRS232 is port ( donneesvenantduPC : in std_logic ; clk : in std_logic ; donneesreceptionnees : out std_logic_vector( 7 downto 0 ) ; boutondepartreception : in std_logic ) ; end entity ; architecture arch_receptionRS232 of receptionRS232 is type etatdusysteme is ( initial, START, receptiondonnees, STOP, transfertdonnees ) ; signal etatactuel, etatprochain : etatdusysteme ; signal donneesrecuesprovisoire : std_logic_vector( 7 downto 0 ) ; begin process ( clk ) variable compteur : integer range 0 to 8 ; begin if rising_edge ( clk ) then case etatprochain is when initial => compteur := 0 ; donneesreceptionnees <= "00000000" ; donneesrecuesprovisoire <= "00000000" ; etatprochain <= START ; when START => if donneesvenantduPc = '0' then etatprochain <= receptiondonnees ; else etatprochain <= START ; end if ; when receptiondonnees => if ( compteur = 8 ) then compteur := 0 ; etatprochain <= STOP ; else compteur := compteur + 1 ; if compteur = 1 then donneesrecuesprovisoire(0) <= donneesvenantduPC ; elsif compteur = 2 then donneesrecuesprovisoire(1) <= donneesvenantduPC ; elsif compteur = 3 then donneesrecuesprovisoire(2) <= donneesvenantduPC ; elsif compteur = 4 then donneesrecuesprovisoire(3) <= donneesvenantduPC ; elsif compteur = 5 then donneesrecuesprovisoire(4) <= donneesvenantduPC ; elsif compteur = 6 then donneesrecuesprovisoire(5) <= donneesvenantduPC ; elsif compteur = 7 then donneesrecuesprovisoire(6) <= donneesvenantduPC ; elsif compteur = 8 then donneesrecuesprovisoire(7) <= donneesvenantduPC ; end if ; end if ; when STOP => if donneesvenantduPc = '1' then etatprochain <= transfertdonnees ; else etatprochain <= STOP ; end if ; when transfertdonnees => donneesreceptionnees <= donneesrecuesprovisoire ; etatprochain <= initial ; end case ; end if ; end process ; end architecture ;
-----