Sunteți pe pagina 1din 57

Tema 3

HDL
Lenguajes de descripcin de
h d
hardware
Verilog
Contenidos del tema

Proceso de diseo digital


g mediante HDL:
descripcin, simulacin y sntesis.
Descripcin usando Verilog:
Niveles y metodologa de descripcin.
Normas del lenguaje y tipos de datos
datos.
Descripcin de circuitos combinacionales. Ejemplos.
Descripcin de circuitos secuenciales.
secuenciales Ejemplos.
Ejemplos
Descripcin Verilog de un ejemplo de sistema
digital.
digital
Unidad de datos y de control.

2
Proceso de diseo digital mediante HDL

HDL: Hardware Description Languages


Lenguaje formal para diseo digital
Los dos
d estndares
d son:
VHDL
Verilog
Bibliografa y referencias:
Verilog-1995 Quick Reference Guide by Stuart Sutherland of Sutherland HDL, Inc., Portland, Oregon, USA

http://www.sutherland-hdl.com/online_verilog_ref_guide/vlog_ref_top.html

Verilog Tutorial: http://www asic world com/verilog/veritut html


http://www.asic-world.com/verilog/veritut.html

Verilog HDL Quick Reference Guide (Verilog-2001 standard)

http://sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf

3
Proceso de diseo digital mediante HDL

Proceso de diseo mediante HDL:

Simulacin Descripcin Sntesis


Generador Ell circuito se describe
d b Compilacin Generador de

de vectores en macros

de test Verilog Librera de


p
componentes

Optimizacin
Netlists

Monitor
Mapeo

Implementacin
FPGA ASIC PAL

4
Contenidos del tema
Proceso de diseo digital
g mediante HDL:
descripcin, simulacin y sntesis.
Descripcin usando Verilog.
Niveles y metodologa de descripcin.
Normas del lenguaje y tipos de datos
datos.
Descripcin de circuitos combinacionales. Ejemplos.
Descripcin de circuitos secuenciales.
secuenciales Ejemplos.
Ejemplos
Descripcin Verilog de un ejemplo de sistema
digital.
digital
Unidad de datos y de control.

5
Niveles de descripcin digital en Verilog

Algorithm Level
Lenguaje de
procedimientos
(behavior)
RT Level

Gate Level Lenguaje


estructural

Switch Level

6
Metodologas de diseo

Algorithm Level

RT Level
Metodologa Metodologa
d l

Top-Down Bottom-Up

G t Level
Gate L l

Switch Level

7
Module: Bloque bsico en Verilog
Diseo Verilog: Varios bloques interconectados
Estructura general de bloque: module
module nombre(listapuertos);
Puertos: Entradas y salidas
Declaraciones: puertos;
tipo de datos; S d
Se declaran
l las propiedades de
las seales y de las variables
//Comentario (hasta fin de lnea)
/*Comentario hasta que se encuentre
los siguientes caracteres*/

Tareas, operaciones, funciones;


Especificacin del mdulo:
end module Funcional
Estructural
Procedimental No olvidar ;

8
Ejemplo: Votador
a
Votador o circuito Mayora: b z
c
Funcin: z = ab + ac + bc
Procedimiento: z=1 si {a y (b o c) son 1}; tambin si (b y c) son 1
Estructura: Expresin sp 3 puertas AND y 1 OR
module votador (input a, b, c, output Funcional
z);
assign z = (a&b)|(a&c)|(b&c);
endmodule
module votador (input a, b, c, output reg
z);
always @ (a,b,c); Estructural
if (a==1)
( 1)
module votador (input a, b, c, output
if (b==1||c==1)
z);
z=1;
wire out1, out2, out3;
else z=0;
and and1 (out1, a, b);
else
and and2 (out2, a, c);
Procedimental if (b==1&&c==1)
and and3 (out3, b, c);
z=1;
or or1(z, out1, out2, out3);
else z=0;
endmodule
endmodule

9
Normas del lenguaje 1
Identificadores: Empiezan con letra <= 1024 caracteres. Ej. r2d2
Distinguen maysculas y minsculas. Ej r2d2 r2D2
minsculas Ej.
Permiten arrays: . Ej. r2d[2]
Hay palabras reservadas. Ej. assign

