Anda di halaman 1dari 109

Departamento de Tecnologa Electrnica

Universidad de Sevilla
INTRODUCCIN A
HD !ERIO"
Rev.7 (feb 2013)
Autor: Paulino Ruiz de Clavijo
Modificacione al te!to ori"inal:
#abel $%&ez' Alberto Molina ( )er"io Mart*n
2
#ndice
Introduccin a HDL Verilog
Bloque I: Diseo de circuitos combinacionales
Bloque II: Diseo de circuitos secuenciales
Bloque III: Simulacin y verificacin
Bloque IV: Implementacin
3
Introd$ccin
Verilog es un lenguae formal para describir e
implementar circuitos electrnicos!
"s similar a un lenguae de programacin imperativo:
formado por un conunto de sentencias que indican
como reali#ar una tarea!
$lgunas diferencias:
La mayor%a de las sentencias se eecutan concurrentemente
&ada sentencia corresponde a un bloque de circuito
4
%O&UE I
Dise'o de Circ$itos
Com(inacionales
5
%lo)$e I* #ndice
"structura general de una descripcin Verilog
'ipos de descripciones
Seales( puertos ")S y arrays
Sinta*is b+sica
6
Estr$ct$ra de descripciones !erilog
module mi_circuito (
input x, y,
input z,
output f1, f2
);
wire cable_interno;
reg variable_a
...
...
...
endmodule
Declaracin del mdulo con sus
entradas y salidas: input( output(
inout
Declaracin de seales y variables
que se utili#ar+n internamente en
la descripcin: ,ire( reg
Descripcin del mdulo! Hay
varias alternativas para reali#arla:
funcional( procedimental(
estructural
7
E+emplo* circ$ito votador
"*presin lgica:
z=ab+ac+bc
module votador (input a,b,c,output z);
assign z= (a & b) | (a & c) | (b & c);
endmodule
votador
a
b
c
z
8
Tipos de descripciones
Descripcin funcional
-odela circuitos combinaciones!
&onsiste en asignaciones de las salidas de manera continua
utili#ando assign!
'odas las sentencias assign se eecutan de manera concurrente!
module votador(input a,b,c, output z);

assign z = a&b | a&c | b&c;
endmodule
z=ab+ac+bc
9
Tipos de descripciones
Descripcin procedimental
.ermite el uso de estructuras de
control
La descripcin es algor%tmica(
igual que el soft,are
/acilita la creacin de funciones
compleas
Se basa en la sentencia al,ays
'odas las sentencias al,ays se
eecutan de forma concurrente
module votador(
input a,b,c,
output reg z)

always @(a,b,c)
if(a==1)
if(b==1 || c==1)
z=1;
ele
z=!;
ele
if(b==1 && c==1)
z=1;
ele
z=!;
endmodule
z=ab+ac+bc
10
Tipos de descripciones
Descripcin estructural
Se conectan mdulos que ya est+n
definidos previamente
Las puertas lgicas b+sicas ya est+n
predefinidas en Verilog 0and( nand(
or( nor( *or( *nor( not( buf( etc!1
"s muy 2til para la intercone*in de
los mdulos que se creen
3bserve que se utili#an ,ires para
conectar salidas y entradas de
puertas
module votador(
input a,b,c,
output z)
wire o"t1,o"t2,o"t#;
and and1(o"t1,a,b);
and and2(o"t2,b,c);
and and#(o"t#,a,c);
or or1(z,o"t1,o"t2,o"t#);
endmodule
or1
a
b
c
and1
and3
and2
#
out4
out5
out6
z=ab+ac+bc
Sinta*is puertas: $A+, intance-na&e(out.ut' in.ut)
11
Tipos de descripciones
'odas las sentencias assign y al,ays se eecutan de
manera concurrente!
La descripcin estructural se utili#a para la
intercone*in de los diferentes mdulos que se
creen!
Las descripciones estructurales conforman la erarqu%a
del sistema que se est+ diseando!
12
Tipos de descripciones
"emplo de descripcin de un /7LL8$DD"9 : bits a
partir de varios /7LL8$DD"9 de un bit
b! a!
!
cin
b1 a1
1
b2 a2
2
$% &bit
b# a#
#
co"t&
$%!
b! a!
!
co"t1 cin
$%1
b1 a1
1
co"t2
$%2
b2 a2
2
co"t#
$%#
b# a#
#
co"t&
13
Tipos de descripciones
.asos:
Descripcin de un mdulo para el /7LL8$DD"9 de
un bit!
Descripcin de un mdulo donde se utili#an : /7LL8
$DD"9 de un bit y se interconectan los cables de
los mdulos!
14
Tipos de descripciones
Descripcin funcional del /$ de un bit
$%
b a

cin co"t
module f"lladder(
in'"t a,
in'"t b,
in'"t cin,
o"t'"t ,
o"t'"t co"t);
assign = a ( b ( cin;
assign co"t = a & b | a & cin | b & cin;
endmodule
cin a b cout s
! ! ! ! !
! ! 1 ! 1
! 1 ! ! 1
! 1 1 1 !
1 ! ! ! 1
1 ! 1 1 !
1 1 ! 1 !
1 1 1 1 1
=abc
co"t=a)b + a)cin + b)cin
15
Tipos de descripciones
7nin de : /7LL8$DD"9: cone*in posicional!
module f"lladder&(
in'"t *#+!, a,
in'"t *#+!, b,
in'"t cin,
o"t'"t *#+!, ,
o"t'"t co"t&);
-ire co"t1,co"t2,co"t#;
f"lladder fa! (a*!,, b*!,, cin, *!,, co"t1);
f"lladder fa1 (a*1,, b*1,, co"t1, *1,, co"t2);
f"lladder fa2 (a*2,, b*2,, co"t2, *2,, co"t#);
f"lladder fa# (a*#,, b*#,, co"t#, *#,, co"t&);
endmodule
$%!
b! a!
!
co"t1 cin
$%1
b1 a1
1
co"t2
$%2
b2 a2
2
co"t#
$%#
b# a#
#
co"t&
16
Tipos de descripciones
7nin de : /7LL8$DD"9: cone*in nombrada!
module f"lladder&(
in'"t *#+!, a,
in'"t *#+!, b,
in'"t cin,
o"t'"t *#+!, ,
o"t'"t co"t&);
-ire co"t1,co"t2,co"t#;
f"lladder fa! (.a(a*!,), .b(b*!,), .cin(cin), .(*!,), .co"t(co"t1));
f"lladder fa1 (.a(a*1,), .b(b*1,), .cin(co"t1), .(*1,), .co"t(co"t2));
f"lladder fa2 (.a(a*2,), .b(b*2,), .cin(co"t2), .(*2,), .co"t(co"t#));
f"lladder fa# (.a(a*#,), .b(b*#,), .cin(co"t#), .(*#,), .co"t(co"t&));
endmodule
$%!
b! a!
!
co"t1 cin
$%1
b1 a1
1
co"t2
$%2
b2 a2
2
co"t#
$%#
b# a#
#
co"t&
17
Tipos de descripciones
Descripcin procedimental
module f"lladder&(
in'"t *#+!, a,
in'"t *#+!, b,
in'"t cin,
o"t'"t *#+!, ,
o"t'"t co"t&);
reg *&+!, re;
al-ay @(a,b,cin)
re = a + b + cin;

aign co"t=re*&,;
aign = re*#+!,;
endmodule

"l tipo de descripcin utili#ada


para el mdulo no influye en cmo
se comporta ;ste!

Se pierde la estructura interna! La


<erramienta de s%ntesis genera un
<ard,are equivalente!
18
Tipos de se'ales
"*isten dos tipos b+sicos de seales
wire: corresponden a cables f%sicos que interconectan
componentes( por tanto( no tienen memoria!
reg: 0tambi;n llamada variable1! Son utili#ados para almacenar
valores( tienen memoria!
Los tipos 0reg1 se utili#an para modelar el
almacenamiento de datos
'odos los asignamientos que se realicen dentro de un
procedimiento 0al,ays1 deben ser sobre una seal
tipo reg
19
,$ertos de entrada-salida
&uando se declaran mdulos se puede especificar si
un puerto es tipo ,ire o reg
Si no se indica nada es por defecto
,ire
Los cables 0,ire1 son utili#ados
con la sentencia assign
Los registro 0reg1 son asignados
en los procedimientos
module mi_circuito (
input wire x,
input z,
output reg .e.
);
...
endmodule
20
Arra.s
Los arrays son agrupaciones de bits( motivos:
Los puertos de entrada)salida se agrupan 0buses1 para trabaar con
mayor comodidad
Los registros pueden ser de varios bits
Sinta*is: =-:>?
module comparador_gel (
input -ire *#+!, a,
input *#+!, b,
output g,e,l
);
...
endmodule
/012%3%403
567
A3
A2
A1
A0
B3
B2
81
8!
5
E
7
21
Sinta/is (0sica
Literales
Sentencia assign
Sentencia al,ays
"*presiones y operadores
Sentencias condicionales
22
Sinta/is (0sica
Verilog distingue entre may2sculas y min2sculas
Se pueden escribir comentarios:
&omentario en linea: precedido de doble barra @))A
&omentario de varias l%neas: comien#a con 9: y termina con :9
wire a; 99 6te cable e conecta con f2
9: 6te cable conecta ."c;o co.'onente
y neceito varia linea 'ara ex'licarlo
correcta.ente :9
wire a;
23
Sinta/is (0sica
Literales: Se puede e*presar en varios formatos
"emplo: @BB4B4B4BA en binario
8<=%3<0
>?b!!1!1!1!
@6A%46/<1%7
>?;2%
46/<1%7
>?d&2 B &2
0/C%7
>?o!D2
Indicador de base 0b,o,h,d1 >2mero de bits
24
Sinta/is (0sica
"emplo de literales: &ircuito que siempre tiene sus
salidas a uno
module siempre_uno (
input x,
output *E+!, alida1,
output *#+!, alida2
);
assign alida2 = &?b1111;
assign alida1 = >?;$$;
endmodule
25
Sentencia assign
'odas las sentencias assign se
eecutan de manera
concurrente
"n el eemplo la salida f5 es
equivalente a:
module otro_ejemplo (
input x, y, z,
output f1, f2
);
assign f1 = x & y;
assign f2 = f1 & z;
endmodule
assign f2 = x & y & z;
26
Sentencia al1a.s
7n bloque al,ays se eecuta concurrentemente con los
dem+s bloques al,ays y assign que <ay en la
descripcin HDL
Los bloques al,ays tienen una lista de sensibilidad:
La lista de sensibilidad consiste en una lista de seales!
"l cdigo del bloque al,ays se eecuta slo si cambia alguna de las
seales de la lista de sensibilidad!
La sinta*is es:
always @(a,b)
c = a | b;
27
Sentencia al1a.s
7na sentencia al,ays suele
contener varias sentencias( en
cuyo caso( debe utili#ar un
bloque @beginA C @endA
Los bloques begin)end se utili#an
para agrupar un conunto de
sentencias!
Son ampliamente utili#ados
module (in'"t a, b, c, d
o"t'"t reg f1,
o"t'"t reg f2);
always @(a,b,c,d)
begin
f1 = a | b;
f2 = c & d;
end
endmodule
28
Importante regla general sobre la lista de sensibilidad:
Siempre que se est; describiendo un componente combinacional(
se debe incluir en la lista de sensibilidad todas las entradas del
componente
Se puede simplificar la sinta*is mediante: always @(*)
Sentencia al1a.s
module (in'"t a, b, c, d,
in'"t e, f, g, ;,
o"t'"t f1, f2);
always @(a,b,c,d,e,f,g,;)
begin
...
end
endmodule
module (in'"t a, b, c, d,
in'"t e, f, g, ;,
o"t'"t f1, f2);
always @(:)
begin
...
end
endmodule
D
29
Operadores
3peradores a nivel de bits:
"stos operadores trabaan con todos los bits!
Si la variable es de un 2nico bit operan como los
operadores del +lgebra de conmutacin!
Operador jemplo de c!digo "erilog
& c = a&b; 99 0'eraciBn %=4 de todo lo bit
| c = a|b; 99 0'eraciBn 03 de todo lo bit
( c = a(b; 99 0'eraciBn A03 de todo lo bit
F b = Fa; 99 <nveriBn de todo lo bit
30
Operadores
-+s operadores a nivel de bits
Operador jemplo de c!digo "erilog
F& d = a F& b; 99 0'erador =%=4 a nivel de bit
F| d = a F| b; 99 0'erador =03 a nivel de bit
F( d = a F( b; 99 0'erador 6A=03 a nivel de bit
'odos estos operadores pueden trabaar con una 2nica
variable 0reduction operators1! "n tal caso act2an
sobre los bits del operando! ": d D Ea 0reduction
$>D1 o dDF b 0reduction *or1
31
Operadores
"emplo de uso de operadores a nivel de bits: -dulo
que reali#a el complemento a uno de una palabra de
4G bits
module co.'le.ento_a1(
input *1D+!, 'alabra,
output *1D+!, co.'le.ento_1);
assign co.'le.ento_1 = F'alabra;
endmodule
32
Operadores
3peradores relacionales: devuelven 4 si es verdadera
la condicin
Operador jemplo de c!digo en "erilog
G a G b; 99H6 a .enor I"e bJ
K a K b; 99H6 a .ayor I"e bJ
K= a K= b; 99H6 a .ayor o ig"al I"e bJ
G= a G= b; 99H6 a .enor o ig"al I"e bJ
== a == b; 994ev"elve 1 i a e ig"al I"e b
L= a L= b; 994ev"elve 1 i a e ditinto de b
33
Operadores
3peradores lgicos: >o confundirlos con los
operadores a nivel de bits!
Operador jemplo de c!digo "erilog
&& a && b; 99 4ev"elve 1 i a y b on verdadero
|| a || b; 99 4ev"elve 1 i a B b e verdadero
L
La; 99 4ev"elve 1 i a e falo B ! i a
99 e verdadero
34
Operadores
3peradores aritm;ticos
Operador jemplo de c!digo "erilog
: c = a : b; 99 1"lti'licaciBn
9 c = a 9 b; 99 4iviiBn
+ ". = a + b; 99 M".a de a+b
N reta = a N b; 99 3eta
35
Operadores
3tros operadores
$parte de estos operadores e*isten m+s que se
pueden encontrar en la bibliograf%a
Operador jemplos en c!digo "erilog
GG b = a GG 1; 994e'laza.iento a la
99izI. de "n bit
KK b = a KK 1; 994e'laza.iento a la
99der. de "n bit
J+ c = el J a + b; 99 i el e "no
99entonce c = a,ino entonce c = b
OP Oa, b, cP = #?b1!1; 99 /onatenaciBn+
99 %igna "na 'alabra a bit
99 individ"ale+ a=1, b=! y c=1
36
Sentencias condicionales
La sentencia condicional m+s com2n es la sentencia:
i# $ else $
Slo se pueden usar en procedimientos @al,aysA
"n las condiciones de esta sentencia se pueden
utili#ar todos los operadores lgicos y relacionales
i# ( a K ! )
Mentencia
else
Mentencia
i# ( a == ! )
Mentencia
else i#( b L= 1 )
Mentencia
37
Sentencias condicionales
Si <ay m+s de una sentencia tras una condicin( <ay
que utili#ar bloques @beginA C @endA
always @(a)
begin
i# ( a K ! )
f1 = 1;
f2 = 1;
else
f1 = !;
end
always @(a)
begin
i# ( a K ! )
begin
f1 = 1;
f2 = 1;
end
else
f1 = !;
end
ERROR
Correcto
38
Sentencias condicionales
"emplo de
comparador H"L

module co.'arador_gel(
in'"t *#+!, a,
in'"t *#+!, b,
o"t'"t g, // si a < b => (g,e,l) = (0,0,1)
o"t'"t e, // si a = b => (g,e,l) = (0,1,0)
o"t'"t l);
reg g, e, l;
always @(a, b)
begin
g = !;
e = !;
l = !;
i# (a K b)
g =1;
else i# (a G b)
l = 1;
else
e = 1;
end
end.od"le
/012%3%403
567
A3
A2
A1
A0
B3
B2
81
8!
5
E
7
39
Sentencias condicionales
Sentencia case
Se utili#a dentro de un proceso
@al,aysA
Si alguno de los casos tiene m+s de
una sentencia <ay que utili#ar un
bloque @beginA C @endA
Se puede utili#ar default para los
casos no enumerados
reg %&'() x;
always @(x)
begin
case(x)
!+
alida_1 = 1;
1+
begin
alida_1 = 1;
alida_2 = !;
end
2+
alida_2 = 1;
#+
alida_1 = !;
endcase
end
40
Sentencias condicionales
-ultiple*or I:4
"emplo de acceso a
elementos individuales de
un array
module ."x>_1(
in'"t *2+!, ,
in'"t *E+!, in,
o"t'"t o"t);
reg o"t;
always @(, in)
case ()
#?;!+ o"t = in*!,;
#?;1+ o"t = in*1,;
#?;2+ o"t = in*2,;
#?;#+ o"t = in*#,;
#?;&+ o"t = in*&,;
#?;D+ o"t = in*D,;
#?;Q+ o"t = in*Q,;
de#ault+ o"t = in*E,;
endcase
endmodule
in!
1 !
in1
in2
in#
in&
inD
inQ
inE
o"t
2
41
%O&UE II
Dise'o de Circ$itos Sec$enciales
42
%lo)$e II* #ndice
Sinta*is II
Biestables
-+quinas de estados
9egistros
&ontadores
43
Sinta/is II
Definicin de constantes
3perador de concatenacin
Lista de sensibilidad con deteccin de flancos
$signaciones bloqueantes ) no bloqueantes
44
Sinta/is II
Dentro de un mdulo se pueden definir constantes
utili#ando parameter
"s 2til en la definicin de m+quinas de estados
"emplo:
parameter "no_con_tre_bit = #?b!!1,
"lti.o = #?b111;
reg *2+!, a;
a = "lti.o;

45
Sinta/is II
"l operador concatenar se utili#a
para agrupar seales para
que formen un array
Sinta*is: Jseal( seal( !!!!K
"emplo:
Detector del n2mero 6
module concatena(
in'"t a,b,c,
o"t'"t reg ig"al_a_#
);
always @(:)
case(Oa,b,cP)
#?b!11+
ig"al_a_# = 1;
de#ault+
ig"al_a_# = !;
endcase
endmodule
46
Sinta/is II
Deteccin de flanco
Sirve para que un proceso slo se eecute en determinados flancos
de relo de una o varias seales de entrada!
Se indica en la lista de sensibilidad de un proceso mediante un
prefio a la seal:
"l prefio posedge detecta el flanco de subida
"l prefio negedge detecta el flanco de baada
47
Sinta/is II
"emplo de deteccin de flanco negativo de un relo
module detector_flanco(
input clR,
output reg z);
always @(negedge clR)
....
endmodule
48
Sinta/is II
$signamiento bloqueante signo D
Si en un proceso se desea que la salida cambie inmediatamente(
se debe utili#ar una asignacin bloqueante!
"sto modela una salida combinacional!
Importa el orden en que se efect2an las asignaciones bloqueantes
puesto que las acciones en un proceso se eecutan
secuencialmente
49
Sinta/is II
$signamiento no bloqueante signo LD
La asignacin no bloqueante modela las escrituras en flip8flops!
Se calculan primero los valores de la derec<a de la asignacin de
todas las asignaciones LD( tras esto( se asignan todas
simult+neamente!
&uando se tiene una serie de asignaciones no bloqueantes( no
importa el orden en que son escritas!
50
Sinta/is II
module no_bloI"eante(in'"t a,clR,
o"t'"t reg z1);
reg I;
always @(posedge clR)
begin
I G= a;
z1 G= I;
end
endmodule
module bloI"eante(in'"t a,clR,
o"t'"t reg z2);
reg I;
always @(posedge clR)
begin
I = a;
z2 = I;
end
endmodule
cl*
a
+&
+,
51
%iesta(les
"emplo de biestables:
module bietable_d(
input cR,d,
output reg I);
al-ay @ ('oedge clR)
I G= d;

endmodule
q
D
clM
clM
d
q
52
%iesta(les
"emplo de biestable D disparado en flanco negativo
module bietable_d(
in'"t cR,d,
o"t'"t reg I);
al-ay @ (negedge clR)
I G= d;
endmodule
q
D
cM
clM
d
q
53
%iesta(les
Biestable D con reset
as%ncrono
module bietable_d(
in'"t cR,d,reet,
o"t'"t reg I);
always @ ('oedge clR or 'oedge reet)
if (reet)
I G= 1?b!;
ele
I G= d;
endmodule
q
D
cM
9"S"'
clM
d
q
reset
54
%iesta(les
Biestable D con reset s%ncrono
module bietable_d(
in'"t cR,d,reet,
o"t'"t reg I);
al-ay @ ('oedge clR)
if (reet)
I G= 1?b!;
ele
I G= d;
endmodule
clM
d
q
reset
55
%iesta(les
Biestable NO
module SR_fli'_flo' (
input clR,
input S,
input R,
output reg I);

always @(negedge clR)
case (OS,RP)
2?b11 + I G= FI; 99 /a.bio
2?b!1 + I G= 1?b!; 99 reet.
2?b1! + I G= 1?b1; 99 et.
2?b!! + I G= I; 99
endcase

endmodule
O
q N
cM
00 01 11 10
0
1
Q
JK
q
0 0 1 1
1 0 0 1

56
%iesta(les
Biestable '
module bietable_t(
input cR,
input t,
output reg I);
always @(negedge cR)
i# (t == 1)
I G= FI;
endmodule
q
'
cM
qD
B
qD
4
T=1
T=1
T=0
T=0
57
%iesta(les
"ercicios: 9ealice los siguientes biestables( sabiendo
las seales &L y .9 son s%ncronas
O
q
N
cM
.9 &L
q
D
cM
.9 &L
q
'
cM
.9 &L
9
q
S
cM
.9 &L
58
20)$inas de estado
Se utilizar una estructura
general del cdigo en la que hay 2
rocesos
!no de asignacin de
siguientes estados
"tro de calculo de siguiente
estado y salidas
$
B
&
D
B)B
4)B
B)B
B)B
B)B
4)4
4)B
4)B
59
20)$inas de estado
module .i_diagra.a_de_etado(
in'"t -./01_2_304121/,
o"t'"t reg -./01_2_/1-.21/);
99 46$<=</<0= T %M<5=%/<U= 46 6MC%40M
'ara.eter -./01_2_/012O/
99 V%3<%876M 2%3% %71%/6=%3 67 6MC%40 236M6=C6 T M<5W<6=C6
reg *3+!, c"rrent_tate, next_tate;
99 230/6M0 46 /%18<0 46 6MC%40
always @(posedge cl* or posedge reset)
.......
99 230/6M0 M<5W<6=C6 6MC%40 T M%7<4%
always @(current_state, -./01_2_304121/)
.......
endmodule
60
20)$inas de estado
"n la estructura general <ay que completar : partes de
cdigo:
Definicin y asignacin de estados( seg2n el n2mero de estados
utili#aremos mas o menos bits!
Definicin de registros para almacenar el estado actual y el
siguiente! Deben ser del mismo tamao en bits que el utili#ado en
el punto anterior
.roceso de cambio de estado: Siempre es el mismo cdigo
.roceso de c+lculo de siguiente estado y salida: Hay que
rellenar el cdigo correspondiente las transiciones del
diagrama de estados
61
20)$inas de estado
module .aI"ina_etado(
in'"t x, clR, reet,
o"t'"t reg z);
'ara.eter % = 2?b!!,
8 = 2?b!1,
/ = 2?b1!,
4 = 2?b11;
reg *1+!, c"rrent_tate,next_tate;
always @(posedge clR, posedge reet)
begin
i#(reet)
c"rrent_tate G= %;
else
c"rrent_tate G= next_tate;
end
/.56 78
$signacin
de estados
.roceso
de asignacin
de siguiente estado
$
B
&
D
B)B
4)B
B)B
B)B
B)B
4)4
4)B
4)B
62
20)$inas de estado
"l proceso de calculo del siguiente estado y salida se
reali#a con una 2nica sentencia case
La sentencia case debe contemplar todos los estados del diagrama
de estados
$ntes de la sentencia case se recomienda establecer por defecto a
cero todas las salidas!
63
20)$inas de estado
always @(c"rrent_tate,x)
begin
z = !;
case(c"rrent_tate)
%+
i#(x == 1)
next_tate = 8;
else
next_tate = %;
8+
i#(x == 1)
next_tate = 8;
else
next_tate = /;
$
B
&
D
B)B
4)B
B)B
B)B
B)B
4)4
4)B
4)B
"stado $
"stado B
Salida a cero
64
20)$inas de estado
/+
i#(x == 1)
next_tate = 8;
else
next_tate = 4;
4+
i#(x == 1)
begin
z = 1;
next_tate = 8;
end
else
next_tate = %;
endcase
end
endmodule
"stado &
"stado D
$
B
&
D
B)B
4)B
B)B
B)B
B)B
4)4
4)B
4)B
65
Registros
REG
&O
LD
&L
*
6
*
5
*
4
*
B
#
6
#
5
#
4
#
B
module registro(
in'"t cR,
in'"t cl,
in'"t ld,
in'"t *#+!, x,
o"t'"t *#+!, z
);

reg *#+!, I;
always @(posedge cR, negedge cl)
i# (cl == !)
I G= !;
else i# (ld == 1)
I G= x;
assign z = I;
endmodule
CL, LD Operation Type
0x q 0 async.
11 q x sync.
10 q q sync.
9egistro con carga en paralelo y
clear
66
Registros
REG
&O
">
&L
*
L
#
L
module reg_;l(
in'"t cR,
in'"t cl,
in'"t en,
in'"t xl,
o"t'"t zl
);
reg *#+!, I;
always @('oedge cR, negedge cl)
if (cl == !)
I G= !;
ele if (en == 1)
I G= OI*2+!,, xlP;
assign zl = I*#,;
endmodule
CL, E Operation Type
0x q 0 async.
11 q !"L#q$ sync.
10 q q sync.
9egistro de despla#amiento
67
Contadores
CO%T
&O
&L
#
6
#
5
#
4
#
B
module co"nt_.od1Q(
in'"t cR,
in'"t cl,
o"t'"t *#+!, z);
reg *#+!, I;
always @('oedge cR, 'oedge cl)
if (cl == 1)
I G= !;
ele
I G= I + 1;
assign z = I;
endmodule
CL Operation Type
1 q 0 async.
0 q q&1'
(od 1)
sync.
&ontador ascendente con clear
68
Contadores
CO%T
&O
">
&L
#
6
#
5
#
4
#
B
&
7D
CL, E, %D
Operation Type
1xx q 0 async.
00x q q sync.
010 q q&1'
(od 1)
sync.
011 q q*1'
(od 1)
sync.
module rev_co"nter1(
in'"t cR,
in'"t cl,en, "d,
o"t'"t *#+!, z, o"t'"t c);
reg *#+!, I;
always @('oedge cR, 'oedge cl)
begin
if (cl == 1)
I G= !;
ele if (en == 1)
if ("d == !)
I G= I + 1;
ele
I G= I N 1;
end
assign z = I;
assign c = "d J F(|I) + &I;
endmodule
&ontador ascendente)
descendente con clear
Bloque III
Simulacin y verificacin
69
Bloque III: ndice
Prueba y verificacin de circuitos.
Prueba y verificacin de mdulos Verilog.
Estructura general del testbench.
El testbench de un circuito combinacional.
Ejemplo: testbench de un decodificador 2:4
El testbench de un circuito secuencial.
Ejemplo: testbench de un contador mdulo 16.
70
Prueba y verificacin de circuitos
Introduccin
Los circuitos reales ya implementados deben ser probados para
verificar que su funcionamiento se ajusta a las especificaciones.
Esto permitir detectar problemas de en su funcionamiento.
Lo mismo ocurre con las descripciones Verilog de los circuitos.
Pueden tener errores y es necesario detectarlos, antes incluso de
pasar a la fase de implementacin del circuito a partir de su
descripcin en Verilog.
Esto se consigue gracias a la simulacin del funcionamiento y
posterior verificacin de los circuitos descritos en Verilog.
71
Prueba y verificacin de circuitos
Cmo se prueba un circuito real?
Obviamente, no basta con conectarlo a una fuente de alimentacin
adecuada y observar su comportamiento.
Adems ser necesario darle diferentes valores a sus entradas e ir
viendo si el valor de sus salidas es el correcto en cada momento.
Para ello se debe conectar el circuito a probar a otros equipos
adicionales, que generaran seales especiales como la de reloj, o a
circuitos auxiliares que generen seales de entrada de diversos
valores.
Mediante el osciloscopio u otros equipos, el usuario verifica que las
salidas obtenidas para las distintas entradas son las correctas.
72
Prueba y verificacin de mdulos Verilog
Cmo se prueba un mdulo Verilog?
La descripcin de un mdulo en Verilog no es un circuito real, pero
hay herramientas que simulan su funcionamiento.
Para probar un mdulo Verilog no basta con introducirlo en una
herramienta de simulacin y darle al botn simular funcionamiento.
Esto sera simplemente el equivalente a conectar un circuito real a
una fuente de alimentacin.
Debemos disear en Verilog un mdulo especial llamado testbench y
ese ser el que le suministraremos al simulador para que simule su
funcionamiento.
El modulo testbench contiene al modulo a probar y se encarga de
suministrarle entradas con distintos valores para que luego el usuario
pueda comprobar si las salidas del mdulo son las correctas.
73
Estructura general del testbench
module micircuito_tb;

reg tb_ent1, tb_ent2, ;
wire tb_sal1, tb_sal2, ;

micircuito instancia_de_micircuito(
.ent1(tb_ent1), .ent2(tb_ent2), ,
.sal1(tb_sal1), .sal2(tb_sal2), );

/* Sentencias procedimentales que
modifican las variables tipo
reg tb_ent1, tb_ent2, */

endmodule
El testbench (o tb) es un mdulo Verilog sin entradas ni salidas.
Debe tener tantas variables tipo reg como
entradas tenga el circuito a probar.
Y tantas variables tipo wire como salidas
tenga el circuito a probar.
El testbench contiene una
instancia del mdulo a probar,
conectada a las variables reg y
wire declaradas anteriormente.
Mediante sentencias procedimentales
del tipo always y del tipo initial se hace
que las entradas del mdulo a probar
vayan cambiando de valor.
74
El testbench de un circuito combinacional
Cmo se prueba un circuito combinacional?
Las salidas de un circuito combinacional dependen, en cada instante,
exclusivamente, del valor actual de las entradas.
El testbench de un circuito combinacional lo nico que debe hacer es
generar todos los valores posibles que puedan tomar las entradas del
circuito.
Si la suma del nmero de bits de todas las entradas del circuito es n,
el testbench debe generar un total de 2
n
valores diferentes.
Lo habitual es que los valores se generen mediante un bucle o algo
similar, evitando que haya que generar a mano los valores.
Se puede usar la tarea del sistema $monitor para que nos muestre en
pantalla los cambios que vayan experimentando las variables.
75
El testbench de un circuito combinacional

// Decodificador 2:4 con salidas en alto y habilitacin en alto.

module dec_2_a_4(
input EN, // ENABLE
input [1:0] A,
output [3:0] Q
);

assign Q[0]= EN & ~A[1] & ~A[0];
assign Q[1]= EN & ~A[1] & A[0];
assign Q[2]= EN & A[1] & ~A[0];
assign Q[3]= EN & A[1] & A[0];
endmodule

Ejemplo: testbench de un decodificador 2:4

Este es el mdulo combinacional
que queremos probar.
Tiene dos entradas, una de 1 bit y
otra de 2 bits. Habr que generar
2
3
= 8 valores de entrada
diferentes, de 3 bits cada uno,
para probar el circuito, pues es un
circuito combinacional.
76
Ejemplo: testbench de DEC 2:4
`timescale 1ns / 1ps

module dec_2_a_4_tb;

reg tb_EN;
reg [1:0] tb_A;
wire [3:0] tb_Q;

dec_2_a_4 instancia_de_dec_2_a_4 (
.EN(tb_EN),
.A(tb_A),
.Q(tb_Q)
);
/* Sigue en la pgina siguiente */
El testbench (o tb) es un mdulo
sin entradas ni salidas.
Declaramos las variables necesarias para
conectarlas a continuacin a las entradas y
salidas de la instancia del circuito, teniendo
cuidado de que sean del mismo tamao.
Creamos la instancia del
decodificador, conectando sus
entradas a las variables reg y sus
salidas a las variables wire que
hemos declarado anteriormente.
Establecemos 1ns como unidad base para medir retrasos y tiempos de espera.
77
Ejemplo: testbench de DEC 2:4
/* Viene de la pgina anterior */

initial begin
$monitor("EN=%b A=%b Q=%b tiempo=%0dns",tb_EN,tb_A,tb_Q,$time);
{tb_EN, tb_A[1:0]} = 3'b000;
#800;
$finish;
end

always begin
#100; // Espera 100ns
{tb_EN, tb_A[1:0]} = {tb_EN, tb_A[1:0]} + 3'b001;
end
endmodule
Bloque initial. Se ejecuta
una sola vez, al comienzo,
en paralelo con el always.
Cada 100ns cambiamos el valor de las entradas de
forma cmoda, considerndolas como un nico vector
de tres bits al que le sumamos una unidad.
Asignamos un valor inicial a las entradas,
tratndolas como un nico vector de 3 bits.
Esta sentencia introduce una espera de 800ns
antes de pasar a la siguiente sentencia.
$finish detiene la simulacin.
Bloque always. Repite siempre las mismas
sentencias indefinidamente, en un bucle infinito.
Con $monitor se mostrarn en pantalla los valores de las
variables especificadas, cada vez que alguna cambie de
valor, indicando tambin del instante en que cambia.
78
Ejemplo: testbench de DEC 2:4


Simulator is doing circuit initialization process.
Finished circuit initialization process.
EN=0 A=00 Q=0000 tiempo=0ns
EN=0 A=01 Q=0000 tiempo=100ns
EN=0 A=10 Q=0000 tiempo=200ns
EN=0 A=11 Q=0000 tiempo=300ns
EN=1 A=00 Q=0001 tiempo=400ns
EN=1 A=01 Q=0010 tiempo=500ns
EN=1 A=10 Q=0100 tiempo=600ns
EN=1 A=11 Q=1000 tiempo=700ns
Stopped at time : 800 ns


Estos son los mensajes que muestra en pantalla la
herramienta de simulacin cuando le pedimos que simule
el funcionamiento del mdulo de testbench.
La simulacin se ha detenido a los 800ns
gracias a la sentencia de espera #800 que
pusimos justo antes de la sentencia $finish.
Estas 8 lneas salen en pantalla
gracias a la sentencia $monitor,
informndonos de los cambios en
los valores de las variables de
entrada (EN y A) y de salida (Q) del
circuito a probar.

Ntese que el testbench cambia de
valor las entradas cada 100ns.

Podemos verificar, analizando estas
lneas con cuidado, que el DEC 2:4
se comporta correctamente.
79

Simulator is doing circuit initialization process.
Finished circuit initialization process.
EN=0 A=00 Q=0000 tiempo=0ns
EN=0 A=01 Q=0000 tiempo=100ns
EN=0 A=10 Q=0000 tiempo=200ns
EN=0 A=11 Q=0000 tiempo=300ns
EN=1 A=00 Q=0001 tiempo=400ns
EN=1 A=01 Q=0010 tiempo=500ns
EN=1 A=10 Q=0100 tiempo=600ns
EN=1 A=11 Q=1000 tiempo=700ns
Stopped at time : 800 ns


Ejemplo: testbench de DEC 2:4
Adems de informar al usuario mediante informacin
textual en pantalla, la herramienta de simulacin tambin
muestra las formas de onda de las variables declaradas en el
mdulo testbench, que son: tb_EN, tb_A y tb_Q.

Podemos verificar, analizando las formas de onda
detenidamente, que el testbench genera todos los valores
posibles de las entradas EN y A y que el valor de la salida Q
del DEC 2:4 es correcto en todo momento.
80
El testbench de un circuito secuencial
Cmo se prueba un circuito secuencial?
Las salidas de un circuito secuencial dependen, en cada instante, del
valor actual de las entradas y de su historia pasada (su estado).
Si se trata, como es habitual, de un circuito secuencial sncrono con
una seal de reloj, el testbench debe generar dicha seal de reloj.
El testbench de un circuito secuencial es ms complejo que el de un
circuito combinacional. Para probar el circuito no basta con generar
todos los valores posibles de las entradas.
En su lugar, hay que pensar bien qu tipo de circuito se est probando
y el testbench se debe disear para que ponga a prueba las
operaciones clave de dicho circuito, activando las seales de control
correspondientes y colocando diversos valores en las entradas de
datos.
81
El testbench de un circuito secuencial
module contador_mod_16(
input CK,
input LD,
input EN,
input [3:0] X,
output reg [3:0] Q,
output CY
);
assign CY = &Q;
always @(posedge CK)
if (LD == 1)
Q <= X;
else if (EN == 1)
Q <= Q + 4'b0001;
endmodule

Ejemplo: testbench de un contador mdulo 16
Este es el mdulo secuencial que queremos
probar. Es un contador ascendente de 4 bits
con carga sncrona en paralelo y seal de fin
de cuenta (la salida CY).
Aqu vemos la entrada de la seal de reloj,
CK, propia de un circuito secuencial.
La entrada de control LD (carga o LOAD) debe
provocar la carga sncrona en el contador del
valor presente en la entrada X.
La entrada de control EN (ENABLE) habilita la
operacin de cuenta ascendente.
El contador est sincronizado con los flancos
de subida del reloj (posedge CK)
LD tiene prioridad sobre EN si se activan ambas. Si no
se activa ninguna de las dos, la salida Q no cambia.
82
Ejemplo: testbench contador md. 16
`timescale 1ns / 1ps

module contador_mod_16_tb;
reg tb_CK;
reg tb_LD;
reg tb_EN;
reg [3:0] tb_X;
wire [3:0] tb_Q;
wire tb_CY;
contador_mod_16 instancia_de_contador_mod_16 (
.CK(tb_CK),
.LD(tb_LD),
.EN(tb_EN),
.X(tb_X),
.Q(tb_Q),
.CY(tb_CY)
);
/* Sigue en la pgina siguiente */
El mdulo de testbench de un circuito secuencial
es diferente al de un circuito combinacional, pero
hay cosas que se hacen siempre de igual forma:
Se declara como un mdulo sin entradas ni salidas.
Igual que siempre, se declaran las variables
necesarias de tipo reg y de tipo wire.
Como siempre, se crea una instancia del
mdulo a probar (el contador),
conectndola a las variables
previamente declaradas.
83
Ejemplo: testbench contador md. 16
/* Viene de la pgina anterior */

always begin
#50;
tb_CK = ~tb_CK;
end

initial begin
$monitor("CK=%b LD=%b EN=%b X=%b Q=%b CY=%b tiempo=%0dns",
tb_CK,tb_LD,tb_EN,tb_X,tb_Q,tb_CY,$time);
tb_CK = 0;
tb_LD = 1;
tb_EN = 0;
tb_X = 4'b1100;

/* Sigue en la pgina siguiente */
La sentencia always repite
indefinidamente, en bucle, las acciones
de interior del bloque begin-end.
Le damos a las entradas del contador los
valores iniciales que creamos oportunos.
Al usar $monitor veremos en pantalla
los cambios de valor de las variables.
La variable tb_CK invierte su valor cada 50ns, generndose
de esta forma una seal de reloj de perodo 100ns que se
inyecta como entrada a la instancia del contador.
El bloque initial se ejecuta en paralelo con el always.
84
Ejemplo: testbench contador md. 16
/* Viene de la pgina anterior */
/* Sigue el bloque initial */
@(negedge tb_CK);
tb_X = 4'b0011;
@(negedge tb_CK);
tb_X = 4'b1101;
tb_EN = 1;
@(negedge tb_CK);
tb_LD = 0;
tb_X = 4'b1001;
repeat ( 5 )
@(negedge tb_CK);
tb_EN = 0;
@(negedge tb_CK);
$finish;
end /* del bloque initial */
endmodule
En el bloque initial, tras darle valores
iniciales a las variables, iremos cambiando
sus valores cada un cierto tiempo.
Tras haber cambiado las entradas del contador de
la manera que hayamos estimado conveniente,
ordenamos con $finish que finalice la simulacin.
Escribir repeat ( 5 ) delante de la sentencia
@negedge tb_CK; es ms cmodo y equivale
a escribir 5 veces seguidas la sentencia
@negedge tb_CK;
Por tanto la variable tb_X tomar el valor 4b0011
justo despus del flanco de bajada de tb_CK.
Esta sentencia se queda esperando un tiempo,
hasta que tb_CK cambie de 1 a 0 (flanco de bajada).
85
Ejemplo: testbench contador md. 16
CK=0 LD=1 EN=0 X=1100 Q=xxxx CY=x tiempo=0ns
CK=1 LD=1 EN=0 X=1100 Q=1100 CY=0 tiempo=50ns
CK=0 LD=1 EN=0 X=0011 Q=1100 CY=0 tiempo=100ns
CK=1 LD=1 EN=0 X=0011 Q=0011 CY=0 tiempo=150ns
CK=0 LD=1 EN=1 X=1101 Q=0011 CY=0 tiempo=200ns
CK=1 LD=1 EN=1 X=1101 Q=1101 CY=0 tiempo=250ns
CK=0 LD=0 EN=1 X=1001 Q=1101 CY=0 tiempo=300ns
CK=1 LD=0 EN=1 X=1001 Q=1110 CY=0 tiempo=350ns
CK=0 LD=0 EN=1 X=1001 Q=1110 CY=0 tiempo=400ns
CK=1 LD=0 EN=1 X=1001 Q=1111 CY=1 tiempo=450ns
CK=0 LD=0 EN=1 X=1001 Q=1111 CY=1 tiempo=500ns
CK=1 LD=0 EN=1 X=1001 Q=0000 CY=0 tiempo=550ns
CK=0 LD=0 EN=1 X=1001 Q=0000 CY=0 tiempo=600ns
CK=1 LD=0 EN=1 X=1001 Q=0001 CY=0 tiempo=650ns
CK=0 LD=0 EN=1 X=1001 Q=0001 CY=0 tiempo=700ns
CK=1 LD=0 EN=1 X=1001 Q=0010 CY=0 tiempo=750ns
CK=0 LD=0 EN=0 X=1001 Q=0010 CY=0 tiempo=800ns
CK=1 LD=0 EN=0 X=1001 Q=0010 CY=0 tiempo=850ns
Stopped at time : 900 ns
Por ejemplo: Si LD=0 y
EN=0, aunque CK pasa de
valer 0 a valer 1, vemos
que la salida Q no cambia
de valor (correcto).
Podemos verificar,
analizando el resultado de
la simulacin, si el circuito
bajo prueba, el contador
mdulo 16, se comporta
correctamente.
Gracias a la sentencia
$monitor, al simular el
testbench se nos informa
de los cambios en los
valores de las variables de
entrada (CK, LD, EN, y X ) y
de salida (Q y CY) del
circuito a probar.
86
Ejemplo: testbench contador md. 16
CK=0 LD=1 EN=0 X=1100 Q=xxxx CY=x tiempo=0ns
CK=1 LD=1 EN=0 X=1100 Q=1100 CY=0 tiempo=50ns
CK=0 LD=1 EN=0 X=0011 Q=1100 CY=0 tiempo=100ns
CK=1 LD=1 EN=0 X=0011 Q=0011 CY=0 tiempo=150ns
CK=0 LD=1 EN=1 X=1101 Q=0011 CY=0 tiempo=200ns
CK=1 LD=1 EN=1 X=1101 Q=1101 CY=0 tiempo=250ns
CK=0 LD=0 EN=1 X=1001 Q=1101 CY=0 tiempo=300ns
CK=1 LD=0 EN=1 X=1001 Q=1110 CY=0 tiempo=350ns
CK=0 LD=0 EN=1 X=1001 Q=1110 CY=0 tiempo=400ns
CK=1 LD=0 EN=1 X=1001 Q=1111 CY=1 tiempo=450ns
CK=0 LD=0 EN=1 X=1001 Q=1111 CY=1 tiempo=500ns
CK=1 LD=0 EN=1 X=1001 Q=0000 CY=0 tiempo=550ns
CK=0 LD=0 EN=1 X=1001 Q=0000 CY=0 tiempo=600ns
CK=1 LD=0 EN=1 X=1001 Q=0001 CY=0 tiempo=650ns
CK=0 LD=0 EN=1 X=1001 Q=0001 CY=0 tiempo=700ns
CK=1 LD=0 EN=1 X=1001 Q=0010 CY=0 tiempo=750ns
CK=0 LD=0 EN=0 X=1001 Q=0010 CY=0 tiempo=800ns
CK=1 LD=0 EN=0 X=1001 Q=0010 CY=0 tiempo=850ns
Stopped at time : 900 ns
Adems de informar al usuario mediante informacin textual en pantalla, la
herramienta de simulacin tambin muestra las formas de onda de las variables
declaradas en el mdulo testbench, que son: tb_CK, tb_LD, tb_EN, tb_X, tb_Q y tb_CY.
Podemos verificar, analizando las formas de onda detenidamente, que el testbench est
cambiando los valores de las entradas del circuito bajo prueba segn habamos previsto
y que las salidas de dicho circuito evolucionan tambin de forma correcta.
87
Ejemplo: testbench contador md. 16
La generacin de una seal de reloj peridica es una tarea necesaria en los
testbench de circuitos secuenciales.
Un ciclo de reloj dura 100ns
por lo que la frecuencia de
reloj es de 10MHz
always begin
#50;
tb_CK = ~tb_CK;
end
Comprobamos que el testbench provoca un
cambio en tb_CK cada 50ns, tal y como habamos
programado con la sentencia always.
88
initial begin
$monitor("CK=%b LD=%b EN=%b X=%b Q=%b CY=%b tiempo=%0dns",
tb_CK,tb_LD,tb_EN,tb_X,tb_Q,tb_CY,$time);
tb_CK = 0;
tb_LD = 1;
tb_EN = 0;
tb_X = 4'b1100;

@(negedge tb_CK);
tb_X = 4'b0011;
@(negedge tb_CK);
tb_X = 4'b1101;
tb_EN = 1;
@(negedge tb_CK);
tb_LD = 0;
tb_X = 4'b1001;
/* Sigue en la pgina siguiente */

Ejemplo: testbench contador md. 16
Comprobamos que los valores de las variables
tb_CK, tb_LD, tb_EN y tb_X en el instante 0ns
son los que programamos al principio del
bloque initial del testbench.
89
initial begin
$monitor("CK=%b LD=%b EN=%b X=%b Q=%b CY=%b tiempo=%0dns",
tb_CK,tb_LD,tb_EN,tb_X,tb_Q,tb_CY,$time);
tb_CK = 0;
tb_LD = 1;
tb_EN = 0;
tb_X = 4'b1100;

@(negedge tb_CK);
tb_X = 4'b0011;
@(negedge tb_CK);
tb_X = 4'b1101;
tb_EN = 1;
@(negedge tb_CK);
tb_LD = 0;
tb_X = 4'b1001;
/* Sigue en la pgina siguiente */

Ejemplo: testbench contador md. 16
Comprobamos que, tal y como habamos programado
usando la sentencia @(negedge tb_CK), el testbench
no pone la variable tb_X a valor 0011 (binario) hasta
que no se produce un flanco de bajada en tb_CK.
90
initial begin
$monitor("CK=%b LD=%b EN=%b X=%b Q=%b CY=%b tiempo=%0dns",
tb_CK,tb_LD,tb_EN,tb_X,tb_Q,tb_CY,$time);
tb_CK = 0;
tb_LD = 1;
tb_EN = 0;
tb_X = 4'b1100;

@(negedge tb_CK);
tb_X = 4'b0011;
@(negedge tb_CK);
tb_X = 4'b1101;
tb_EN = 1;
@(negedge tb_CK);
tb_LD = 0;
tb_X = 4'b1001;

/* Sigue en la pgina siguiente */
Ejemplo: testbench contador md. 16
Del mismo modo, comprobamos que una nueva
sentencia @(negedge tb_CK), hace que el testbench
espere un nuevo flanco de bajada en tb_CK antes de
poner tb_X a valor 1101 (binario) y tb_EN a 1.
A continuacin puede verse que hasta el
tercer flanco de bajada del reloj no se
modifican estas dos variables.
91
/* Viene de la pgina anterior */
/* Sigue el bloque initial */
repeat ( 5 )
@(negedge tb_CK);
tb_EN = 0;
@(negedge tb_CK);
$finish;
end /* del bloque initial */
endmodule

Ejemplo: testbench contador md. 16
Esperar 5 flancos de bajada de tb_CK cuando ya se
han producido 3 flancos, quiere decir que hasta el
octavo flanco de bajada (a los 800ms) no se pone a 0
el valor de tb_EN. Comprobamos que ha sido as,
inspeccionando las formas de onda generadas.
La simulacin termina con
$finish tras esperar un
flanco de bajada ms (el
noveno) a los 900ns.
92
Ejemplo: testbench contador md. 16
An no hemos comprobado si las formas de onda de salida son correctas.
Solo hemos comprobado que las entradas del contador cambian como habamos
planeado al disear el mdulo de testbench.
Por ejemplo, fijndonos en estos tres flancos de subida comprobamos que,
independientemente del valor de la entrada EN, si al llegar el flanco de subida la
entrada LD vale 1, el contador se carga con el dato de la entrada X y podemos ver
dicho valor inmediatamente reflejado en la salida Q del contador.
Hemos verificado que la operacin de carga en paralelo se realiza correctamente.
Ahora habra que comprobar el correcto funcionamiento de las
operaciones del contador (carga en paralelo, cuenta e inhibicin).
93
Ejemplo: testbench contador md. 16
En el ltimo flanco de subida mostrado en la simulacin vemos que el valor del contador
no cambia. Eso solo ocurre cuando las entradas LD y EN valen ambas 0.
Hemos verificado que la operacin de inhibicin se realiza correctamente
Fijndonos en estos cinco flancos de subida comprobamos que si al llegar el flanco
de subida la entrada LD vale 0 y la entrada EN vale 1 el contador incrementa en
una unidad el valor almacenado, lo cual se ve reflejado inmediatamente en la
salida Q. Ntese que, al ser mdulo 16, tras el 15 (1111 binario) viene el 0000.
Hemos verificado que la operacin de cuenta se realiza correctamente.
Verificamos que la salida CY tambin funciona
correctamente, pues vale 1 solo si Q vale 1111.
94
95
%O&UE I!
Implementacin
96
%lo)$e I!* #ndice
Introduccin
Definicin de /.H$
.rincipales fabricantes y modelos de /.H$
9ecursos internos de una /.H$
"structura general de la /.H$ modelo Virte*8II de Pilin*
7nidad b+sica de programacin
97
Introd$ccin
"l lenguae verilog que <emos visto en las transparencias anteriores(
permite la descripcin de circuitos simples pero tambi;n de otros muc<o
m+s compleos cmo podr%a ser un microprocesador!
Dic<as descripciones tienen dos obetivos principales:
Simular el comportamiento del circuito!
Verificar que se cumplen las especificaciones deseadas!
Implementar el diseo!
La implementacin final puede llevarse a cabo mediante dispositivos
programables o mediante $SI&!
"n esta asignatura se utili#ar+ un dispositivo programable denominado
/.H$ para la reali#acin de los diseos!
Se dispone de <erramientas de desarrollo que permiten reali#ar una
implementacin autom+tica de un diseo descrito en verilog sobre una
/.H$
98
De3inicin de 4,"A
Una FPGA
(Field-Programmable Gate
Array) es un dispositivo
programable:
Permite implementar
cualquier circuito digital.
La nica limitaci!n es la
cantidad de puertas del
circuito.
"l desarrollo se reali#a
sobre una placa de
entrenamiento.
99
,rincipales 3a(ricantes . modelos de
4,"A

$ilin%:
&partan
'irte%

Altera:
Arria

()clone

&trati%

Actel:
*gloo
ProA&*(
&martFusion
Xilinx
Altera
Lattice
Actel
Otros
Cuota de mercado
100
Rec$rsos internos de $na 4,"A
"n general+ una FPGA contiene los siguientes recursos internos:
,ecursos l!gicos:
Slices+ agrupados en (L- (Configurable Logic
Blocks).
.emoria -,A. (Block ,A.).
.ultiplicadores empotrados.
,ecursos de intercone%i!n:
*ntercone%i!n programable.
-loques de entrada/salida *0- (Input/utput Blocks).
0tros recursos:
-1eres de relo2.
L!gica de escaneo de pines (boundary scan logic)
normalmente mediante cone%i!n 34AG (!oin "est
Action Group).
"n las siguientes diapositivas se ilustra la estructura de la 'irte%5
** de $ilin%.
101
Estr$ct$ra general de la 4,"A modelo
!irte/5II de 6ilin/
Gestin
reloj
BRAM
Multiplicadores
empotrados
IOB
Interconexin
programable
CLB
102
Estr$ct$ra general de la 4,"A modelo
!irte/5II de 6ilin/
(ada CLB de la 'irte%5**
permite generar
1unciones
combinacionales )
secuenciales.
(ontiene:
6 &lices

(one%ionado 7acia
los (L-8s vecinos
Una matri# de cone%i!n
que permite su cone%i!n
con el resto de elementos
de la FPGA.
103
Unidad (0sica de programacin* slice
(ada slice inclu)e b9sicamente:
: biestables ;.
: bloques de carry.
: bloques LU4
(Look-#p "able).
.ultiple%ores que permiten
di1erentes con1iguraciones
Los bloques LU4
&on programables (equivalen a una
,0. <=%<) ) pueden implementar
cualquier 1unci!n de 6 variables
Las dos LU4s del mismo slice se
pueden combinar para 1ormar
1unciones combinacionales de m9s
variables.
Los biestables ;
;ispone de Pr ) (l (con1igurables en
modo as>ncronos o s>ncronos)
Pueden traba2ar en modo latc7 o en
modo registro.
LUT Carr
LUT Carr
!R
CL
" C#
$
!R
CL
" C#
$
Virtex-II
104
Unidad (0sica de programacin* BRAM y
Multiplicador

-,A. <?@%< con1igurable


como:

.emoria de uno o dos


puertos

<=A%<+ ?A%:+ <A%<?+B

(onectada a la red
general a travCs de 6
matrices de cone%i!n.

.ultiplicador:

<? % <? bits

(omplemento a :.
105
Unidad (0sica de programacin* IOB
*0-
Admiten di1erentes tipos de seDales:
;i1erencial (dos pads
consecutivos)
&ingle5ended
4res partes:
"ntrada
&alida
(ontrol de salida (triestado)
(ada parte tiene dos biestables
con1igurables como latc7 o registro.
(ada pin o pad puede con1igurarse
como entrada+ salida o bidireccional
La impedancia (o resistencia) de
salida se puede controlar digitalmente.
(ada : o 6 pads tiene un matri# de
cone%i!n que los conecta al con2unto.
Permite trans1erencias al doble de
velocidad ;;,.
106
Unidad (0sica de programacin*
Interconexin
La ma)or>a de las seDales se env>an por la red de l>neas
7ori#ontales ) verticales a la que los di1erentes (L-+ *0-+ etc+
tienen acceso a travCs de la matri# de intercone%i!n programable.
107
Unidad (0sica de programacin*
Interconexin
Long lines
-idireccionales
:6 7ori#ontales por cada 1ila ) columna
Abarcan toda la FPGA
Ee% lines
Unidireccionales
<:F por cada 1ila ) columna.
(onectan un bloque con su tercero o se%to
;ouble lines
Unidireccionales
6F por cada 1ila ) columna
(onectan un bloque con su contiguo o al
siguiente.
;irect connect lines
(onectan un (L- con sus contiguos
(inclu)endo la diagonal ).
<= en total
Fast connect lines
*nternas al (L-+ salidas de las LU4s a las
entradas de otras LU4s
108
Unidad (0sica de programacin*
Programacin

Una FPGA puede estar en dos estados: G(on1iguraci!nH ) G0peraci!nH.


(uando la FPGA despierta despuCs del encendido+ se encuentra en modo
con1iguraci!n con todas sus salidas inactivas.
La con1iguraci!n requiere el env>o de un patr!n de bits con el mapa de
cone%iones internas por unos pines especiales que Csta posee (34AG o
Gserial s)nc7ronousH).
Una ve# con1igurada+ la FPGA pasa al modo operaci!n+ reali#ando la
1unci!n l!gica con la que se con1igur!.
Ea) varias 1ormas de con1igurar la FPGA:
;irectamente a travCs de un cable especial desde el P(.
Utili#ando una boot5P,0. en la placa donde est9 la FPGA ) que
contiene la in1oraci!n necesaria para que Csta se con1igure. La FPGA
puede leer autom9ticamente la P,0. tras su encendido.
109
%i(liogra3a . re3erencias
3nline: Verilog84QQR SuicM 9eference Huide by Stuart Sut<erland of
Sut<erland HDL( Inc!( .ortland( 3regon( 7S$ at
<ttp:)),,,!sut<erland8<dl!com)onlineTverilogTrefTguide)vlogTrefTtop!<tml
Verilog 'utorial: <ttp:)),,,!asic8,orld!com)verilog)veritut!<tml
Verilog HDL SuicM 9eference Huide 0Verilog85BB4 standard1
<ttp:))sut<erland8<dl!com)onlineTverilogTrefTguide)verilogT5BB4TrefTguide!pdf
Introduction to Verilog! .eter >yasulu! 79L:
<ttp:)),,,!csd!uoc!gr) U<y55B) 5BBQf) lectures) verilog8notes) VerilogIntroduction!pdf
/.H$ prototyping by verilog e*amples! .ong &<u! Viley 09ecurso8e de la
biblioteca de la 7S 1

Anda mungkin juga menyukai