Menu
Coddy logo textTech

Conception de l'émetteur

Fait partie de la section Fondamentaux du Journey Verilog de Coddy — leçon 89 sur 90.

challenge icon

Défi

Dans cette leçon, vous allez terminer l'émetteur UART en ajoutant le registre à décalage pour envoyer n'importe quel octet, et pas seulement la lettre fixe 'A'.

Le registre à décalage charge la trame complète (bit de stop + 8 bits de données + bit de start) et la décale bit par bit vers la sortie.

Format de la Trame

Stop (1)Données (8 bits)Start (0)
1data_in0

Par exemple, si data_in = 8'b01000001 (lettre 'A'), le registre à décalage devient : 1 01000001 0

Votre Tâche

On vous donne la machine à états de la leçon précédente (qui transmet un octet fixe). Vous devez la modifier pour envoyer n'importe quel octet provenant de l'entrée data_in.

Ce qu'il faut faire :

  1. Ajoutez une input [7:0] nommée data_in à la liste des ports (à l'intérieur des parenthèses)
  2. Ajoutez un reg de 10 bits nommé shift_reg en dehors des parenthèses (à l'intérieur du corps du module, car c'est un signal interne)
  3. Lorsque cnt == 0 et start == 1 :
    1. Chargez shift_reg avec {1'b1, data_in, 1'b0}
  4. Lorsque cnt est compris entre 1 et 8 :
    1. Envoyez tx <= shift_reg[0]
    2. Décalez vers la droite : shift_reg <= shift_reg >> 1
  5. Lorsque cnt == 9 :
    1. Envoyez tx <= shift_reg[0]
    2. Décalez vers la droite : shift_reg <= shift_reg >> 1

Essayez vous-même

module uart_tx (
  input clk,
  input start,           // NOUVEAU : signal start pour commencer la transmission
  output reg tx,         // NOUVEAU : ligne de sortie série
  output reg [3:0] cnt   // Garder comme sortie pour les tests
);

  initial begin
    cnt = 0;
    tx = 1;              // NOUVEAU : mettre tx à l'état HAUT (état de repos)
  end

  always @(posedge clk) begin
    // NOUVEAU : Logique du compteur avec condition de démarrage
    if (cnt == 0 && start) begin   // NOUVEAU : commencer la transmission
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NOUVEAU : compter pendant la transmission
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NOUVEAU : réinitialiser après le dernier bit
      cnt <= 0;
    end
  end

endmodule

Toutes les leçons de Fondamentaux