V l
Valores lgicos:
l i 0,
0 1,
1 z/Z
/Z (alta impedancia) , x/X
/X (desconocido)
Nmeros enteros: TBV Ej. 12ha14 es 1010 0001 0100
T: Tamao en nmero de bits; por defecto 32
B: Base binaria b/B, octal o/O; hexadecimal h/H; decimal d/D (por defecto)
V: Valor en dgitos de la base; z/Z; desconocido x/X; ?; _
Si no coinciden el Tam y el Valor:
T<V:
T<V se truncan
t MSB sobrantes.
b t Ej 10ha14
Ej. 10h 14 es 10 0001 0100
T>V: se expande 0 o Z o X si es el MSB.
Ej. 80 es 0000 0000; Ej. 4bx es xxxx. Ej. 6hf es 00 1111

Nmeros negativos: -TBV. Se almacenan en Ca2.

Nmeros con signo (Ca2): signed b/B/oO/h/H/d/D o sb/sB/sd/sD

10
Normas del lenguaje 2
Puertos:
Entrada: input. Salida: output. Entrada/Salida: inout
Ti
Tipos principales
i i l de d datos:
d t
Nets: representan conexiones. Ms comn: wire
Los valores en wire se propagan instantneamente, sin memoria.
Registers: representan elementos de memoria. Ms comn: reg
El ltimo valor en reg se guarda hasta nueva asignacin
Parmetros: representan constantes. Usan parameter
Dimensin: escalares (1 bit) o vectoriales [MSB,LSB]

11
Normas del lenguaje 3
Sintaxis: TipoDato [MSB:LSB] nombre1,
nombre1 nombre2,;
nombre2 ;
Ejemplo:
wire ba, bb, bc;
De tipo wire,
wire wire [7:0] vw1, vw2;
tres bits (ba, bb y bc), reg [31:16] vra;
parameter [2:0] cte1=3b011,
dos vectores (vw1 y vw2) de 8 bits cte2=3b101;

de tipo reg otro vector (vr) de los16 bits
ms significativos entre 32
De tipo parameter , dos constantes cuyo valor decimal es: cte1 = 3 y cte2 = 5.

Arrays: tipo [rango] nombre [matriz], ;



wire matriz1 [15:0] [1023:0]; // Es de 1kx16 bits
reg [7,0]
[7 0] matriz2 [255:0]; // Es de 256x8 bits
integer matriz3 [3:0]; /* Integer es otro tipo de datos (pertenece a la categora de
reg) que por defecto es de 32 bits. Por tanto, matriz3 tiene 32x4 bits*/

