Está en la página 1de 31

Generalidades sobre

Verilog y diseño digital


CIRCUITOS DIGITALES II – IE0523
PROF. JORGE SOTO
Bloque always
◦ Se ingresa al bloque always cada vez que se satisface la lista de sensibilidad,
para actualizar los elementos internos.
◦ Los elementos se actualizan de forma paralela o serial según el tipo de
asignación. Verilog soporta dos tipos de asignaciones dentro de los bloques
always, bloqueantes y no bloqueantes.

always @( ... Lista de sensibilidad ... ) begin


... elements ...
end
Asignaciones no bloqueantes ( <= )
◦ Al satisfacer la lista de sensibilidad, los elementos se ejecutan en forma
paralela, exactamente al mismo tiempo.
◦ Modelan lógica secuencial.

always @( ... Lista de sensibilidad ... ) begin


B <= A;
C <= B; // B anterior
D <= C; // C anterior
end
Asignaciones bloqueantes ( = )
◦ Al satisfacer la lista de sensibilidad, los elementos se ejecutan en forma serial,
un elemento tras otro.
◦ Modelan lógica combinacional.

always @( ... Lista de sensibilidad ... ) begin


B = A;
C = B; // B actual (valor de A)
D = C; // C actual (valor de B)
end
Asignaciones bloqueantes y no
bloqueantes

Bloqueantes:
Asignaciones inmediatas

No bloqueantes:
Asignaciones se posponen hasta que
las asignaciones derechas terminan

Circuitos Circuitos
secuenciales combinacionales
Bloque always@(posedge Clock)
◦ Modelan lógica secuencial (flip-flops).
◦ Sólo se debe utilizar asinaciones no bloqueantes ( <= ).
◦ No utilizar asignaciones bloqueantes ( = ).
◦ Por lo general, en la industria se utiliza el flanco positivo del reloj.
◦ Convención para el curso: utilizar el flanco positivo únicamente.
always @( posedge Clock ) begin
B <= A;
C <= B;
D <= C;
end
Bloque always@(*)
◦ Lógica combinacional o compuertas lógicas.
◦ Sólo se debe utilizar asignaciones bloqueantes ( = ).
◦ No utilizar asignaciones no bloqueantes ( <= ).
◦ Siempre se debe utilizar una estrella (*) para la lista de sensibilidad, para
evitar errores.

always @( * ) begin
C = A & B;
end
Assigns
◦ Lógica combinacional o compuertas lógicas.

assign C = A & B;

◦ Representaciones equivalentes.
always @( * ) begin
C = A & B;
end
always @( A or B ) begin // Lista de sensibilidad explícita, riesgosa
C = A & B;
end
Ejemplo
Ejemplo
Ejecución secuencial es diferente a lógica
secuencial
◦ La ejecución secuencial o serial se da en los bloques con asignaciones bloqueantes y modelan
lógica combinacional (sin flops).
always @( *) begin
B = A;
C = B;
D = C;
end
◦ La lógica secuencial se modela con asignaciones no bloqueantes y tienen ejecución paralela.
always @( posedge Clock ) begin
B <= A;
C <= B;
D <= C;
end
Regs y wires
TIPOS MÁS UTILIZADOS EN VERILOG
Wires (lógica combinacional)
◦ Es un simple cable, puede ser de tamaño 1 bit (por defecto) o un bus.
◦ Conecta las entradas y salidas de una instancia de módulo con otros
elementos.
◦ Deben ser manejados, no pueden almacenar valor.
◦ No pueden estar de lado izquierdo (LHS) en las asignaciones de bloques
always o initial.
◦ Único tipo legal a la izquierda (LHS) de un assign.
◦ Forma de conectar dos piezas de Verilog sin almacenar un estado.
◦ Sólo se pueden usar en lógica combinacional.
Ejemplos de uso de wires
wire A, B, C, D, E; // wire 1-bit
wire [8:0] Wide ; // wire 9-bit
reg I;

assign A = B & C; // wire en el LHS de un assign

always @(B or C) begin


I = B | C; // wires en el RHS de un bloque always
end

