Menu
Coddy logo textTech

Diseño del transmisor

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 89 de 90.

challenge icon

Desafío

En esta lección, completarás el transmisor UART agregando el registro de desplazamiento (shift_reg) para enviar cualquier byte, no solo la letra fija 'A'.

El registro de desplazamiento carga la trama completa (bit de parada + 8 bits de datos + bit de inicio) y la desplaza un bit a la vez.

Formato de la Trama

Parada (1)Datos (8 bits)Inicio (0)
1data_in0

Por ejemplo, si data_in = 8'b01000001 (la letra 'A'), el registro de desplazamiento se convierte en: 1 01000001 0

Tu Tarea

Se te proporciona la máquina de estados de la lección anterior (que transmite un byte fijo). Debes modificarla para enviar cualquier byte desde la entrada data_in.

Qué hacer:

  1. Agrega un input [7:0] llamado data_in a la lista de puertos (dentro de los paréntesis).
  2. Agrega un reg de 10 bits llamado shift_reg fuera de los paréntesis (dentro del cuerpo del módulo, ya que es una señal interna).
  3. Cuando cnt == 0 y start == 1:
    1. Carga shift_reg con {1'b1, data_in, 1'b0}
  4. Cuando cnt esté entre 1 y 8:
    1. Envía tx <= shift_reg[0]
    2. Desplaza a la derecha: shift_reg <= shift_reg >> 1
  5. Cuando cnt == 9:
    1. Envía tx <= shift_reg[0]
    2. Desplaza a la derecha: shift_reg <= shift_reg >> 1

Pruébalo tú mismo

module uart_tx (
  input clk,
  input start,           // NEW: señal de inicio para comenzar la transmisión
  output reg tx,         // NEW: línea de salida serial
  output reg [3:0] cnt   // Mantener como salida para pruebas
);

  initial begin
    cnt = 0;
    tx = 1;              // NEW: establecer tx en HIGH (estado inactivo)
  end

  always @(posedge clk) begin
    // NEW: Lógica del contador con condición de inicio
    if (cnt == 0 && start) begin   // NEW: comenzar a transmitir
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NEW: contar mientras se transmite
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NEW: reiniciar después del último bit
      cnt <= 0;
    end
  end

endmodule

Todas las lecciones de Fundamentos