Professional Documents
Culture Documents
usando
Verilog
Contenido
• Introducción
• Sintaxis
2
Diseño Digital utilizando HDLs
3
Diseño Digital utilizando HDLs
4
Diseño Digital utilizando HDLs
5
VHDL
6
Verilog
7
Verilog vs. VHDL
8
Consideraciones de Diseño
9
Flujo de diseño de un circuito integrado
10
Niveles de abstracción y dominios
11
Niveles de abstracción y dominios
Comportamiento Estructural
Polígonos
Sticks
Celdas estándares
Floorplan
14
Variables
Declaración:
Tipo [msb:lsb] nombre ;
Ejemplo:
wire [31:0] BID;
15
Módulos
Bloque constructivo básico en Verilog.
Sintaxis:
Original Copia(Puertos);
Instancias
endmodule
16
Declaración del módulo
Sintaxis
17
Declaraciones de Puertos
• input
• output
• inout
18
input
Sintaxis:
input [MSB:LSB] Entrada;
Ejemplos:
19
output
Sintaxis:
output [MSB:LSB] Salida;
Ejemplos:
output [3:0] Salida1; //salida de 4 bits
Sintaxis:
inout [MSB:LSB] Dididireccional;
Ejemplos:
inout [4:0] Bider1; // Dididireccional de 5 bits
21
Instancias
Proceso por el cual se crean objetos a partir de un
módulo base. Permiten diseñar modularmente, evitando
así tener código “chorreado”.
Se tiene un módulo como el que sigue:
module Original (CLK, Reset, Variable);
//Código
endmodule
23
Procesos
– Initial
– always
24
initial
initial begin
A = 0;
C = D && E;
end
25
always
26
always
Formato:
always @ ( <lista de sensibilidad> ) begin
//Código
end
Ejemplos
always @ (A or B or C) begin
if(B) begin
E = C;
D = 1
end else
E = 0;
D = 0;
end
end
27
always
Ejemplos
always @ (posedge CLK) begin
if(Reset) Var = 0;
else Var = E;
end
module incrementer(go,out,clk,rst);
input go,clk,rst;
output[11:0] out; Si un puerto de salida y una variable
reg tienen mismo nombre, Verilog in-
reg[11:0] out; fiere un cable entre ellos, “cable implicito”
29
assign (continuous assignment)
– Ejemplo:
assign A = B | C;
La variable A debe ser de tipo wire
• No se utiliza dentro de un always o initial, pues el
assign implica ejecucion concurrente, no secuencial
30
assign
assign A = (Condición)? B: C;
Ejemplos:
31
Operadores
Tipos:
• Aritméticos
• Relacionales
• Lógicos
• Lógica bit a bit
• Lógica de reducción
• Otras
32
Binarios aritméticos
Tipos:
• + suma
• - diferencia
• * multiplicación
• / división
• % resto
33
Relacionales
Tipos:
• > mayor que
• >= mayor o igual que
• < menor que
• <= menor o igual que
• == igual que
• != diferente a
34
Lógicos
Tipos:
• ! negado (único argumento)
• && AND lógica
• || OR lógico
35
Lógica de bit
Tipos:
• ˜ negación bit a bit
• & AND bit a bit
• | OR bit a bit
• ˆ XOR bit a bit
• ˜& NAND bit a bit
• ˜| NOR bit a bit
• ˜ˆ o ˆ˜ NOT XOR bit a bit
36
Lógica de reducción
Tipos:
• & reducción AND
• | reducción OR
• ˆ reducción XOR
• ˜& reducción NAND
• ˜| reducción NOR
• ˜ˆ o ˆ˜ reducción NOT XOR
37
Otros
• {,} concatenación
• << desplazamiento izquierda, con adición de ceros
• >> desplazamiento derecha, con adición de ceros
• ?: condicional
38
Estructuras de control
• If
• case
• for
• while
• repeat
• wait
39
if
Función:
Ejecuta codigo de manera condicional.
Formato:
if(condicion)codigo1;
else codigo2;
40
case
Función:
Ejecuta la n-esima porción de codigo asociada con
el valor de la variable que se esta evaluando.
Formato:
case(expresión)
Opcion1:codigo1;
Opcion2:codigo2;
Opcion3:codigo3;
default:codigo_predeterminado;
endcase
41
for
Función:
Ejecución de una porción de código tantas veces
como se indica.
Formato:
for (inicial; condición; incremento)
código;
42
while
Función:
Ejecución de una porción de código tantas veces
como se indica.
Formato:
for (inicial; condición; incremento)
código;
43
repeat
Función:
Ejecuta “codigo” tantas veces como lo indique
“cantidad”.
Formato:
repeat (cantidad)
código;
44
wait
Función:
Mientras que “condición” sea falsa se ejecuta
“código”.
Formato:
wait(condición)
código;
45
Números
(# bits)’(base)(número)
Ejemplos:
4’b1001
7’h7E
6’hFF sería equivalente a 111111 en binario
46
Números
’b1011
’hFF sería equivalente a 1111111 en binario
45
76
47
Implementación de
Circuitos
Combinacionales
Circuitos Combinacionales
• Ejemplo:
E1
E2
S1
E3
S2
50
Declaración de operaciones con asignaciones
endmodule
51
Declaración de operaciones con asignaciones
E1
E2
S1
E3
S2
52
Declaración de operaciones con asignaciones
module COMPUERTA(E1, E2, E3, S1, S2);
input E1, E2, E3; output S1, S2;
assign S1 = (E1 & E2) ^ E3;
assign S2 = E1 | E2 | E3;
endmodule
Otra forma, declarando una señal intermedia:
module COMPUERTA(E1, E2, E3, S1, S2);
input E1, E2, E3; output S1, S2:
wire TEMP;
assign TEMP = E1 & E2;
assign S1 = TEMP ^ E3;
assign S2 = E1 | E2 | E3;
endmodule
53
Declaración de operaciones con asignaciones
54
Declaración de operaciones con asignaciones
Soutput S;
E2
1
endmodule
55
Declaración de buffers de alta impedancia
input [7:0] E;
8 8
E input EN;
S
output [7:0] S;
EN
assign S = (EN)? E: 8'bz;
endmodule
56
Ejemplo: buffer 16 bits a partir de 2 de 8 bits
input [15:0] E;
input EN;
output [15:0] S;
endmodule
57
Ejercicio: Mux 4 a 1
4 4
E1 E0
0
1
4
4
E1
1
4
MUX
0
4
MUX
4 S
4 S E2
0
1
4
E3
1
2
4 SEL
E2
0
MUX
4
E3
1
SEL0
SEL1
58
Declaración de operaciones con procesos
59
Declaración de operaciones con procesos
endmodule
60
Declaración de operaciones con procesos
4
E1 case(SEL)
1
4
MUX
4 S 0: S = E0;
E2
0
4 1: S = E1;
E3 2: S = E2;
1
2
SEL 3: S = E3;
endcase
endmodule
61
Declaración de operaciones con procesos
endmodule
62
Declaración de operaciones con procesos
• NOTA IMPORTANTE:
63
Creación de bancos de prueba para circuitos
combinacionales
El banco de prueba (test bench) es un módulo el
cual instancia a otro el cual deseamos simular para
verificar su comportamiento
BANCO DE PRUEBA
MODULO A SIMULAR
0, 0, 1, 1
0, 0, 0, 1
0, 1, 0, 1
Ej.: COMPUERTA.v
Ej.: PRUEBA_COMPUERTA.v
64
Ejemplo de un banco de prueba
`timescale 1ns / 1ps
module PRUEBA_COMPUERTA;
initial begin
Tiempo Eventos
E0 = 0; E1 = 0;
0 ns E0 = 0; E1 = 0; S = 0
#10 E0 = 0; E1 = 1;
10 ns E0 = 0; E1 = 0; S = 0
#10 E0 = 1; E1 = 0;
20 ns E0 = 0; E1 = 0; S = 0
#10 E0 = 1; E1 = 1;
30 ns E0 = 0; E1 = 0; S = 0
end
endmodule
65
Ejemplo de un banco de prueba (cont)
66
Implementación de
Circuitos
Secuenciales
Circuitos Secuenciales
CIRCUITO SALIDAS
ENTRADAS
COMBINACIONAL
ELEMENTOS DE
MEMORIA
68
Circuitos Secuenciales (cont)
69
Sentencias bloqueadoras y no bloqueadoras
70
Sentencias bloqueadoras y no bloqueadoras
(cont)
• Esto se puede arreglar utilizando sentencias no
bloqueadoras:
always @ (posedge CLK)
A <= B; Sentencia no
bloqueadora
always @ (posedge CLK)
B <= A;
input CLK, X;
output A;
reg A, B;
X D
always @ (posedge CLK)begin
Q A
B = X; CLK
FF
A = B;
end
endmodule
72
Ejemplo: (cont)
input CLK, X;
output A;
reg A, B; B
X D D
always @ (posedge CLK)begin Q Q A
B <= X; CLK
FF FF
A <= B;
end
endmodule
73
Consejos:
74
Ejemplo: Registro con RESET sincrónico
75
Ejemplo: Registro con RESET sincrónico (cont)
• El HDL sería:
endmodule
76
Ejemplo: Registro con RESET asincrónico
77
Ejemplo: Registro con RESET asincrónico
(cont)
• El HDL sería:
78
Ejemplo: Registro con RESET sincrónico (cont)
• Un posible banco de prueba sería (daría como
resultado la figura anterior):
`timescale 1ns / 1ps
module PRUEBA_REG_ASINC(CLK, RESET, D, Q);
reg CLK = 0, RESET = 0, D = 0; Se le asignan
wire Q; valores iniciales
a las entradas
REG_ASINC uut(CLK, RESET, D, Q);
endmodule 79
Ejemplo: Registro bidireccional
reg VAR;
D
WR CE Q
assign D_OUT = (RD)? VAR: 1'bz; CLK FF
always @ (posedge CLK) RESET
RD
if(RESET) VAR <= 0;
else if(WR) VAR <= D_OUT;
endmodule
80
Ejemplo: Registro bidireccional (cont.)
81
Ejemplo: Registro bidireccional (cont.)
`timescale 1ns / 1ps
module PRUEBA_REG_BIDIRR_v;
//entradas
reg CLK = 0, RESET = 0, RD = 0, WR = 0;
//BIDIRR Con estas declaraciones
reg D_TEMP = 0;
wire D_OUT; evitamos el conflicto
assign D_OUT = (WR)? D_TEMP: 1'bz; del flujo de datos
REG_BIDIRR uut(CLK, RESET, RD, WR, D_OUT);
initial forever #10 CLK = !CLK;
initial begin
#20 RESET = 1;
#20 RESET = 0;
#20 RD = 1;
#20 RD = 0;
D_TEMP = 1;
WR = 1;
#20 D_TEMP = 0;
WR = 0;
#20 RD = 1;
end
endmodule
82
Bancos de memoria
000H
001H
Variable de 8 bits por 1024:
002H
003H
reg [7:0] BANCO [1023:0];
1024
004H
005H
3FEH
83
Ejemplo: Bancos de 4 bits x 2k, bidireccional
endmodule
84
Implementación de
Máquinas de
Estados Finitos
Concepto de Máquina de estados
CIRCUITO SALIDAS
ENTRADAS
COMBINACIONAL
ELEMENTOS DE
MEMORIA
86
Máquina de Moore
clk
ESTADO ACTUAL
87
Máquina de Moore (cont.)
• Diagrama de estados
• Salidas se asignan en los estados
• Entradas controlan transiciones entre • Tabla de estados
estados
1 1
00/0 11/1 0 0 0 0 1 0
0 0 1 0 0 0
0 1 0 1 1 1
0 1 1 1 0 1
0 0 0 1 0 0 1 1 0
1 0 1 1 0 0
1 1 0 0 0 1
1 1 1 1 1 1
01/1 10/0
1
88
Máquina de Moore: Implementación en HDL
module maq_Moore(X, CLK, RST, Z);
input X;
input CLK;
input RST;
output reg Z;
reg[1:0] state;
parameter S0=2'b00, S1=2'b01, S2=2'b10, S3=2'b11;
89
Otra forma de implementar máquina de Moore
module moore_Mejor(X, CLK, RST, Z);
input X;
input CLK;
input RST;
output reg Z;
reg [1:0] ESTADO_ACTUAL, ESTADO_SIGUIENTE;
parameter [1:0] S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;
always @ (ESTADO_ACTUAL or X)
case(ESTADO_ACTUAL)
S0:
if(X) ESTADO_SIGUIENTE = S0;
else ESTADO_SIGUIENTE = S1;
S1:
if(X) ESTADO_SIGUIENTE = S2;
else ESTADO_SIGUIENTE = S3;
S2:
if(~X) ESTADO_SIGUIENTE = S3;
else ESTADO_SIGUIENTE = S2;
S3:
if(~X) ESTADO_SIGUIENTE = S0;
else ESTADO_SIGUIENTE = S3;
endcase
always @ (ESTADO_ACTUAL)
case(ESTADO_ACTUAL)
S0:
Z = 0;
S1:
Z = 1;
S2:
Z = 0;
S3:
Z = 1;
default:
Z = 0;
endcase
endmodule
90
Máquina de Mealy
clk
ESTADO ACTUAL
91
Máquina de Mealy (cont.)
0/1
Estado Actual Entrada Siguiente Estado Salida
00 10 A B X A B Z
0 0 0 0 0 0
0 0 1 0 1 0
0/1 0 1 0 0 0 1
1/0 0/1 1/0 0 1 1 1 1 0
1 0 0 0 0 1
1 0 1 1 0 0
1 1 0 0 0 1
01 11 1 1 1 1 0 0
1/0
92
Máquina de Mealy: Implementación en HDL
module maq_Mealy(X, RST, CLK, Z);
input X;
input RST;
input CLK;
output reg Z;
reg [1:0] ESTADO_ACTUAL, ESTADO_SIGUIENTE;
parameter [1:0] S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;
always @ (ESTADO_ACTUAL or X)
case(ESTADO_ACTUAL)
S0: if(X) ESTADO_SIGUIENTE = S1;
else ESTADO_SIGUIENTE = S0;
S1: if(X) ESTADO_SIGUIENTE = S3;
else ESTADO_SIGUIENTE = S0;
S2: if(~X) ESTADO_SIGUIENTE = S0;
else ESTADO_SIGUIENTE = S2;
S3: if(X) ESTADO_SIGUIENTE = S2;
else ESTADO_SIGUIENTE = S0;
endcase
always @ (ESTADO_ACTUAL or X)
case(ESTADO_ACTUAL)
S0: Z = 0;
S1: if (X) Z = 0;
else Z = 1;
S2: if (X) Z = 0;
else Z = 1;
S3: if (X) Z = 0;
else Z = 1;
default:
Z = 0;
endcase
endmodule
93
Máquina de estados microprogramada
rst
Q0 A0
Mux de Q1 A1
Condiciones
...
Memoria de
False 0 Qk Ak Microprograma
Cond0 Contador
1 m bits
Cond1 2 LD
True 3 D[k:0] Dir. Salto LD. Sel Otras
Sel
clk
Hacia la
ruta de
datos
94
Mux de condiciones: tabla de funcionamiento
Cond1 Función
LD. Sel Cond0
0 X X Incremente contador
1 F X Incremente contador
2 X F Incremente contador
95
Características de máquina microprogramada
96
Ejemplo de Implementación en Verilog
E1 = 0
INICIO
S1 = 0
S2 = 0
E1 = 1
A E
E2 = 0 S1 = 1 S1 = 0 X
S2 = 0 S2 = 1
E2 = 1 E1 = 0
B E2 = 0 D
S1 = 0 S1 = 1 E1 = 1
S2 = 1 S2 = 1
E2 = 1
C X
S1 = 0
S2 = 0
97
Tabla de microprograma y configuración Mux
LD.
Estado Dir.
Sel Salidas
Actual Salto
E2 3
!E2 4
True 5
Sel[2:0]
98
Código Verilog
//Top level
endmodule
99
Código Verilog (cont.)
//Mux de condiciones y contador de microprograma
endmodule
endmodule
100
Código Verilog (cont.)
//memoria de microprograma
module MEM_uPROGRAMA(DIR, SALIDAS);
always @ (DIR)
case(DIR)
3'b000:SALIDAS = 8'b000_010_00;
3'b001:SALIDAS = 8'b001_100_10;
3'b010:SALIDAS = 8'b100_100_01;
3'b011:SALIDAS = 8'b000_000_00;
3'b100:SALIDAS = 8'b100_001_11;
3'b101:SALIDAS = 8'b101_101_01;
default: SALIDAS = 8'b000_101_00;
endcase
endmodule
101