12
Normas del lenguaje 4
Tipos de puertos: Se pueden especificar en el cuerpo del mdulo o en la
propia declaracin del mdulo, en cuyo caso por defecto es wire.
en
module
d l circ
i (input
(i en, input
i [3:0]
[3 0] a, b,
b output reg
[2:0] z); a3:a0

module circ (en, a, b, z); circ z2:z0
input en;
input [3:0] a, b; b3:b0
output reg [2:0] z;

Los puertos de un bloque pueden ser:


entrada: wire
salida: wire/reg
inout: wire

13
Descripcin estructural
Basada en interconectar mdulos previamente
definidos: primitivas, bloques diseados, macroceldas y
bloques IP.
Conforma la jerarqua del sistema y facilita los diseos
(tanto en la metodologa
g bottom-up como top-down).
Se dice que se instancia el bloque a usar. Para las
conexiones internas se usan variables tipo
p wire.
Principales primitivas a nivel de puertas:
and, or, xor, buf, nand, nor, xnor, not
Sintaxis de esas primitivas:
nombre ((salida,, entrada1,, entrada2,)
, )
14
Descripcin estructural: Nivel de puertas
a b

Ejemplo: FA o sumador completo.


completo
Suma a, b y cin, generando s y cout:
cout FA cin

xor1
xor2
a =1 cab1 s
=1
b s module fulladder (input a, b, cin, output s, cout);
cin
and1 wire cab1, cab2, cab3, cab4;
a & cab2
b xor xor1(cab1, a, b);
or1 xor xor2(s, cab1, cin);
a & cab3 >1
cout and and1(cab2, a, b);
cin and2 and and2(cab3, a, cin);
and and3(cab4, b, cin);
b & cab4
cin or or1(cout, cab2, cab3, cab4);
and3 endmodule

15
Descripcin estructural: instancia a un bloque

Sea un bloque ya definido como, p.ej., FA anterior

El bloque se instancia exactamente con el mismo nombre en que


fue definido y se le asocia un nombre concreto en el uso actual:
bloque_instanciado nombre_uso_actual (lista de referencias e/s)

Las entradas y salidas e/s se pueden referenciar:


Posicional
P i i l o intrnseca:
i t ell orden
d original
i i l de
d e/s
/ se mantiene
ti igual:
i l
fulladder FAK(ak, bk, cki, sk, cko);
Nombrada o extrnseca: el orden e/s puede variarse pues se indican
por referencia, .nombre_original(nombre_instancia_actual)
fulladder FAK(.a(ak), .cout(cko), .b(bk), .c(cki), .s(sk));

16
Ejemplo: Sumador paralelo de 4 bits
a3 a2 a1 a0 b3 b2 b1 b0

cout4 Sumador 4 bits cin

s3 s2 s1 s0

a3 b3 a2 b2 a1 b1 a0 b0

cout3 cout2 cout1


cout4 FA3 FA2 FA1 FA0 cin

s3 s2 s1 s0

17
Sumador 4 bits 1: Conexin posicional
a3 b3 a2 b2 a1 b1 a0 b0

cout4 cout3 cout2 cout1


FA3 FA2 FA1 FA0 cin
module fulladder4(
input [3:0] a,
input [3:0] b,
s3 s2 s1
input cin, s0
output [3:0] s,
output cout4);

wire cout1,cout2,cout3;

fulladder fa0 (a[0], b[0], cin, s[0], cout1);


fulladder fa1 (a[1], b[1], cout1, s[1], cout2);
fulladder fa2 (a[2], b[2], cout2, s[2], cout3);
fulladder fa3 (a[3], b[3], cout3, s[3], cout4);

endmodule

18
Sumador 4 bits 2: Conexin nombrada
a3 b3 a2 b2 a1 b1 a0 b0

cout4 cout3 cout2 cout1


FA3 FA2 FA1 FA0 cin

module fulladder4(
input [3:0] a, s3 s2 s1 s0
input [3:0] b,
p
input cin,
,
output [3:0] s,
output cout4);

wire cout1,cout2,cout3;

fulladder fa0 (.a(a[0]), .b(b[0]), .cin(cin), .s(s[0]), .cout(cout1));


fulladder fa1 (.a(a[1]), .b(b[1]), .cin(cout1), .s(s[1]), .cout(cout2));
fulladder fa2 (.a(a[2]), .b(b[2]), .cin(cout2), .s(s[2]), .cout(cout3));
fulladder fa3 (.a(a[3]),
( ( [ ]), .b(b[3]),
( [ ]), .cin(cout3),
( ), .s(s[3]),
( [ ]), .cout(cout4));
( ));

endmodule

19
Normas del lenguaje 5: Operadores
Tipos de operadores 1:
Bitwise: Operacin(Dato1(n-1):0, Dato2(n-1):0) = Res(n-1):0
Ejemplo: (& es AND) (0011)&(0101) = (0001)
Reduccin unaria: Operacin(Dato1(n-1):0) = Bit
Ejemplos: (& es AND) &(0111) = 0 ; &(1111) = 1
Lgicos: Operacin(Bit1, Bit2) = Bit
Ejemplos: (& es AND) 0&&1 = 0 ; 1&&1 = 1
Relacionales y de identidad: Compara(Dato1, Dato2) Bit
Ejemplos: (Igualdad) (0001) == (0000) 0 (False)
(Igualdad) (0001) == (000x) 1 (True)
(Identidad) (0001) === (000x) 0 (False)

20
Normas del lenguaje 6: Operadores
Tipos de operadores 2:
Aritmticos: Operacin(Dato1(n-1):0, Dato2(n-1):0) = Res(n-1):0
Ejemplo: (+ es suma) (0011) + (0010) = (0101)
Miscelnea:
Condicional (? :): sel ? Valor_si_sel=1
Valor si sel=1 : Valor_si_sel=0
Valor si sel=0
Similar al MUX(2:1) o al control ifthenelse
Ejemplo: assign z = x ? c1:c0; //z es salida MUX(2:1) con canales c0 y c1 y seleccin x
Concatenar ({ }):
}) concatena variables
ariables formando un n vector
ector ms grande
Ejemplo, si vec4 es de 4 bits, vec2 de 2 bits y vbit es de 1 bit:
{vec4, vec2, vbit} es un vector de 7 bits (4+2+1)

