Menu
Coddy logo textTech

Projeto do transmissor

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 89 de 90.

challenge icon

Desafio

Nesta lição, você completará o transmissor UART adicionando o shift register (registrador de deslocamento) para enviar qualquer byte, não apenas a letra fixa 'A'.

O registrador de deslocamento carrega o quadro completo (stop bit + 8 bits de dados + start bit) e o desloca um bit por vez.

Formato do Quadro

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

Por exemplo, se data_in = 8'b01000001 (letra 'A'), o registrador de deslocamento torna-se: 1 01000001 0

Sua Tarefa

Você recebeu a máquina de estados da lição anterior (que transmite um byte fixo). Você precisa modificá-la para enviar qualquer byte a partir da entrada data_in.

O que fazer:

  1. Adicione uma input [7:0] chamada data_in à lista de portas (dentro dos parênteses)
  2. Adicione um reg de 10 bits chamado shift_reg fora dos parênteses (dentro do corpo do módulo, pois é um sinal interno)
  3. Quando cnt == 0 e start == 1:
    1. Carregue shift_reg com {1'b1, data_in, 1'b0}
  4. Quando cnt estiver entre 1 e 8:
    1. Envie tx <= shift_reg[0]
    2. Desloque para a direita: shift_reg <= shift_reg >> 1
  5. Quando cnt == 9:
    1. Envie tx <= shift_reg[0]
    2. Desloque para a direita: shift_reg <= shift_reg >> 1

Experimente você mesmo

module uart_tx (
  input clk,
  input start,           // NOVO: sinal de início para começar a transmissão
  output reg tx,         // NOVO: linha de saída serial
  output reg [3:0] cnt   // Manter como saída para testes
);

  initial begin
    cnt = 0;
    tx = 1;              // NOVO: define tx como HIGH (estado ocioso)
  end

  always @(posedge clk) begin
    // NOVO: Lógica do contador com condição de início
    if (cnt == 0 && start) begin   // NOVO: inicia a transmissão
      cnt <= 1;
    end
    else if (cnt > 0 && cnt < 9) begin   // NOVO: conta enquanto transmite
      cnt <= cnt + 1;
    end
    else if (cnt == 9) begin      // NOVO: redefine após o último bit
      cnt <= 0;
    end
  end

endmodule

Todas as lições de Fundamentos