Sei sulla pagina 1di 30

ELO-212

Laboratorio de Sistemas Digitales


Clase Previa: Laboratorio 1

Andrés F. Llico, M.S.


Coordinador ELO-212 2015
Objetivos de la experiencia
• Aprender conceptos básico de Verilog
▫ Diseño de circuitos combinacionales
▫ Verificación mediante testbench
• Trabajar en un ambiente ISE
▫ Xilinx ISE Design Suite
¿Qué usaremos?
• Xilinx ISE Design Suite 14.7
¿Qué usaremos?
• Isim
Alternativas
• Para simular
▫ VeriWell & GTKWave
Bibliografía
• http://numato.com/learning-fpga-and-verilog-a-beginners-guide-part-1-introduction
• http://www.see.ed.ac.uk/~gerard/Teach/Verilog/manual/Intro/verilog.html
• http://www.see.ed.ac.uk/~gerard/Teach/Verilog/mjta/Gateway/html/delays.html
• http://ramos.elo.utfsm.cl/~elo212/docs/lsilva-ap5.pdf (Apunte Prof. Silva)
• http://ramos.elo.utfsm.cl/~elo212/docs/verilog-lrm.pdf
• http://ramos.elo.utfsm.cl/~elo212/docs/verilog-chavez.pdf
• http://www.verilogtutorial.info/
• http://www.ece.umd.edu/courses/enee359a/verilog\_tutorial.pdf
• http://www.iuma.ulpgc.es/~nunez/clases-FdC/verilog/Verilog\%20Tutorial\%20v1.pdf
• http://www.doe.carleton.ca/~jknight/97.478/PetervrlK.pdf
• http://cva.stanford.edu/people/davidbbs/classes/ee108a/winter0607\%20labs/ee108a\_nham\
_intro\_to\_verilog.pdf
Definición de constantes
• Base binaria
4’b0101
• Base decimal
4’d5
• Base hexadecimal
4’h5
Operadores
• Aritméticos: +, -, *, /, %

• De relación: <, <=, >, >=, ==, !=

• Bit a Bit: ~, &, |, ^ (xor)

• Lógicos: !, &&, ||

• De concatenación: { }

Atención: para poder operar con vectores, tener


en cuenta que las dimensiones de los operandos
sean las mismas!
Un módulo de prueba
A

B
Sel

• C = BSel + ASel’
Descripción de Circuitos

• Por estructura

• Por comportamiento
A

Diseño estructural B
Sel

module Example(A, B, C, Sel);


input A, B, Sel;
output C;

wire W, X, Y;

not(W, Sel);
and(X, A, W);
and(Y, B, Sel);
or(C, X, Y);
endmodule
A

Diseño comportamental B
Sel

module Example(A, B, C, Sel);


input A, B, Sel;
output C;

assign C = (B & Sel) | (A & ~Sel);


endmodule
A

Bloque always B
Sel

module Example(A, B, C, Sel, In);


input A, B, Sel, In;
output reg C;

always @(*) begin


if (In) C = (B & Sel) | (A & ~Sel);
else C = A;
end
endmodule
Buses y multiplexores
module CounterA(sum, w);
output reg [1:0] sum;
input [1:0] w;

always@(*) begin
if(w == 0) sum = 0;
else if (w == 1) sum = 1;
else if (w == 2) sum = 1;
else sum = 2;
end
endmodule
Diseño Jerárquico
module CounterA(sum, w);
output reg [1:0] sum;
input [1:0] w;

always@(*) begin
if(w == 0) sum = 0;
else if (w == 1) sum = 1;
else if (w == 2) sum = 1;
else sum = 2;
end module TheFinalCounter(sum, w);
endmodule
output [2:0] sum;
input [3:0] w;

wire [1:0] s1, s2;


CounterA MyAdder0(s1, w[1:0]);
// fill in

assign sum = s1 + s2;


endmodule
Ejemplo: Decodificador BCD-Decimal
• Datasheet disponible en Aula
Ejemplo: Decodificador BCD-Decimal
module Chip7442(A, Y);
input [3:0] A;
output [9:0] Y;

