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 shift register (registro de desplazamiento) 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 bit a bit.

Formato de la Trama

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

Por ejemplo, si data_in = 8'b01000001 (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, porque 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,           // NUEVO: señal de inicio para comenzar la transmisión
  output reg tx,         // NUEVO: línea de salida serie
  output reg [3:0] cnt   // Mantener como salida para pruebas
);

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

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

endmodule

Todas las lecciones de Fundamentos