Operaciones bitwise (bit a bit).El primer ejemplo será acerca de las operaciones bitwise: OR, AND, XOR, NOR, NAND y XNOR. Verilog es un lenguaje que utiliza un sintaxis muy similar al lenguaje C.
Cabe mencionar que existen dos tipos de salidas:
- Las salidas tipo wire que no almacenan valores y son utilizadas cuando la operación es de tipo Combinacional.
- Las salidas Tipo reg que almacenan valores y son utilizadas cuando la operación es del Tipo secuencial.
A continuación muestro el módulo verilog de ejemplo que utiliza las distintas compuertas. Este módulo utilza 2 entradas: a y b que se conectaran a los interruptores sw0 y sw1, y 6 salidas z0, z1, z2, z3, z4 y z5 que se conectaran a los leds ld0 hasta ld5.
module compuertas(
input a, //Declaramos la entrada a
input b, //Declaramos la entrada b
output z0, //Declaramos la salida z0
output z1, //Declaramos la salida z1
output z2, //Declaramos la salida z2
output z3, //Declaramos la salida z3
output z4, //Declaramos la salida z4
output z5 //Declaramos la salida z5
);
assign z0=a|b; //Asignamos la operacion OR a la salida z0
assign z1=a&b; //Asignamos la operacion AND a la salida z1
assign z2=a^b; //Asignamos la operacion XOR a la salida z2
assign z3=!(a|b); //Asignamos la operacion NOR a la salida z3
assign z4=!(a&b); //Asignamos la operacion NAND a la salida z4
assign z5=!(a^b); //Asignamos la operacion XNOR a la salida z5
endmoduleComo se observa en el ejemplo anterior siempre sera necesario utilizar la palabra reservada assign para asignar los valores a salidas tipo wire.
En Verilog existen dos formas de declarar Nets, una de ellas es como hicimos anteriormente declarando cada una a la vez, la otra forma es declarar los Nets mediante buses. El ejemplo que se muestra a continuación muestra como hacer esto.
module compuertas(
input [1:0]i, //Declaramos el bus de entrada i
output [5:0]z //Declaramos el bus de salida z
);
assign z[0]=|i; //Asignamos la operacion OR a la salida z0
assign z[1]=&i; //Asignamos la operacion AND a la salida z1
assign z[2]=^i; //Asignamos la operacion XOR a la salida z2
assign z[3]=~|i; //Asignamos la operacion NOR a la salida z3
assign z[4]=~&i; //Asignamos la operacion NAND a la salida z4
assign z[5]=~^i; //Asignamos la operacion XNOR a la salida z5
endmodulePara simular nuestro módulo con el ISE de XILINX es necesario crear un nuevo archivo de simulación "Verilog Test Fixture" el cual tiene la misma terminación *.v que un módulo "Verilog".
Para simular el primer ejemplo utilizaremos el siguiente código.
`timescale 1ns / 1ps
module compuertas_prueba;
// Inputs
reg a;
reg b;
// Outputs
wire z0;
wire z1;
wire z2;
wire z3;
wire z4;
wire z5;
// Instantiate the Unit Under Test (UUT)
compuertas uut (
.a(a),
.b(b),
.z0(z0),
.z1(z1),
.z2(z2),
.z3(z3),
.z4(z4),
.z5(z5)
);
initial begin
// Initialize Inputs
a = 0;
b = 0;
end
//Cada 50ns incrementar en uno la variable {a,b}.
always #50 {a,b}={a,b}+1;
endmoduleEn el ejemplo anterior observamos la sintaxis {a,b} que significa que concatenaremos los bit a y b para crear una nueva variable de 2 bits.
El siguiente paso será conectar el módulo creado en nuestro FPGA con el mundo exterior, para ello crearemos un archivo de implementacion *.ucf a partir de los datos brindados por el manual de referencia del BASYS2. En la figura siguiente podemos observar las conexiones del FPGA con el mundo exterior.

Por los momento utilizaremos el siguiente código para conectar el FPGA con los interruptores y leds, luego utilizaremos un archivo universal que nos brinda el fabricante.
net "a" loc = "p11"; #net a conectada al pin P11 del FPGA
net "b" loc = "l3"; #net b conectada al pin l3 del FPGA
net "z0" loc = "m5"; #net z0 conectada al pin m5 del FPGA
net "z1" loc = "m11"; #net z1 conectada al pin m11 del FPGA
net "z2" loc = "p7"; #net z2 conectada al pin p7 del FPGA
net "z3" loc = "p6"; #net z3 conectada al pin p6 del FPGA
net "z4" loc = "n5"; #net z4 conectada al pin n5 del FPGA
net "z5" loc = "n4"; #net z5 conectada al pin n4 del FPGAComentarios