Périphérique UART

Périphérique UART

Nous considérons l’architecture suivante permettant d’envoyer des données sur une liaison série de type RS232 :

  • Les données présentes sur le bus 8 bits data_so_send sont chargée de manière synchrone dans le registre reg_tampon si ld_t = ‘1’.
  • start donne l’ordre de copier la donnée dans le registre reg_serial la donnée présente dans reg_tampon
  • Quand tous les bits de la donnée ont été envoyés, le signal ready est à 1.

L’architecture utilise 2 compteur :

  • compteur_nb_bits : nombre de bits à envoyer pour une donnée ( en considérant les bits de start et de stop )
  • compteur_baudrate : l’envoi de chaque bit sur TX doit se faire à une fréquence ( Baudrate ) plus lente que l’horloge CLK (12 MHz).
    Ce compteur permet de gérer un état d’attente WAIT_BAUD, pendant lequel on compte jusqu’à 12MHzBaudrate1 \frac{12 MHz}{Baudrate}-1

uart

uart.svg

fsm_uart.svg

chronogramme_uart

chronogramme_serie_2.svg


Test du périphérique UART

Afin de tester le périphérique, on peut envisager de transmettre différents caractères contenus dans une mémoire.
L’action sur les boutons permet d’agir sur le chargement du registre tampon de l’uart, et l’ordre d’envoyer la donnée.
A chaque fois que le registre tampon est chargé, l’adresse de la mémoire évolue via l’incrémentation de compteur_2b.

test_uart

test_uart.svg

fsm_test_uart.svg

Mémoire
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity rom is
  port( addr : in std_logic_vector(taille_bit-1 downto 0);
        data : out std_logic_vector(7 downto 0));
 end rom;
 
architecture arch_rom of rom is
type memory is array(integer range 0 to 3) of std_logic_vector(7 downto 0);
    constant mem : memory :=(
		x"61", x"62", x"63", x"64"
  );
  begin  
    data <= mem(to_integer(unsigned(addr)));
end arch_rom;