Permite repetir({ k{} }):


{vec4, 5{vec2, vbit}} es un vector de 19 bits (4+5(2+1))

21
Normas del lenguaje 7: Lista de operadores 1

22
Normas del lenguaje 8: Lista de operadores 2

23
Normas del lenguaje 9: Lista de operadores 3

Prelacin de operadores: Mayor menor precedencia:

Unarios {} () ** [*,/,
[ %]] [+,-
[ b ] [<<,
binarias] [ >>, <<<, >>>]]
[<,<=, >,>=] [==,!=, ===,!==] [&,~&] [^,~^] [|,~|] && ||
?:

24
Normas del lenguaje 10: assign y always

Asignacin de valores a las variables:


Continua: assign [#retraso] nombre_variable = expresin ;
Se aplica
p a wire
Se usa para las funciones combinacionales (alternativa a puertas&cables)

Procedimental: Hay varias, aqu se usar always (ver ms adelante)


Se aplica a reg
Hay dos subtipos de asignacin: bloqueante y no-bloqueante (ver adelante)

C
Concurrencia:
i Todas
T d las
l asignaciones
i i i
(assign
( y always
l ) que h
haya en un
bloque se aplican concurrentemente (= todas a la vez).

25
Concurrencia: ejemplo con assign
Las tres formas siguientes asignan el mismo valor a f:
f :

module
d l ejemploconc
j l ( module
d l ejemploconc
j l ( module
d l ejemploconc
j l (
input x, y, z, input x, y, z, input x, y, z,
output f); output f); output f);

assign f=x&y& wire g; wire g;


z;
assign g=x&y; assign f=g&z;
endmodule assign f=g&z; assign g=x&y;

endmodule endmodule

Resumen sobre assign:


assign wire
Cada evento causa que se actualice la funcin
Los valores se actualizan concurrentemente

26
MUX mediante asignacin continua
Cada suceso de entrada actualiza el valor asignado
asignado.
Descripcin de MUX usando operador condicional:

module
d l mux4 (input
i c0,c1,c2,c3,s1,s0, c0
output z, zcom); c1 z
assign z = s1 ? (s0 ? c3 : c2) : (s0 ? c1 : c0) ; c2 zcom
assign zcom = ~z;
c3
endmodule

s1 s0
Otra posibilidad es mediante la expresin sp de z:
module mux4 (input c0,c1,c2,c3,s1,s0,
output z, zcom);

assign z = (s1&s0&c3) | (s1 & ~s0&c2) | (~s1 &s0&c1) | (~s1 & ~ s0&c3); //Parntesis eliminables
assign zcom = ~z;

endmodule

27
Descripcin procedimental: Sentencia always

always es un bloque procedimental (otro es initial).


always

Asigna valores a seales tipo reg. El valor asignado se mantiene


h
hasta que hay
h una nueva reasignacin de
d valor.
l
Segn los casos, en sntesis puede dar lugar a circuitos
combinacionales o a secuenciales.
secuenciales

Cada sentencia always


y tiene su lista de sensibilidad:
always @ (lista de sensibilidad)
Consiste en una lista de seales.
Se ejecuta always si y solo hay evento en la lista de seales.

28
Ejemplos de listas de sensibilidad
always @ (a or b) o bien@
bien @ (a,
(a b)
Se ejecuta si hay un cambio en a, en b o en ambas

always @ * o bien@ (*)


Se ejecuta
j si cambia cualquier
q entrada del bloque.
q
Esta forma es la que se debe utilizar siempre que se describa un
circuito combinacional con always.

always @ (posedge a, negedge b)


S ejecuta
Se j sii hay
h un cambio
bi de
d subida
bid en a
o de
d bajada
b j d en b.
b

29
Ms tipos de sentencias
Para agrupar
g p 2 o ms sentencias: Para mltiples
p casos:
begin case (variable)
valor1: sentencia1;
end valor2: sentencia2;

valork: sentenciak;
Para bifurcacin condicional: [ default: sentencia; ]
if (condicin lgica/relacional)
sentencia si true;
else Conviene usar default para incluir
sentencia si false; todos los casos restantes
todos restantes

Pueden anidarse varios if: Hayy ms sentencias (consultar


if () ; referencias de Verilog): for, while,
else if () ; repeat, wait, fork-join, etc.
else ;

30
Uso de begin
begin-end
end
Para poner ms de una sentencia (en if,
if en cada valor
de case,) siempre hay que usar begin-end.

always @(a)
always @(a)
if ( a > 0 )
if ( a > 0 ) begin
f1 = 1; f1 = 1;
f2 = 1; ERROR Correcto
f2 = 1;
else end
f1 = 0; else
f1 = 0;

31
Asignacin de valores en always
Bloqueante: vreg = valor No bloqueante: vreg <
<= valor
En general se usan para Modela operacin en registros (es
asignaciones combinacionales similar a del lenguaje RT).
(
(parecido
id all =
del
d l lenguaje
l j RT),
RT)
aunque no siempre es as.
Se aplican
p secuencialmente, p
por lo Se aplican concurrentemente, por
que importa el orden. lo que no importa el orden.
El proceso de asignacin de valores es: Se calcula el El proceso de asignacin de valores es: Se calcula el
valor de la primera vreg y se le asigna. Despus, se valor de todas las vreg. Despus, se asignan todos los
calcula el valor de la segunda vreg (en su caso, se usa valores calculados a todas las vreg a la vez..
ell valor
l actualizado
t li d de d la
l primera
i vreg)) y se le
l asigna.
i
Y as con todas.

La sntesis puede conducir o no al La sntesis conduce al uso de


uso de biestables. biestables.

32
Ejemplo: Bloqueante frente a No
No-bloqueante
bloqueante

module bloqueante (input a,clk, output reg zb); module nobloqueante (input a,clk, output reg znb);
reg q; reg q;
always @ (posedge clk) always @ (posedge clk)
begin begin
q = a; q <= a;
zb = q; znb <= q;
end
d endd
endmodule endmodule

clk
a
q
zb
znb

q q
a D q a D q D q znb
zb
clk clk
33
Sobre parameter 1

Para las constantes en ejecucin


j se usa p
parameter
Se puede declarar en el cuerpo del mdulo o en la propia definicin del
mdulo:
En el cuerpo: parameter nom1=valor1, nom2=valor2, ;
En el mdulo: module nombre #(parameter nom1=valor1,) ();

Ej
Ejemplo
l de
d sumador
d ded N bits,
bit para N=6:
N 6

// Definicin de parmetro en el cuerpo del mdulo


module sumador ((inputp [N-1:0]
[ ] a,, b,, input
p cin,, output
p [N-1:0]
[ ] s,, output
p
cout);
parameter N =6;
reg [N:0] res; // Definicin de parmetro en la definicin del mdulo
always @(a,b,cin) module sumador #(parameter N =6) (input [N-1:0] a, b, input
res=a+b+cin; cin,
assign cout = res[N]; output [N-1:0] s, output
assign s = res[N-1:0]; cout);
endmodule //El resto sigue igual al caso anterior)
reg [N:0] res;

endmodule

34
Sobre parameter 2

Se p
puede modificar el valor de los p
parmetros declarados en el mdulo
cuando se instancie ese mdulo desde otra descripcin. Se puede usar
conexin posicional o posicin nombrada.
Ejemplo para usar el sumador de N bits anterior en uno de 12 bits
bits, compuesto
por uno (LSB) de 8 y otro (MSB) de 4 bits:

// Redimensionamiento del parmetro N N por conexin nombrada


module otrocaso ;
sumador #(.N(8)) suma8 (.a(a[7:0]),.b(b[7:0]),.cin(cin),.s(s[7:0]),.cout(cable1));
sumador #(.N(4)) suma4
(.a(a[11:8]),.b(b[11:8]),.cin(cable1),.s(s[11:8]),.cout(cout));

endmodule

// Redimensionamiento del parmetro N por conexin posicional


module otrocaso ;
sumador
d #(8) suma8
8 (a[7:0],
( [7 0] b[7:0],
b[7 0] cin,
i s[7:0],
[7 0] cable1);
bl 1)
sumador #(4) suma4 (a[11:8], b[11:8], cable1, s[11:8], cout);

endmodule

35
Ejemplo combinacional: Otra vez MUX
Descripcin
p de MUX usando vectores,, always
y yy:
sentencia case: c0
c1 z
c2 zcom
c3
module mux4 (input [3:0] c, input [1:0] s,
output reg z, output zcom);
//z se declara reg pues se asigna en always; zcom es wire
always @ *
case (s)
s1
1 s0
0
2h0: z = c[0];
2h1: z = c[1];
2h2: z = c[2];
default: z = c[3];
[ ];
endcase
assign zcom = ~z;
endmodule

36
Ejemplo combinacional: Comparador

a3:a0
compa- g (a>b)
rador e (a=b)
l (a<b)
b3:b0

module comparador (input [3:0] a, b,


output reg g, e, l);
//g e y l se declaran reg pues se asigna en always;
//g,
always @ *
begin
g = 0; //g, e y l se inicializan a 0 porque guardan el valor ltimo asignado
e = 0;
l = 0;
0
if (a >b )
g = 1;
else if (a < b)
l = 1;
else
e = 1;
end
endmodule

37
Ejemplos secuenciales: Biestables D

q q
d D q d D q

clk clk

//petdff: positive edge triggered d flip- //netdff: negative edge triggered d flip-
flop flop
module petdff (input d, clk, module netdff (input d, clk,
output reg q); output reg q);
always @ (posedge clk) always @ (negedge clk)
q <= d; q <= d;
endmodule endmodule

38
Ejemplos secuenciales: CLA y CLS

cla cls

q q
d D q d D q

clk clk
//petdff con reset asncrono cla //petdff con reset sncrono cls
module petdff (input d, clk, cla, module petdff (input d, clk, cls,
output reg q); output reg q);
always @ (posedge clk or posedge cla) always @ (posedge clk)
if (reset)
( t) if (reset)
( t)
q <= 1b0; q <= 1b0;
else Principal diferencia else
q <= d; q <= d;
endmodule endmodule

39
Ejemplos secuenciales: Biestables
Ejercicio:
Describa en Verilog los cuatro tipos de biestables (D, T, RS y JK).
Los biestables
L bi t bl tienen
ti seales
l ded clear
l y presett activas
ti en baja
b j y son
disparados por el flanco positivo de reloj (nCL, nPR y CLK).

40
CSS desde FSM (Finite State Machine)
La descripcin Verilog objetivo es la de una FSM con:
Reset asncrono (reset: S 0) Ejemplo
Punto d
P de partida:
id 0/0 1/0
grafo o tabla de estados/salidas. 1/0
A B
Partes de la descripcin FSM:
1/1
Definicin y asignacin de estados 0/0 1/0 0/0
Se usar parameter. 0/0
D C
Declaracin de variables estado, q y Q
Sern tipo reg y tantas como las usadas en
la asignacin.
Proceso de cambio de estado: q Q . Siempre es el mismo proceso
Clculo de funciones de prximo estado y salida. Depende del caso FSM.

41
Plantilla de descripcin de FSM
module nombre(
input LISTA_DE_ENTRADAS, //Incluir reset y reloj
output reg LISTA_DE_SALIDAS);

// DEFINICION Y ASIGNACIN DE ESTADOS


parameter LISTA_DE_ESTADOS

// VARIABLES PARA ALMACENAR EL ESTADO PRESENTE Y SIGUIENTE


reg [N-1:0] current_state, next_state;

// PROCESO DE CAMBIO DE ESTADO


always @(posedge clk or posedge reset)
if (reset) current_state <= estado_inicial ; //El estado_inicial tiene que estar declarado
else
l current_state <= next_state;

// PROCESO SIGUIENTE ESTADO Y SALIDA


always @(current_state, LISTA_DE_ENTRADAS)
....... //Aqu
//A se sigue
i ell grafo
f o tabla
bl de
d la
l mquina
i de d estados
d

endmodule

42
Descripcin del ejemplo de FSM - 1
module ejemplo (input x, clk, reset, reset Ejemplo
output
t t reg z);) 0/0 1/0
x
// Definimos y asignamos los estados (A:00,D:11) 1/0 z
parameter a = 2b00; A B
b = 2b01;
2b01 1/1
c = 2b10; clk 0/0 1/0 0/0

d = 2b11; 0/0
D C
// V
Variables
i bl ded estado,
t d en este t caso hay
h 2
reg [1:0] current_state, next_state;

// PROCESO DE CAMBIO DE ESTADO


always
l @(
@(posedge
d clk
lk or posedge
d reset)
t)
if (reset)
current_state <= a ; //El estado de reset ser A
else
current_state
t t t <=< next_state;
t t t

// SIGUE para describir el las funciones de prximo estado y salida

43
Descripcin del ejemplo de FSM - 2
/* Viene de la anterior. Ahora se describen las funciones de
prximo estado y de salida */ Ejemplo
always
l @ (current_state,
( t t t x)) 0/0 1/0
begin
next_state = a; // Inicializacin conveniente para simular 1/0
z = 0; // Conviene para no repetir z=0 en lo que sigue A B
case (current_state)
( t t t ) 1/1
0/0 1/0 0/0
a: if (x==1) next_state=b;
else next_state=a; 0/0
b: if (x==1) next_state=b; D C
else
l next_state=c;
t t t
c: if (x==1) next_state=b;
else next_state=d;
d: if (x==1)
begin
next_state=b;
z=1;
end
else next_state=a;
next state=a;
endcase
end
endmodule

44
Ejemplos secuenciales: registro - 1

45
Ejemplos secuenciales: registro - 2

46
Ejemplos secuenciales: contador - 1

47
Ejemplos secuenciales: contador - 2

48
Contenidos del tema
Proceso de diseo digital
g mediante HDL:
descripcin, simulacin y sntesis.
Descripcin usando Verilog.
Niveles y metodologa de descripcin.
Normas del lenguaje y tipos de datos
datos.
Descripcin de circuitos combinacionales. Ejemplos.
Descripcin de circuitos secuenciales
secuenciales. Ejemplos
Ejemplos.
Descripcin Verilog de un ejemplo de sistema
digital.
digital
Unidad de datos y de control.

49
Calculadora Unidad de Datos
Calculadora.

IN
Diseo Bottom-
Up: RT
OUT
W WRT

1. Registros
Ra
IA IB DAT A R
W Wa 1 1 RT
1.1
P1 C1 Rb
P0 C0 DAT B R
W Wb 1.2 AC
1.3 A / B
OUT
2. ALU
WAC IN 3. Unidad de
RAC W
AC
R
OUT Datos

50
Calculadora Unidad de Datos 1
Calculadora.
//declaracin del tipo mdulo correspondiente a RT

module type1 #(parameter width=8,


width=8 initial_value=0)
initial value=0)
(input wire W, ck, input wire [width-1:0] IN, output reg [width-1:0] OUT=initial_value);
always@(posedge ck)
if(W) W RT OUT=
OUT<=IN; IN
endmodule RT OUT W
0 RT [RT]
1 IN [RT]

