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 compléter le transmetteur UART en ajoutant le shift register (registre à décalage) pour envoyer n'importe quel octet, et pas seulement la lettre fixe 'A'.

Le shift register charge la trame complète (bit de stop + 8 bits de data + bit de start) et la décale d'un bit à la fois.

Format de la trame

Stop (1)Data (8 bits)Start (0)
1data_in0

Par exemple, si data_in = 8'b01000001 (lettre 'A'), le shift register devient : 1 01000001 0

Votre tâche

Vous disposez de 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 depuis l'entrée data_in.

Ce qu'il faut faire :

  1. Ajoutez un input [7:0] nommé data_in à la liste des ports (à l'intérieur des parenthèses)
  2. Ajoutez un reg de 10 bits nommé shift_reg à l'extérieur des parenthèses (à l'intérieur du corps du module, car il s'agit d'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 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,           // NEW: signal de démarrage pour commencer la transmission
  output reg tx,         // NEW: ligne de sortie série
  output reg [3:0] cnt   // Conserver en sortie pour les tests
);

  initial begin
    cnt = 0;
    tx = 1;              // NEW: mettre tx à HIGH (état inactif)
  end

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

endmodule

Toutes les leçons de Fondamentaux