Menu
Coddy logo textTech

Progettazione del trasmettitore

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 89 di 90.

challenge icon

Sfida

In questa lezione completerai il trasmettitore UART aggiungendo il registro a scorrimento per inviare qualsiasi byte, non solo la lettera fissa 'A'.

Il registro a scorrimento carica il frame completo (bit di stop + 8 bit di dati + bit di start) e lo invia un bit alla volta.

Formato del frame

Stop (1)Dati (8 bit)Start (0)
1data_in0

Ad esempio, se data_in = 8'b01000001 (lettera 'A'), il registro a scorrimento diventa: 1 01000001 0

Il tuo compito

Ti viene fornita la macchina a stati della lezione precedente (trasmette un byte fisso). Devi modificarla per inviare qualsiasi byte dall'ingresso data_in.

Cosa fare:

  1. Aggiungi un input [7:0] chiamato data_in all'elenco delle porte (tra le parentesi)
  2. Aggiungi un reg a 10 bit chiamato shift_reg fuori dalle parentesi (nel corpo del modulo, perché è un segnale interno)
  3. Quando cnt == 0 e start == 1:
    1. Carica shift_reg con {1'b1, data_in, 1'b0}
  4. Quando cnt è compreso tra 1 e 8:
    1. Invia tx <= shift_reg[0]
    2. Fai scorrere a destra: shift_reg <= shift_reg >> 1
  5. Quando cnt == 9:
    1. Invia tx <= shift_reg[0]
    2. Fai scorrere a destra: shift_reg <= shift_reg >> 1

Provalo tu

module uart_tx (
  input clk,
  input start,           // NEW: segnale start per iniziare la trasmissione
  output reg tx,         // NEW: linea di uscita seriale
  output reg [3:0] cnt   // Mantieni come uscita per i test
);

  initial begin
    cnt = 0;
    tx = 1;              // NEW: imposta tx su HIGH (stato di inattività)
  end

  always @(posedge clk) begin
    // NEW: logica del contatore con condizione di avvio
    if (cnt == 0 && start) begin   // NEW: avvia la trasmissione
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NEW: conta durante la trasmissione
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NEW: azzera dopo l'ultimo bit
      cnt <= 0;
    end
  end

endmodule

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online