//declaracin del tipo mdulo correspondiente a AC


//(instanciaremos a un mdulo type1 y aadiremos lectura condicional)

module type2 #(parameter width=8, initial_value=0)


(input wire W, R, ck, input wire [width-1:0] IN, output wire [width-1:0] OUT);
wire [width-1:0]
[width 1:0] internal_bus;
internal bus;
type1 #(width,initial_value) internal_reg(W, ck, IN, internal_bus);
assign OUT = R ? internal_bus : 'bz;
endmodule
Internal WR AC OUT=
REG IN
OUT W
W IN 00 AC HI
R OUT AC internal bus 01 AC [AC]
R 10 IN HI
11 IN [AC]
51
Calculadora. Unidad de Datos 2
//declaracin del tipo
p mdulo correspondiente
p a RA y RB, (instanciamos al mdulo type2)
yp

module type3 #(parameter width=8, initial_value=0) R


(input wire W, R, ck, inout wire [width-1:0] DAT); DAT X W
type2 #(width,initial_value) internal_register(W,R,ck,DAT,DAT);
endmodule RW X DAT=
00 X HI
01 DAT DAT
10 X [X]
//declaracin del tipo mdulo correspondiente a la ALU 11 Proh Proh
module ALU_type #(parameter width=8)
(input wire C1, C0, input wire [width-1:0] IA,IB, output reg [width-1:0] OUT);
always@(*)
case({C1,C0})
({C1 C0})
2'b00: OUT=IA+IB; C1 C0 OUT=
2'b01: OUT=IA;
2'b10: OUT=IA-IB; IA IB 00 IA + IB
2'b11: OUT=IB; C 1
endcase C0 01 IA
endmodule OUT 10 IA IB
11 IB

