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.vhdNous 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’à
Calcul du baudrate
On consacre 52 coups d’horloge pour envoyer 1 bit :
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.
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 :
|
|
|
Terminal liaison série
minicom -D /dev/ttyUSB[x] -b 230400 x = 0, 1, 2, .. ( bref utiliser l’autocomplétion )