mymodule mymodule_instance ( . In (D),


.Out(E)); // wire a la salida de un módulo
Regs (lógica secuencial y combinacional)
◦ Pueden conectarse en la entrada de una instancia de módulo.
◦ No se pueden conectar a la salida de una instancia de módulo.
◦ Se pueden utilizar como salidas en la declaración de un módulo (dentro de
éste).
◦ No se pueden utilizar como entradas en la declaración de un módulo (dentro
de éste).
◦ Único tipo válido en las asignaciones a la izquierda (LHS) de bloques always e
initial.
◦ No se pueden utilizar al lado izquierdo de un assign (LHS).
◦ Se pueden utilizar para crear flip-flops en conjunto con un always@(posedge
clk)
◦ Se pueden utilizar para crear lógica secuencial y combinacional.
Ejemplos de uso de regs
wire A, B;
reg I, J, K; // reg 1-bit
reg [8:0] Wide ; // reg 9-bit
always @(A or B) begin
I = A | B; // LHS bloque always
end
initial begin // LHS bloque initial
J <= 1’b1;
#5
@(posedge Clock);
J <= 1’b0;
end
always @( posedge Clock ) begin
K <= I; // reg utilizado para crear un flop K que funciona con el flanco positivo
end
Uso de regs y wires
◦ Ambos se pueden utilizar en las asignaciones a la derecha (RHS) de un assign
o bloques always o initial.
◦ Ambos se pueden conectar a puertos de entrada de una instancia de módulo.
Errores comunes
ERRORES Y BUENAS PRÁCTICAS DE
DISEÑO
Lista de sensibilidad incompleta
◦ Error muy difícil de encontrar en lista de sensibilidad grande.
◦ Utilizar estrella (*) el la lista.

always @(A) begin


C = A & B;
end

always @(B) begin


C = A & B;
end
Utilización de (*) con asignaciones no
bloqueantes
◦ Error sútil, circuito que se ejecuta cada vez que cambia una señal a la derecha
de las asignaciones (RHS).
◦ El circuito ejecuta de forma paralela.

always @( * ) begin
B <= A;
C <= B;
D <= C;
end
Latch inferido
◦ Comportamiento no deseado del circuito, por convención, se debe diseñar
únicamente con flip-flops y no con latches.
wire Trigger , Pass ;
reg A, C;
always @( * ) begin
A = 1'b0;
if ( Trigger ) begin
A = Pass ;
C = Pass ;
end
end
¿Cómo evitar un latch inferido?
◦ Al diseñar lógica combinacional, siempre se debe asignar un valor por defecto
a las señales, para evitar que alguna sección de la lógica las deje sin asignar.
◦ Las asignaciones de las señales A y C dentro del “if” sobrescriben los valores
por defecto.
wire Trigger , Pass ;
reg A, C;
always @( * ) begin
A = 1'b0; // Valor por defecto
C = 1'b0; // Valor por defecto
if ( Trigger ) begin
A = Pass ; // Sobreescritura
C = Pass ; // Sobreescritura
end
end
Sincronización
Los circuitos están sincronizados a un
reloj común
◦ El reloj se comparte a todos los flops.
◦ No hay “ciclos combinacionales”.
◦ El valor de los circuitos combinacionales
sólo importa justo antes del flanco
positivo del reloj.
◦ El periodo debe ser más grande que
cualquier retraso combinacional.
◦ Se deben respetar los tiempos de setup
and hold.
Entradas asíncronas
◦ Con entradas asíncronas no se puede garantizar
que se cumplen los tiempos de setup and hold.
◦ Esto puede causar metaestabilidad en las salidas.
◦ El circuito no puede saber si la señal se va a Sistema secuencial
comportar como I, II o III. Esto genera un problema
de sincronización y debemos solucionarlo.
Solución a las entradas asíncronas
◦ Con al menos dos flip-flops de sincronización, la probabilidad de una señal metaestable es pequeña.
◦ Con tres flip-flops, esa probabilidad es extremadamente pequeña.
◦ Conectar lógica adicional al último flip-flop de sincronización, nunca antes de éste.

Sistema
secuencial lógico
complejo
Ejercicio
Diseñe un interruptor de botón para
encender una luz
◦ Codificación de la señal luz (encendido=1, apagado=0).
◦ Cuando el botón se toca una vez, la luz cambia de estado. 1->0 ó 0->1.
◦ El interruptor debe almacenar el estado luz.
◦ Puede utilizar flip-flops, multiplexores y compuertas.
◦ Tiene una señal de reloj, una señal de reset, y una señal de botón como
entradas, además de la señal luz como salida.
◦ Construya el esquemático del diseño del interruptor.
◦ Luego, construya el interruptor utilizando código de Verilog.
◦ Tomando como referencia la “Presentación clase #1”, construya un testbench
y un módulo probador que le permitan ejercitar el interruptor de luz.
Solución del ejercicio
con los estudiantes
Solución del ejercicio
con los estudiantes
Imágenes tomadas de:
◦ MIT (2007) Asignaciones bloqueantes y no bloqueantes. MIT, Curso 6.111,
Lectura 6.
◦ Fletcher, C. (2008) Bloques always. UC Berkeley, Version 0.2008.9.4.

También podría gustarte