52
Calculadora. Unidad de Datos 3
//declaracin de la unidad de p
procesado de datos

module unidad_datos #(parameter width=8, initial_A=0, initial_B=1)


(input wire ck,WAC,RAC,WRT,Ra,Rb,Wa,Wb,P0,P1);

wire [width
[width-1:0]
1:0] common_bus,
common bus, ALU_out,
ALU out, RT_out;
RT out;
type1 #(.width(width)) RT(WRT,ck,common_bus,RT_out);
type2 #(.width(width)) AC(WAC,RAC,ck,ALU_out,common_bus);
type3 #(.width(width),.initial_value(initial_A)) A(Wa,Ra,ck,common_bus);
type3 #(.width(width),.initial_value(initial_B)) B(Wb,Rb,ck,common_bus);
ALU type #(width) ALU(P1,P0,common_bus,RT_out,ALU_out);
ALU_type ALU(P1 P0 common bus RT out ALU out);
endmodule

type1 IN
type3
RT W WRT
Se han utilizado instancias de los OUT
modulos definidos anteriormente:
type1, type2, type3 y alu_type RT_out
Ra
IA IB DAT A R
W Wa
Se han nombrado los buses P1 C1 Rb
internos de la unidad: P0 C0 ALU_type DAT B R
W Wb
RT_out, ALU_out y common_bus
OUT
ALU_out
WAC
W
IN type2 common_bus
RAC AC
R OUT
53
Calculadora Unidad de Control 1
Calculadora.
Realizacin con la estructura general de FSM
module
d l carta_asm1(
t 1( iinputt LISTA_DE_ENTRADAS,
LISTA DE ENTRADAS
output reg LISTA_DE_SALIDAS);

parameter LISTA_DE_ESTADOS; // Aqu se definen los estados Sj y el valor binario


asignado a cada uno

reg [N:0] current_state, next_state; // Aqu se definen las variables de estado prsente y
prximo

// A continuacin se define el proceso de cambiar el estado en biestables y ocurre en el flanco


activo de reloj
always @(posedge clk or posedge reset)
// Aqu normalmente ser q<= Q, pero tambin se incluirn casos diferentes, p. ej. si hay
reset (q<=Sinicial)

// A continuacin se describen las funciones de prximo estado y de salida


always @(current_state, LISTA_DE_ENTRADAS)
//Aqu se refleja lo descrito en la carta ASM
//El proceso normal es tipo CASE y tiene que contener a TODOS LOS ESTADOS de la carta
ASM
//Antes de CASE conviene establecer por defecto todas las salidas a 0

endmodule
d d l

54
S0
Unidad de Control 2
0 Xs
module carta_asm1( 1
input clk, XS, I0, I1, reset,
output reg RAC, Rb, Ra, WRT, WAC, Wa, Wb, P1, P0, FIN S1 WRT,Rb
);
parameter
t S0 = 3'b000,
3'b000 S2 WAC ,Ra
S1 = 3'b001, Asignacin
S2 = 3'b010,
S3 = 3'b011, de estados 0 1
SF = 3'b100; I1
P1
reg [2:0] current_state,next_state;

always @(posedge clk or posedge reset)


S3 RAC
if(reset)
current_state <= S0; Proceso 0 1
else
siguiente I0
current_state <= next_state;
estado Wa Wb

SIGUE ->
SF FIN

55
U id d de
Unidad d Control
C l3 S0

0 Xs
1
always @(current_state,I0,I1,Xs) S1
begin WRT,Rb
RAC = 0;
RA = 0; S2 WAC ,Ra
Rb = 0;
P0 = 0;
Valor por defecto de las salidas
P1 = 0; establecido a cero 0
I1 1
WRT = 0;;
Wa = 0; P1
Wb = 0;
FIN = 0;
next_state = S0;
case(current state)
case(current_state) S3 RAC
S0: E
Estado
d S0
if(XS) next_state = S1; 0 1
S1: I0
begin
WRT = 1;
Wa Wb
Rb = 1;
next_state = S2;
Estado S1
SF FIN
end

56
U id d de
Unidad d Control
C l4 S0

0 Xs
S2:
begin
1
WAC = 1; Estado S2 S1 WRT,Rb
Ra = 1;
if(I1)
P1 = 1; S2 WAC ,Ra
next_state = S3;
end 0 1
S3: I1
begin
RAC = 1; P1
if(I0)
Estado S3
Wa = 1;
else S3 RAC
Wb b = 1;
next_state = SF;
end 0 1
I0
SF: Estado SF
FIN = 1; Wa Wb
endcase
end
endmodule SF FIN

57

S-ar putea să vă placă și