Menu
Coddy logo textTech

Portas de Entrada e Saída

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

As portas de entrada e saída (input e output) são as conexões que permitem que um module se comunique com o mundo externo. Elas são como os pinos de um chip. As portas são a interface entre um module e o restante do projeto.

Todo module tem:

  • Portas de Input — sinais que entram no module
  • Portas de Output — sinais que saem do module

Portas Input

Portas Input recebem data de fora. Elas não podem ser alteradas dentro do module—only read.

input clk;        // Entrada de um único bit
input [7:0] data; // Vetor de entrada de 8 bits
input a, b;       // Múltiplas entradas em uma linha

Regras para inputs:

  • Não podem receber a atribuição de um valor dentro do module
  • Não podem ser declarados como reg
  • Sempre wire (por padrão)

Output Ports

Output ports enviam dados para o exterior. Eles podem ser acionados por blocos assign ou always.

output out;           // Saída de bit único
output [3:0] result;  // Saída de 4 bits
output reg busy;      // A saída pode ser reg
output wire ready;    // A saída pode ser wire

Regras para outputs:

  • Podem ser wire (com assign) ou reg (com always)
  • Devem ser acionados por algo dentro do module

Sintaxe de Declaração de Portas

A sintaxe de declaração de portas é a forma específica como você escreve portas de entrada e saída em um módulo. Ela diz ao Verilog três coisas sobre cada porta:

  1. Direção — é `input`, `output`, ou `inout`?
  2. Tamanho — quantos bits de largura ele tem?
  3. Nome — como ele é `called`?
module example (
  input [7:0] data_in,    // Vetor de entrada
  input clk,              // Entrada única
  input enable,           // Entrada única
  output reg [7:0] out,   // Saída reg
  output busy             // Saída wire
);

Por que a Direção da Porta Importa

A direção diz ao Verilog:

  • Quais sinais o módulo pode ler (inputs)
  • Quais sinais o módulo pode escrever (outputs)
  • Quais tipos de conexões são permitidos

Usar a direção errada causa erros de compilação.

Exemplo de Código

module port_demo (
  input [3:0] a,        // Pode apenas ler
  input [3:0] b,        // Pode apenas ler
  output reg [3:0] sum, // Pode escrever (reg)
  output [3:0] diff     // Pode escrever (wire)
);
  always @(*) begin
    sum = a + b;        // Escrevendo para output reg
  end
  
  assign diff = a - b;   // Escrevendo para output wire
endmodule
challenge icon

Desafio

Complete as Declarações de Portas

O que fazer:

  1. Adicione uma entrada de 8 bits chamada data_in
  2. Adicione uma entrada de bit único chamada clk
  3. Adicione uma saída de 4 bits chamada result (use reg — será atribuída em um bloco always)
  4. Adicione uma saída de bit único chamada valid (use wire — será atribuída com assign)

Experimente você mesmo

module port_challenge (
  // Task 1: Adicione uma entrada de 8 bits chamada data_in
  
  
  // Task 2: Adicione uma entrada de um bit chamada clk
  
  
  // Task 3: Adicione uma saída de 4 bits chamada result (use reg)
  
  
  // Task 4: Adicione uma saída de um bit chamada valid (use wire)
  
  
);

  reg [3:0] counter;
  
  always @(posedge clk) begin
    counter <= counter + 1;
    result <= counter;
  end
  
  assign valid = (counter > 8);
  
endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos