Un wire es literalmente un cable. Se usa para conectar componentes intermedios.
En Verilog pertenece a los datos tipo Net. Puede tomar valores 0, 1, X, Z, donde X es desconocido o no inicializado y Z alta impedancia o triestado.
Una señal tipo Net, es gobernada continuamente y actualiza su valor cuando cambia el valor del controlador.
Un cable se declara con la palabra clave wire seguida del nombre del cable.
wire w1;
Se pueden declarar múltiples cables en la misma sentencia.
wire w1, w2, w3;
En el circuito de la imagen, cuando queremos unir dos puertos directamente, basta una declaración assign out2 = in4 para que se cree un cable que una ambas señales.
A continuación veremos algunos ejemplos más de cómo utilizar la declaración wire.
Todos los ejemplos se acompañan del archivo .pcf correspondiente para que los puedas subir y probar en tu Alhambra FPGA.
El siguiente código Verilog describe el circuito de la imagen.
module circuito1 ( input in1, in2, in3, output out1, out2);
wire w1;
or OR1 (w1, in1, in2);
not NOT1 (out2, in3);
and AND1 (out1, w1, out2);
endmodule
archivo .pcf
set_io in1 119
set_io in2 118
set_io in3 117
set_io out1 95
set_io out2 96
module circuito2 ( input in1, in2, in3, in4, output out);
wire w1, w2;
or OR1 (w1, in1, in2);
or OR2 (w2, in3, in4);
and AND1 (out, w1, w2);
endmodule
archivo .pcf
set_io in1 119
set_io in2 118
set_io in3 117
set_io in4 116
set_io out 95
En este ejemplo vamos a sintetizar un multiplexor 2-1.
module multiplexor_2_1 ( input in1, in2, sel, output out);
wire w1, w2, w3;
not NOT1 (w2, sel);
and AND1 (w1, in1, w2);
and AND2 (w3, sel, in2);
or OR1 (out, w1, w3);
endmodule
archivo .pcf
set_io in1 10
set_io in2 11
set_io sel 119
set_io out 95
Los ejemplos anteriores nos han servido para aprender qué es un cable y cómo se usa en Verilog.
Sin embargo, en determinadas circunstancias, no es necesario declarar los cables intermedios, Verilog permite hacer interconexiones mediante declaraciones implícitas.
En el circuito del ejemplo 1, podemos declara la puerta OR 1 de la siguiente manera:
or OR1 (o1, in1, in2);
donde o1 es la salida de la puerta OR 1 y a la vez, es una de las entradas de la puerta AND 1.
and AND1 (out1, o1, out2);
El código Verilog queda así:
module circuito1 ( input in1, in2, in3, output out1, out2);
or OR1 (o1, in1, in2);
not NOT1 (out2, in3);
and AND1 (out1, o1, out2);
endmodule
El archivo .pcf no cambia.
set_io in1 119
set_io in2 118
set_io in3 117
set_io out1 95
set_io out2 96
De igual manera, el circuito del ejemplo 2, también se puede describir sin necesidad de declarar cables, utilizando declaraciones implícitas.
module circuito2 ( input in1, in2, in3, in4, output out);
or OR1 (o1, in1, in2);
or OR2 (o2, in3, in4);
and AND1 (out, o1, o2);
endmodule
El archivo .pcf no cambia.
set_io in1 119
set_io in2 118
set_io in3 117
set_io in4 116
set_io out 95
Por último, el multiplexor 2-1 también se puede describir mediante declaraciones implícitas.
module multiplexor_2_1 ( input in1, in2, sel, output out);
not NOT1 (_sel, sel);
and AND1 (o1, in1, _sel);
and AND2 (o2, sel, in2);
or OR1 (out, o1, o2);
endmodule
El archivo .pcf no cambia.
set_io in1 10
set_io in2 11
set_io sel 119
set_io out 95
Eso es todo, ¡hasta pronto!
Descarga el código Verilog de los ejemplos anteriores aquí abajo: