Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Entender puertos en Verilog: Entradas, salidas y comunicación entre módulos

Los puertos son un conjunto de señales que actúan como entradas y salidas de un módulo y son la forma principal de comunicarse con él. Piensa en un módulo como un chip fabricado colocado en un PCB: queda claro que la única forma de comunicarse con el chip es a través de sus pines. Los puertos son como pines y el diseño los usa para enviar y recibir señales del exterior.

Entender puertos en Verilog: Entradas, salidas y comunicación entre módulos

Tipos de puertos

PuertoDescripción
InputEl módulo solo recibe valores del exterior usando puertos input
OutputEl módulo solo envía valores al exterior usando puertos output
InoutEl módulo puede enviar o recibir valores usando puertos inout
Los puertos son por defecto nets de tipo wire.

Sintaxis

Puertos declarados como inout actúan como entrada y salida.

input [net_type] [range] lista_nombres;   // Puerto de entrada
inout [net_type] [range] lista_nombres;   // Puerto entrada/salida
output [net_type] [range] lista_nombres;  // Puerto salida impulsado por wire
output [var_type] [range] lista_nombres;  // Puerto salida impulsado por variable

Ejemplo

En el código siguiente hay tres puertos input, uno output y uno inout.

module my_design (
    input wire clk,
    input en,
    input rw,
    inout [15:0] data,
    output int
);
// Comportamiento del diseño como código Verilog
endmodule

Es ilegal usar el mismo nombre para múltiples puertos.

input aport;  // Primera declaración - válida
input aport;  // Error - ya declarado
output aport; // Error - ya declarado

Puertos con signo (Signed ports)

El atributo signed puede adjuntarse a declaración de puerto o net/reg o ambos. Nets implícitos son por defecto unsigned.

module ( input a, b, output c); // a, b, c son unsigned por defecto
endmodule

Si la declaración net/reg tiene atributo signed, el otro también se considera signed.

module ( input signed a, b, output c);
wire a, b;      // a, b son signed por declaración de puerto
reg signed c;   // c es signed por declaración reg
endmodule

Variaciones de puertos

Verilog 1995

La versión IEEE original de 1995 declaraba puertos así: primero listar nombres en paréntesis y luego definir direcciones en el cuerpo.

module test (a, b, c);
input [7:0] a;  // entradas "a" y "b" son wires
input [7:0] b;
output [7:0] c; // salida "c" por defecto wire
// Aún puedes declararlos como wires para evitar confusión
wire [7:0] a;
wire [7:0] b;
wire [7:0] c;
endmodule

module test (a, b, c);
input [7:0] a, b;
output [7:0] c;
reg [7:0] c; // puerto "c" cambiado a tipo reg
endmodule

Verilog 2001 en adelante

Estilo ANSI-C de nombres de puertos se introdujo en 2001 permitiendo especificar tipo dentro de la lista de puertos.

module test (
    input [7:0] a, b,  // "b" considerado entrada de 8 bits
    output [7:0] c
);
// Contenido del diseño
endmodule

module test (
    input wire [7:0] a,
    input wire [7:0] b,
    output reg [7:0] c
);
// Contenido del diseño
endmodule

Si declaración de puerto incluye tipo net o variable, el puerto se considera completamente declarado. Es ilegal redeclarar el mismo puerto en declaración net o variable.

module test (
    input [7:0] a,      // a, e declarados implícitamente como wire
    output reg [7:0] e
);
wire signed [7:0] a;    // ilegal - declaración de a ya completa -> depende del simulador
wire [7:0] e;           // ilegal - declaración de e ya completa
// Resto del código
endmodule

Si la declaración de puerto no incluye tipo net o variable, el puerto puede declararse en declaración net o variable de nuevo.

module test (
    input [7:0] a,
    output [7:0] e
);
reg [7:0] e; // OK - net_type no declarado antes
// Resto del código
endmodule

Verilog

  1. Dominar Verilog: Tutorial completo para diseño de circuitos digitales
  2. Dominar la concatenación en Verilog: Guía práctica
  3. Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
  4. Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
  5. Dominar las funciones en Verilog para diseño RTL eficiente
  6. Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
  7. Generador de reloj en Verilog: Guía de diseño e implementación
  8. Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
  9. Dominar $timeformat en Verilog: Control de precisión y visualización
  10. Comprender e imprimir timescales de Verilog en cualquier alcance
  11. Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar