Périphérique UART

Périphérique UART

L’ objectif est de concevoir en vhdl un émetteur UART pour liaison série RS232.

Prérequis : Rappels sur les liaisons série

Le périphérique UART sera utilisé par la suite, il est donc conseillé d’utiliser un fichier uart.vhd contenant l’entité de plus haut niveau uart et ses composants,
et un fichier icebreaker.vhd contenant l’entité icebreaker ( dans laquelle on instanciera le composant uart )

Il suffira alors de compiler ces 2 fichiers :

ghdl -a uart.vhd
ghdl -a icebreaker.vhd

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 compteurs :

  • 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.svg

fsm_uart.svg

chronogramme_serie_2.svg

Calcul du baudrate

Fclk=12MHz F_{clk} = 12MHz


Tclk=1Fclk=83.33ns T_{clk} = \frac{1}{F_{clk}} = 83.33ns

On consacre 52 coups d’horloge pour envoyer 1 bit :

Tbit=1baudrate=52Tclk=4.33us T_{bit} = \frac{1}{baudrate} = 52 * T_{clk} = 4.33us


baudrate=1Tbit=230769230400 bits/s baudrate = \frac{1}{T_{bit}} = 230769 \approx 230400\ bits/s

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.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;

Utilisateur de l’analyseur logique Digilent

Afin d’observer l’envoi de la trame, on peut observer la broche LED_RED_N, copie du signal présent sur TX :

test_uart_1.jpg

test_uart_2.jpg

waveforms.png

Terminal liaison série

minicom -D /dev/ttyUSB[x] -b 230400  

x = 0, 1, 2, .. ( bref utiliser l’autocomplétion )

minicom.png