Generalidades sobre Ver erililog og y diseñ diseño o digi digittal CIRCUITOS DIGITALES II – IE0523 PROF.. JO RGE S OTO PROF
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 Verilog soporta dos tipos de asignaciones dentro dentro de los bloques always, bloqueantes y no bloqueantes. always alwa ys @( ... List Listaa de sensibil sensibilidad idad ... ) begin 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 alwa ys @( ... List Listaa de sensibili sensibilidad dad ... ) begin 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 secuenciales
Circuitos 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 [8:0] Wide ; reg I;
// wire 1-bit // wire 9-bit
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 [8:0] Wide ;
// reg 1-bit // reg 9-bit
always @(A or B) begin I = A | B; end
// LHS bloque always
initial begin // LHS bloque initial 1’b1 J <= ; #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;
end
// Valor por defecto C = 1'b0; // Valor por defecto if ( Trigger ) begin A = Pass ; // Sobreescritura C = Pass ; // Sobreescritura 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
comportar como I, II o III. Esto genera un problema de sincronización y debemos solucionarlo.
Sistema secuencial
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