assign Y[0] = ~(A == 4'b0000);


assign Y[1] = ~(A == 4'b0001);
assign Y[2] = ~(A == 4'b0010);
assign Y[3] = ~(A == 4'b0011);
assign Y[4] = ~(A == 4'b0100);
assign Y[5] = ~(A == 4'b0101);
assign Y[6] = ~(A == 4'b0110);
assign Y[7] = ~(A == 4'b0111);
assign Y[8] = ~(A == 4'b1000);
assign Y[9] = ~(A == 4'b1001);
endmodule
Testbench
module test_Chip7442;
reg [3:0] A; // Inputs
wire [9:0] Y; // Outputs
Chip7442 uut(.A(A), .Y(Y));

initial begin
A = 0; // Initialize Inputs
#(100) // Wait 100 time unit

// Bench
repeat (16) begin
#(10) A = A + 1;
$display ("\t\t\t A=%d \t\t\t Y=%b", A, Y);
end
end
endmodule
4.2 El primer programa en Verilog
Considere la siguiente función

𝑓(𝑎, 𝑏, 𝑐, 𝑑) = 𝑎𝑐 + 𝑎′𝑏𝑐 + 𝑎′𝑑 + 𝑏𝑐′𝑑 + 𝑎𝑏′𝑐𝑑

Diseñee un módulo en Verilog con el nombre MiPrimerPrograma que


describa de manera estructural (usando compuertas o componentes
lógicos) la función f. Luego modifique su módulo para representar la
misma función f mediante una arquitectura de diseño basado en
comportamiento.
4.3 Bloque Always
Modifique el programa en Verilog realizado en la Seción 4.2 de tal
manera de incorporar un procedimiento, sensible a la lista de entrada
de la función f y a una variable adicional, de control, que llamaremos
control. Si control se encuentra en su valor lógico alto (control = 1), su
circuito f se comporta normalmente. Si control = 0 (valor lógico bajo),
entonces 𝑓 = 𝑎′𝑑.
4.4 Uso de buses y multiplexores
El siguiente módulo suma la cantidad de unos de una palabra de 2 bits. Preste atención
al orden en que se especifican los bits dentro del bus:

module CounterA(sum, w);


output reg [1:0] sum;
input [1:0] w;
always@(*) begin
if(w == 0) sum = 0;
else if (w == 1) sum = 1;
else if (w == 2) sum = 1;
else sum = 2;
end
Endmodule

Modifique el módulo anterior para que cuente el número de ocurrencias de la secuencia


10 en palabras de 4 bits.
4.5 Diseño Jerárquico
Utilizando la idea anterior, diseñe un módulo que permita sumar la ocurrencia
de secuencias 10 en palabras de 16 bits, tomando como base el módulo
modificado del punto anterior. A modo de ejemplo, una implementación de un
módulo que sume la ocurrencia de secuencias 10 sería como se muestra en el
siguiente código:

module TheFinalCounter(sum, w);


output [3:0] sum;
input [15:0] w;
wire [1:0] s1, s2, s3, s4, s5;

CounterA MyAdder0(s1, w[3:0]);


// fill in

assign sum = s1 + s2 + s3 + s4 + s5;


endmodule
4.6 Simulación
Verilog además permite realizar simulaciones del diseño de circuitos, para lo cual
contempla la generación de estímulos, incorporación de retardos y despliegue de datos.

A modo de ejemplo se presenta el módulo v7442 que describe un decodificador de 4 a 10


vías (4-line to 10-line decoders, BCD to Decimal). Además, se incluye el módulo de
prueba denominado test v7442. Tanto los códigos como su hoja de datos (datasheet) se
encuentran publicados en el Aula Virtual.

Estudie los códigos anteriores y proponga módulos de prueba para los programas de los
puntos 4.3 y 4.5. Como material adicional, puede consultar el ejemplo A5.10 del apunte
del profesor Leopoldo Silva, también publicado en el Aula.
5.1 Revisión de Parte previa
Presente al profesor o a los ayudantes las simulaciones hechas y los
módulos programados en las preguntas 4.2, 4.3, 4.4 y 4.5.
5.2 Uso del monitor de eventos
Para los circuitos desarrollados en los puntos 4.2 y 4.3, diseñe un
módulo de prueba que le permita monitorear eventos usando
$monitor().
5.3 Uso de display
Para el sumador de ocurrencias de secuencias 10 del punto 4.5, diseñe
un módulo de prueba utilizando la función $display().
5.4 Circuito
Diseñe un circuito jerárquico de al menos 2 niveles con una palabra de
entrada (e) y salida (s) de 16 bits. La salida del circuito depende del
número de unos de la palabra de entrada y de una señal de control
externa (ctl). La salida deberá agrupar la mitad (división entera) de
unos de la palabra de entrada a la izquierda y la otra mitad de unos a
la derecha más el resto. En caso contrario, la salida corresponderá a la
suma de la ocurrencia de una secuencia arbitraria de 3 bit dada por el
profesor o ayudante.

Ejemplo:
1110111101101010, ctl = 1 -> 1111100000111111
1110111101101010, ctl = 0, patron 101 -> 0000000000000100

Verifique el funcionamiento del circuito diseñado mediante la


implementación de un testbench. ¿Cuántos vectores de prueba se
deben generar para hacer un test exhaustivo del hardware propuesto?

Potrebbero piacerti anche