Академический Документы
Профессиональный Документы
Культура Документы
1. NDICE GENERAL
ndice general
2. INTRODUCCIN
2.1 Objetivos del proyecto ............................................................................................................... 7
2.2 Aspectos bsicos ......................................................................................................................... 7
2.2.1 Aritmtica decimal.............................................................................................................. 7
2.2.2 Cdigo decimal codificado en binario (BCD) .................................................................... 8
2.2.3 Dispositivos programables.................................................................................................. 8
2.3 Diseo de Sistemas Electrnicos ............................................................................................... 9
2.3.1 Tendencias generales en Diseo Electrnico...................................................................... 9
2.3.2 Lenguajes de descripcin del hardware .............................................................................. 9
2.3.2.1 Qu son los lenguajes de descripcin del hardware?............................................. 9
2.3.2.2 El lenguaje VHDL ................................................................................................... 10
2.3.2.2.1 Introduccin al lenguaje VHDL .................................................................... 10
2.3.2.2.2 Caractersticas............................................................................................... 10
2.3.2.2.3 Niveles de descripcin ................................................................................... 11
2.3.2.2.4 Estructura de una descripcin....................................................................... 11
2.3.2.2.5 Metodologa de diseo................................................................................... 12
2.3.3 Dispositivos lgicos programables ................................................................................... 13
2.3.4 Componentes IP (IP cores)............................................................................................... 15
2.3.5 Prototipado rpido ............................................................................................................ 16
2.4 Spartan-3E Starter Kit Board ................................................................................................... 16
3. MEMORIA DESCRIPTIVA
3.1 La Unidad Aritmtica Decimal ............................................................................................... 20
3.2 Bloques de la unidad ................................................................................................................ 21
3.2.1 Sumador/Restador............................................................................................................. 21
3.2.1.1 Sumador .................................................................................................................. 21
3.2.1.1.1 Sumador de 1 dgito BCD (bloque one_digit_adder.vhd)......................... 21
3.2.1.1.2 Sumador de n dgitos decimales .................................................................... 24
3.2.1.2 Restador............................................................................................................... 26
3.2.1.2.1 Clculo del complemento a 9 (bloque nine_complement.vhd).................. 27
3.2.1.2.2 Sumador/Restador en complemento a 10n ..................................................... 28
3.2.1.3 Sumador/Restador, representacin con signo y magnitud (bloque
n_adder_subs.vhd).......................................................................................................... 29
3.2.2 Multiplicador.. .......................................................................................................... 32
3.2.2.1 Multiplicador de 1x1 dgitos BCD (bloque one_digit_multiplier.vhd)................ 32
3.2.2.2 Multiplicador de Nx1 dgitos BCD (bloquen_by_one_multiplier.vhd)............... 34
3.2.2.3 Multiplicador de NxM dgitos BCD (bloquen_by_m_multiplier.vhd) ................ 37
3.2.3 Divisor .............................................................................................................................. 41
3.2.3.1 Algoritmo de divisin binaria ................................................................................. 41
3.2.3.2 Algoritmo de divisin BCD ..................................................................................... 42
3.2.3.3 Error generado........................................................................................................ 42
3.2.3.4 Divisor BCD (bloque divider.vhd)...................................................................... 43
3.3 Diseo de la Unidad Aritmtica Decimal ............................................................................... 48
-3-
ndice general
4. MEMORIA EXPERIMENTAL
4.1 Descripcin del proceso ...........................................................................................................
4.2 Especificaciones ........................................................................................................................
4.3 Elementos necesarios................................................................................................................
4.4 Arquitectura a desarrollar ......................................................................................................
4.5 Mdulos IP de terceros utilizados...........................................................................................
4.5.1 Microcontrolador PicoBlaze (mdulo kcpsm.vhd)........................................................
4.5.2 Interfaz LCD (mdulo lcd_interface.vhd).....................................................................
4.6 Memoria de programa (mdulo program_memory.vhd) ...................................................
4.7 Generacin del circuito (mdulo main.vhd) .......................................................................
4.8 Asignacin de pines en la FPGA (archivo pins.ucf) ..........................................................
4.9 Implementacin en la FPGA ...................................................................................................
4.9.1 Generacin del archivo .....................................................................................................
4.9.2 Implementacin en la FPGA ............................................................................................
54
54
55
55
57
57
58
60
62
63
65
66
68
5. ANEXOS
5.1 Modelos VHDL.........................................................................................................................
5.1.1 Sumador de 1 dgito BCD (one_digit_adder.vhd)............................................................
5.1.2 Complemento a 9 (nine_complement.vhd) .......................................................................
5.1.3 Sumador/Restador de n dgitos decimales (n_adder_subs.vhd) .......................................
5.1.4 Multiplicador de 1x1 dgitos BCD (one_digit_multiplier.vhd) ........................................
5.1.5 Multiplicador de Nx1 dgitos BCD (n_by_one_multiplier.vhd) .......................................
5.1.6 Multiplicador de NxM dgitos BCD (n_by_m_multiplier.vhd).........................................
5.1.7 Divisor BCD (divider.vhd) ...............................................................................................
5.1.8 Unidad Aritmtica Decimal (arithmetic_unit.vhd) ...........................................................
5.1.9 Memoria de programa (program_memory.vhd) ...............................................................
5.1.10 Circuito completo (main.vhd) .........................................................................................
5.2 Programa en lenguaje ensamblador (decimal_unit.asm) ......................................................
5.3 Asignacin de pines en la Spartan-3E (pins.ucf) ....................................................................
72
72
73
73
75
76
78
80
83
86
89
94
97
6. BIBLIOGRAFA........................................................................................................................ 99
-4-
2. INTRODUCCIN
Introduccin
-6-
Introduccin
-7-
Introduccin
BCD
0
1
2
3
4
5
6
7
8
9
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
-8-
Introduccin
-9-
Introduccin
2.3.2.2.2 Caractersticas
VDHL es un lenguaje de descripcin hardware de mbito general derivado del lenguaje de
alto nivel ADA (que es el lenguaje para programar sistemas en tiempo real por excelencia).
Dispone de tipos abstractos para definir el formato y valores de seales, variables,
constantes, etc., y proporciona amplias facilidades para la realizacin de algoritmos.
Admite casi todos los niveles de descripcin, desde el algortmico (nivel ms alto) hasta el
lgico (nivel ms bajo). Para ello proporciona herramientas semnticas y sintcticas que se
pueden agrupar as:
- 10 -
Introduccin
- 11 -
Introduccin
Una vez finalizada la prueba del concepto, se pasa al diseo detallado. Dependiendo de la
herramienta de sntesis que se utilice y de las especificaciones del circuito, la descripcin
VHDL estar desarrollada en un nivel de abstraccin mayor o menor (desde un nivel
algortmico a uno lgico).
Por ltimo se aborda la sntesis del circuito, es decir, el paso de una descripcin en VHDL
a un circuito real. El proceso de diseo puede terminar antes si el objetivo final no es la
fabricacin sino, por ejemplo, la creacin de componentes de biblioteca para uso posterior.
- 12 -
Introduccin
Los PLDs estn basados en una matriz AND + OR. Dentro de los PLDs encontramos las
PROM (Programmable Read Only Memory), las PAL (Programmable Logic Array) y las
PAL (Programmable Array Logic).
Dentro de las PAL se encuentran los CPLDs (Complex PLD), compuestos por la
integracin de PLDs (PAL/GAL o PLA). Estn formados por bloques lgicos y matrices
de interruptores, donde cada bloque lgico corresponde a un PLD.
Figura 2.4. Ejemplo de arquitectura de CPLD (con 4 elementos lgicos o bloques programables)
- 13 -
Introduccin
Las FPGA estn compuestas por una matriz de elementos lgicos cuya interconexin y
funcionalidad se puede programar. En comparacin con los dispositivos CPLD, difieren en
la arquitectura, no utilizan matrices de tipo PAL/PLA y tienen unas densidades mucho
mayores que los anteriores. Una FPGA tpica tiene un nmero de puertas equivalentes
mucho mayor que un dispositivo CPLD tpico. Los elementos que implementan las
funciones lgicas en las FPGA son, generalmente, mucho ms pequeos que en los CPLD,
por lo que hay muchos ms de esos elementos. Asimismo, en las FPGA, las
interconexiones programables estn organizadas segn una disposicin de filas y
columnas.
Los tres elementos bsicos en una FPGA son el bloque configurable (CLB, Configurable
Logic Block), las interconexiones y los bloques de entrada/salida (E/S). Los bloques CLB
de una FPGA son menos complejos que sus homnimos en un CPLD, pero suele haber
muchos ms de ellos. La matriz distribuida de interconexiones programables permite
interconectar los bloques CLB entre s y conectarlos a las entradas y a las salidas. Los
bloques de E/S situados alrededor del permetro de las estructura proporcionan un acceso
de entrada/salida o bidireccional, individualmente seleccionable, hacia el mundo exterior.
Estructura de los bloques lgicos configurables
Cada bloque lgico de la FPGA est formado por mltiples mdulos lgicos ms pequeos
(que son los componentes bsicos) y por una serie de interconexiones programables locales
que se emplean para conectar entre s los mdulos lgicos que componen el CLB.
CLB
Mdulo lgico
Mdulo lgico
Interconexin
local
Mdulo lgico
- 14 -
Introduccin
A0
A1
Lgica
asociada
LUT
E/S
An-1
Mdulo lgico
Figura 2.7. Diagrama de bloques bsico de un mdulo lgico
Los dispositivos FPGA son reprogramables, y los de gran tamao pueden tener decenas de
miles de bloques CLB, adems de memoria y otros recursos. Por todo ello y la gran
flexibilidad que presentan, son ideales para realizar prototipos de manera rpida, en
pequeas cantidades.
- 15 -
Introduccin
- 16 -
Interfaces y conectores:
-
- 17 -
Introduccin
3. MEMORIA DESCRIPTIVA
Memoria descriptiva
- 19 -
Memoria descriptiva
Necesitaremos un sistema que dados dos valores de entrada de n dgitos BCD cada uno, x e
y, calcule el resultado z (de 2n dgitos BCD) de la operacin que hayamos escogido
previamente mediante la seal de entrada operation. Adems, contaremos con las seales
de entrada start (para iniciar el clculo interno cuando sea necesario), reset (reiniciar el
sistema), clk (seal de reloj) y las de salida carry (acarreo de salida cuando sea necesario)
y done (indicador de resultado disponible).
Para ello, la primera idea es que deberemos crear el modelo necesario para poder ejecutar
cada operacin.
Sumador
Restador
Multiplicador
Divisor
Por consiguiente, nos centraremos primero en el diseo de los mdulos primarios que
realizarn las diferentes operaciones y despus los integraremos en la unidad principal.
- 20 -
Memoria descriptiva
- 21 -
Memoria descriptiva
Tenemos dos entradas, a y b, que pueden representar cualquier dgito decimal del 0 al 9,
una salida c que tambin ser un dgito BCD, y un acarreo de salida (carry_out). Tambin
hay un acarreo de entrada, carry_in, que nos permitir interconectar diversos bloques.
Funcionamiento
Al realizar la suma binaria se nos pueden presentar dos casos: si el resultado de dicha suma
es igual o menor a 9 (1001), el resultado es directo (es decir, a + b = c). Si la suma es
superior a 9, debemos realizar una correccin al valor obtenido.
El proceso en este segundo caso es el siguiente: realizamos la suma de a y b en binario,
obteniendo el valor intermedio d formado por 5 bits (Figura 3.4). Son 5 bits porque el
mximo nmero en decimal que podemos obtener es que el que se da cuando a y b tienen
sus valores mximos (9) y el acarreo de entrada carry_in es igual a 1; el resultado de la
suma (a + b + carry_in) es 19, y en binario sera 10011 (los cinco bits mencionados).
Para el caso de que la suma de a y b sea mayor que 9, aplicaremos un factor de correccin
que sera restar 10 al valor obtenido y aumentar 1 el dgito de las decenas. Y restar diez
equivale en binario a sumar 6 (0110). Un ejemplo: si a es 5 y b es 7, la suma es 12 y
debemos realizar la correccin.
Empezamos sumando 5 y 7. Sus correspondientes en binario son 0101 para el 5 y 0111
para el nmero 7. El resultado es 12, que en binario se representa como 1100.
1
decimal
0 1 0 1
+ 0 1 1 1
1 1 0 0
5
7
12
Vemos que este valor es superior a 9, y por tanto no es un valor BCD vlido. Entonces
hemos de aplicar una correccin para obtener el valor correspondiente en BCD, donde el
nmero 12 se representara con dos dgitos de cuatro bits cada uno; un primer grupo para el
1 0001, y otro grupo para el 2 0010. Para pasar de binario a BCD vamos a sumar 6 (en
binario 0110):
1
1 1 0 0
+
0 1 1 0
1 0 0 1 0
12
6
Obtenemos 10010, donde debemos leer los ltimos cuatro bits para el primer dgito
decimal 0010 y que equivalen al nmero 2, y el bit de ms peso, 1, que formara parte
del siguiente dgito decimal, que sera un 1. Por tanto, tendramos como resultado dos
dgitos decimales, un dgito decimal de las decenas igual a 1, y otro para las unidades que
sera un 2. Hemos pasado del valor 12, 10010 en binario, a su equivalente en
nomenclatura BCD, 0001 0010.
- 22 -
Decimal
Binario
BCD
Memoria descriptiva
12
1100
0001 0010
En resumen:
(3.1)
(3.2)
- 23 -
Memoria descriptiva
donde tendremos dos entradas, x e y, de n dgitos BCD (4n bits), y una salida z que ser el
resultado de la operacin. Adems, en el caso de que haya desbordamiento en z, la salida
out_carry se pondr a 1. La entrada ini_carry en este bloque se corresponde con el
acarreo de entrada del primer sumador de 1 dgito BCD.
- 24 -
Memoria descriptiva
Podemos ver como en la tercera operacin (x = 3050, y = 8070), el acarreo de salida est a
nivel alto, lo que indica que el resultado es z = 11120.
- 25 -
Memoria descriptiva
3.2.1.2 Restador
El objetivo es crear un bloque que dados dos valores de entrada de n dgitos, x e y, calcule
la diferencia z, e indique mediante una seal de salida denominada carry_out si el
resultado ha sido positivo (carry_out = 0) o negativo (carry_out = 1),
Para ello, nos basaremos en dos operaciones bsicas; una es la suma descrita en el apartado
anterior, por lo que utilizaremos el Sumador de n dgitos decimales, y la otra es la
utilizacin del complemento a 10n del valor y de entrada. El complemento a 10n de un
nmero se puede obtener a partir de calcular el complemento a 9 de cada dgito (con un
bloque que haga esta funcin) y sumando 1 al resultado.
Un valor decimal x puede expresarse como:
xn-1 xn-2 x1 x0 = xn-1 10n-1 + xn-1 10n-2 + + x1 10 + x0,
(3.3)
y su complemento a 9 equivale a
9 xn-1 9 xn-2 9 x1 9 x0 = 10n 1 (xn-1 xn-2 x1 x0),
(3.4)
(3.5)
Si x y:
(3.6)
Si x < y:
(3.7)
- 26 -
Memoria descriptiva
Dado un dgito BCD e de cuatro bits (e3 e2 e1 e0), su complemento a 9 (s3 s2 s1 s0) se
obtiene mediante la operacin 1001 e3 e2 e1 e0 (o su equivalente, 1001 + e3 e2 e1 e0
+ 1, es decir, sumando al minuendo el complemento a 2 del sustraendo). Las expresiones
resultantes son las siguientes:
s0 = e0
s1 = e1
(3.8)
s2 = e1 e2
s3 = e1 e2 e3
(3.9)
- 27 -
Memoria descriptiva
Si nos fijamos en la Figura 3.12, podemos ver que la seal de control add_sub nos permite
realizar las operaciones de suma y resta:
Debido a que podemos realizar las dos operaciones con un mismo bloque, lo
denominaremos Sumador/Restador de n dgitos.
- 28 -
Memoria descriptiva
3.2.1.3 Sumador/Restador,
n_adder_subs.vhd)
representacin
con
signo
magnitud
(bloque
Observemos otra vez en el ltimo bloque creado (Figura 3.12). Hemos visto que esta
estructura nos permite realizar las operaciones de suma y resta. Pongamos un par de
ejemplos sobre la resta siendo n = 3:
En este ltimo caso, para saber el resultado exacto de la operacin debemos calcular el
complemento a 10n del valor z que hemos obtenido; es decir, calcular el complemento a 9
de cada dgito de z y sumar 1 al resultado obtenido. Esto lo hacemos mediante una
modificacin de la arquitectura anterior, por lo que el diagrama de bloques final del
Sumador/Restador de n dgitos BCD ser el siguiente:
z1
y(4n-1:0)
add_sub
4n
x(4n-1:0)
4n
oc
carry_out
Complemento
a9
4n
4n
Complemento
a9
1
4n
Sumador de n
4n
Sumador de n
ini_carry
ini_carry
ini_carry
dgitos decimales
dgitos decimales
4n
4n
z1
z3
add_sub
4n
z(4n-1:0)
Figura 3.13. Sumador/Restador de n dgitos decimales
- 29 -
Memoria descriptiva
Esta modificacin implica un cambio en el significado del valor del acarreo de salida del
bloque (denominado carry_out), cuando realizamos la operacin resta:
Operacin
carry_out
Resultado
Suma
Exacto
Suma
Hay desbordamiento
Resta
Positivo
Resta
Negativo
- 30 -
- 31 -
Memoria descriptiva
Memoria descriptiva
3.2.2 Multiplicador
En este apartado crearemos un mdulo que multiplique dos valores de entrada, x e y, de n y
m dgitos BCD respectivamente, y muestre el resultado en z, de n + m dgitos BCD.
Para ello lo primero que haremos ser definir una estructura bsica que realizar la
multiplicacin de dos dgitos BCD (multiplicador de 1x1 dgitos BCD), despus
realizaremos un bloque que multiplique un nmero de n por 1 dgitos BCD, y finalmente el
multiplicador de NxM dgitos BCD.
a(3:0)
Multiplicador de
1 dgito BCD
d(3:0)
u(3:0)
- 32 -
Memoria descriptiva
(3.10)
A B = P = p6 p5 p4 p3 p2 p1 p0
(3.11)
Son un mximo de 7 bits porque el resultado mximo que podemos tener en esta operacin
es 81 en decimal, que corresponder al caso de que A y B tengan su valor mximo, y este
es 9. La representacin binaria del nmero 81 es 1010001 (7 bits).
Podemos convertir el nmero binario P a cdigo BCD mediante sumas binarias tras
corregir los trminos descritos en la Figura 3.18. La primera fila indica el peso de cada
dgito BCD. Los pesos de p3 p2 p1 p0 son los mismos que para el valor binario. Pero los
pesos de p4 p5 y p6 se pueden descomponer en los valores BCD de la Figura 3.18.
Concretamente, p4 (cuyo peso es 16 en binario) se puede descomponer como (10, 4, 2), p5
(peso binario igual a 32) se puede descomponer en (20, 10, 2) y por ltimo p6 (peso binario
64) como (40, 20, 4).
80
+
d3
40
20
10
8
4 2 1
p3 p2 p1 p0
p4
p4 p4
p5 p5
p5
p6 p6
p6
d2 d1 d0 u3 u2 u1 u0
Sumamos los trminos y obtenemos las expresiones que nos darn el valor de las unidades
(uu) y las decenas (dd):
uu = p3 p2 p1 p0 + 0 p4 p4 0 + 0 p6 p5 0
dd = p6 p5 p4 + 0 p6 p5
(3.12)
Dada esta ltima expresin de uu, podemos ver que su valor estar entre 0 y 27 (segn los
valores de p0, p1, p2, p3, p4, p5 y p6). Si el valor de uu es superior a 9 (con lo que se
necesitara de ms de 1 dgito BCD para representarse) deberemos realizar una correccin
para obtener un resultado correcto. A continuacin definimos dichos trminos de
correccin:
Memoria descriptiva
Definiremos una variable para cada caso y mediante las siguientes expresiones booleanas
sabremos cual tenemos en cada momento.
gt 9 = uu 4 uu 3 (uu 2 uu1 )
gt 20 = uu 4 (uu 3 uu 2 )
(3.13)
(3.14)
gt10st19 = gt 9 gt 20
(3.15)
Por ltimo obtenemos los valores finales para las decenas (d) y las unidades (u) al aadir
las correcciones pertinentes:
u = (uu3 uu2 uu1 uu0) + (gt20 gt9 gt10st19 0)
d = (dd3 dd2 dd1 dd0) + (0 0 gt20 gt10st19)
(3.16)
Simulacin
- 34 -
Memoria descriptiva
y
4
x1
x0
Multipl.
1x1 BCD
y
4
Multipl.
1x1 BCD
d2
Multipl.
1x1 BCD
u2
d1
u1
d0
u0
donde x ser el nmero de 3 dgitos BCD (x2 x1 x0). Cada multiplicador genera un valor
para las unidades (ux) y uno para las decenas (dx); este ltimo ser el que deba sumarse a
las unidades del siguiente multiplicador. Esta estructura nos muestra que necesitaremos un
sumador de n + 1 dgitos BCD.
El resultado z (formada por 4 dgitos BCD) ser el siguiente:
z = (0 u2 u1 u0) + (d2 d1 d0 0)
0
d2
u2
Sumador 1
dgito BCD
4
d1
u1
Sumador 1
dgito BCD
z3
d0
Sumador 1
dgito BCD
(3.17)
u0
4
Sumador 1
dgito BCD
z2
z1
z0
Viendo este ejemplo podemos afirmar que, para un multiplicador de Nx1 dgitos BCD,
necesitaremos n multiplicadores 1x1 y n + 1 sumadores de 1 dgito.
- 35 -
Memoria descriptiva
Tendremos dos seales de entrada: un valor x de n dgitos (xn-1 xn-2 x2 x1 x0) y un valor y
de 1 dgito, lo que generar una seal de salida z (zn zn-1 zn-2 z2 z1 z0).
Figura 3.22. Multiplicador de Nx1 dgitos. Incluye n multiplicadores 1x1 y n + 1 sumadores de 1 dgito
- 36 -
Memoria descriptiva
Tambin tendremos las entradas start (indica inicio de operacin), clk (seal de reloj) y
reset (que inicializa el bloque), y la salida done (que informa de operacin realizada).
Los valores n y m sern los parmetros genricos del circuito.
Para realizar esta operacin vamos a crear un sistema secuencial (a diferencia de los que
habamos hecho hasta ahora, que eran combinacionales) en el que mediante un bucle,
utilizaremos m veces el multiplicador de Nx1 dgitos (n_by_one_multiplier.vhd) y
sumaremos y almacenaremos los resultados parciales (mediante el bloque
n_adder_subs.vhd en modo suma y registros internos).
Que sea un sistema secuencial ayudar a reducir el coste del mismo, ya que utilizaremos un
solo multiplicador en lugar de utilizar m multiplicadores de Nx1.
El algoritmo que utilizaremos ser el siguiente:
z := 0;
for i in 1 .. m loop
z := z 10 + x ym-i;
end loop;
- 37 -
Memoria descriptiva
y(4m-1:0)
4m
x(4n-1:0)
int_y(m)
4n
load
shift
clk
Multiplicador Nx1
dgitos BCD
z_by_10
4(n+1)
x_by_yi
4(n+m)
Sumador n
dgitos BCD
x 10
next_z
load
shift
clk
register z
z(4(n+m)-1:0)
Figura 3.25. Diagrama de bloques del multiplicador NxM
- 38 -
Memoria descriptiva
En la siguiente figura podemos ver una simulacin del proceso, donde hemos establecido
n = 3 y m = 4:
Para controlar este sistema secuencial necesitaremos una unidad de control. Dicha unidad
recibir como seales de entrada start, clk, reset y end_of_computation, y generar las
seales shift, load y done:
start = 1
E0
shift = 0
load = 0
done = 1
start = 0
E1
shift = 0
load = 0
done = 1
end_of_ computation = 0
start = 1
E2
E3
shift = 0
load = 1
done = 0
shift = 1
load = 0
done = 0
- 39 -
Memoria descriptiva
E0 es el estado inicial (seal current_state), con un bucle de espera para que la seal start
pase a nivel bajo y avanzar al estado 1 (caso de que start se haya mantenido a 1 como
consecuencia de una operacin anterior).
Aqu se espera a que start sea igual 1 (lo que hemos hecho ha sido detectar la transicin
de 0 a 1 de esta seal). En E2 se cargan los valores iniciales en los registros (load = 1).
Entonces pasamos a E3, donde se ejecutan las etapas de clculo (shift = 1) hasta que la
seal end_of_computation sea igual a 1, lo que significar que el dgito ledo int_y es 15
(1111) y ha finalizado la operacin, volviendo al estado inicial y poniendo la seal done a
1, indicando que el proceso ha terminado.
- 40 -
Memoria descriptiva
3.2.3 Divisor
3.2.3.1 Algoritmo de divisin binaria
Dados dos nmeros naturales x e y, siendo x < y, el algoritmo de divisin binaria genera
dos naturales q y r tales que:
x 2 p = q y + r , con r < y
(3.18)
x = q y 2 p + r 2 p ,
(3.19)
r
x
r
= q 2 p + 2 p , siendo 2 p < 2 p
y
y
y
(3.20)
As
(3.21)
Multiplicando la primera ecuacin por 2p, la segunda por 2p-1, la tercera por 2p-2,, y la
ltima por 20, y sumando las p ecuaciones tenemos que:
x 2p = (qp-1 2p-1 + qp-2 2p-2 + qp-3 2p-3 + + q0 20) y + rp
(3.22)
(3.23)
(3.24)
qp-i = 1 y ri = 2 ri-1 y
(3.25)
qp-i = 0 y ri = 2 ri-1
(3.26)
2 ri-1 y : entonces
- 41 -
Memoria descriptiva
Las operaciones en BCD que utilizaremos sern la multiplicacin por 2, la resta con
generacin de signo y la suma. Adems, la representacin BCD de 1/2, 1/22, ..., 1/2p ser
calculada sobre la marcha.
Si se ejecutan p etapas, el error es menor que 1/2p (segn el algoritmo). Supongamos que el
objetivo sea que el resultado se escriba con m dgitos fraccionarios y que el error sea menor
que 1/10m (significa que el resultado obtenido es el cociente exacto truncado). Para ello
basta con que se cumpla la siguiente relacin:
p
1
1
< , es decir p > m log 2 (10) , o sea que p > 3.3 m
2
10
- 42 -
(3.27)
Memoria descriptiva
El divisor BCD ser un mdulo que realice la divisin entre dos valores de entrada, x / y,
donde x < y (para que el algoritmo funcione), dando como resultado el cociente q de m
dgitos decimales (qm-1 qm-2 q2 q1 q0).
Tambin tendr como entradas las seales start (inicio de operacin), clk (seal de reloj) y
reset (que inicializa el bloque), y la salida done (que informa de operacin realizada).
- 43 -
Memoria descriptiva
0010
4n
Multiplicador
Nx1 dgitos BCD
4n+4
y(4n-1:0)
rr
ulp
4p
4n
4p
ulp
0101
4p
carry_out
add_sub
carry_out
Sumador/Restador
n dgitos BCD
add_sub
Sumador/Restador
n dgitos BCD
Multiplicador
Nx1 dgitos BCD
rr_y(4n-5:0)
4p+4
4p
load
clk
initially: 0.5
4p
4n
4p
ulp
load
clk
ini.: x(4n-1:0)
initially: 0
4p
4n
4p
4p-4(p-m)
q(4m-1:0)
Figura 3.30. Diagrama de bloques del divisor BCD
Memoria descriptiva
La unidad de control genera las seales load (escritura de los valores iniciales en los
registros), ce (actualizacin de los registros) y done (operacin finalizada).
La seal zero vendr controlada por un contador de p estados (este nmero se representa
con logp bits, como hemos dicho antes). Dicha seal se pondr a 1 cuando se ejecute el
paso p de la iteracin.
- 45 -
Memoria descriptiva
Simulacin
A continuacin mostramos un ejemplo de la simulacin del sistema para los valores
genricos n = 3, m = 8, p = 27 y logp = 5:
- 46 -
Memoria descriptiva
Podemos observar con mayor facilidad en la Figura 3.34 la transicin entre estados, y
vemos como, desde el estado 0 (seal current_state) y dado que la seal start es 0,
pasamos al estado 1 (en caso de que start se hubiera mantenido a 1 como resultado de un
clculo anterior, el sistema esperara a que dicha seal se pusiera a 0).
- 47 -
Memoria descriptiva
Este bloque estar controlado por una seal de entrada llamada operation, mediante la cual
se indicar a la unidad la operacin a realizar:
operation Operacin
Resultado
00
Suma
z=x+y
01
Resta
z=x-y
10
Multiplicacin
z=xy
11
Divisin
Tanto para la suma como la resta z tendr un tamao de 4n + 1 bits (el bit de mayor peso
corresponde a la seal carry_out del bloque Sumador/Restador), mientras que para la
multiplicacin y divisin el tamao ser de 8n bits.
En la multiplicacin y la divisin el clculo empieza con un flanco de subida de la seal de
entrada start. La bandera done se pone a 0. Una vez disponible el resultado, done tomar
el valor 1.
- 48 -
Memoria descriptiva
4n
carry_out
c_out
4n
4n
4n
4n
add_sub
Sumador/Restador
n dgitos BCD
Multiplicador de
NxM dgitos BCD
start1
clk
reset
4n
8n
8n
done1
s2
s1
Divisor de n
dgitos BCD
start2
clk
reset
s3
done2
operation
00
01
10
11
00
01
10
11
00
01
10
MUX-1
MUX-2
MUX-3
4n
4n
4n
z(4n-1:0)
z(8n-1:4n)
11
done
- 49 -
Memoria descriptiva
La salida del primer multiplexor (MUX-1) muestra el resultado de las operaciones suma
(operation = 00) o resta (operation = 01), y la parte baja del resultado de las
operaciones multiplicacin (operation = 10) o divisin (operation = 11), que sera
z(4n-1:0).
El segundo multiplexor recibe a travs de sus dos primeros canales el valor de la seal
carry_out del Sumador/Restador (llamada c_out). Como este valor ocupa 1 solo bit, los
otros bits del dgito de menos peso sern 0 (el dgito de menor peso, 4n+3:4n, estar
formado por 0 0 0 c_out); los dems dgitos (8n-1:4n+4) sern 0. Para la multiplicacin y
la divisin mostrar la parte alta del resultado, los dgitos de mayor peso (8n-1:4n).
MUX-3 muestra el valor actual de la seal done, que estar a nivel alto excepto cuando se
realice el clculo de la multiplicacin o de la divisin (periodo en que la seal se pondr a
nivel bajo, debido a que done1 o done2 tomarn este valor).
A continuacin se muestra una simulacin del sistema con los parmetros n = 8 y p = 56
(en consecuencia logp = 6), para las diferentes operaciones:
En este ejemplo podemos ver las operaciones suma y resta. Los valores de entrada son x =
00867335 e y = 02350927 (ambos de 8 dgitos BCD, ya que habamos establecido n = 8).
Primero se realiza la suma (operation = 00), siendo el resultado z = 03218262; como no
hay desbordamiento en el resultado, c_out (acarreo de salida) es 0. Al cambiar operation a
01 obtenemos la resta, siendo z = 01483592; en este caso el dgito de menor peso de la
parte alta de z es 1 (00000001), lo que indica que el resultado es negativo (z = 1483592).
Seguidamente mostramos la simulacin de la unidad cuando queremos realizar la
multiplicacin de dos valores (seleccionando operation = 10):
- 50 -
Memoria descriptiva
Al iniciarse el clculo, la seal que lo indica (done1) se pone a 0, lo que provoca que la
salida del sistema done tambin lo haga. Al acabar la ejecucin, done1 vuelve a nivel alto y
done tambin. Vemos como start1 se activa habilitando el multiplicador, en cambio start2
sigue a nivel bajo.
Por ltimo tenemos la simulacin de la unidad cuando ejecutamos la operacin de divisin
(operation = 11).
- 51 -
4. MEMORIA EXPERIMENTAL
Memoria experimental
- 53 -
Memoria experimental
4.2 Especificaciones
Consideremos las dos lneas de 16 caracteres cada una que posee la placa, y que se
distribuyen de la siguiente manera: en la primera lnea, los 8 primeros dgitos (BCD)
corresponden al operando x, y los 8 ltimos al operando y. La segunda lnea ser el
resultado z.
Un primer pulso (pulso 0) de synch (seal de sincronizacin) borra el display. Mediante los
interruptores SW3, SW2, SW1 y SW0 (pesos 8, 4, 2, 1 respectivamente) el dgito de
entrada, y con el pulsador synch procedemos a almacenarlo en el registro interno
correspondiente y visualizarlo en pantalla.
Tras haber introducido los 16 dgitos (los 8 primeros para el operando x y los 8 siguientes
para el operando y), un nuevo pulso de synch muestra en el display el resultado de la suma;
en los sucesivos pulsos de synch veremos los resultados de la resta, la multiplicacin y la
divisin. Un ltimo pulso (pulso 21) dar la seal para limpiar el visualizador.
- 54 -
Memoria experimental
pulso 2
02
pulso 3
028
...
pulso 16 0 2 8 6 7 3 3 5 5 0 2 9 9 7 2 3
pulso 17 0 2 8 6 7 3 3 5 5 0 2 9 9 7 2 3
0000000053167058
pulso 18 0 2 8 6 7 3 3 5 5 0 2 9 9 7 2 3
0000000147432388
...
pulso 21
Figura 4.2. Funcionamiento del sistema
Interruptores SW3, SW2, SW1, SW0 para seleccionar el dgito BCD de entrada
data_in.
Pulsadores para las seales synch (de sincronizacin) y reset.
Visualizador LCD de la placa.
Oscilador de 50 MHz.
Una CPU que controle la entrada de dgitos, la codificacin (a ASCII) de los datos
y la ejecucin de las diferentes operaciones. Las operaciones se definirn mediante
un juego de instrucciones en lenguaje ensamblador, que posteriormente formarn la
memoria de programa.
Una interfaz para el display LCD.
La Unidad Aritmtica Decimal.
- 55 -
Memoria experimental
synch
mult_out
in_port
done
15
z (15:0)
PicoBlaze
(CPU and
program memory)
reset
clk
port_id
write_strobe
operation
out_port
Registro
temp_write
Registro
8*4 bits
x (7:0)
Registro
8*4 bits
Registro
i_write
d_write
ready
lcd_interface
lcd_data
y (7:0)
Registro
2 bits
clk
clk
Unidad Aritmtica
Decimal
start
reset
clk
lcd_e
lcd_rs
lcd_rw
- 56 -
Memoria experimental
En este apartado hablaremos un poco sobre los dos componentes virtuales que utilizaremos
y que son suministrados por terceros.
Estructura
A continuacin podemos ver el diagrama de bloques del mdulo PicoBlaze.
- 57 -
Memoria experimental
Arquitectura
i_write
d_write
ready
reset
clk
lcd_interface
lcd_data
lcd_e
lcd_rs
lcd_rw
- 58 -
Memoria experimental
01
80
C0
Operacin
Limpiar el display
Fijar el cursor al inicio de la primera lnea
Fijar el cursor al inicio de la segunda lnea
Tabla 4.1. Comando utilizados
- 59 -
Memoria experimental
temp_write
very_short
very_long
short long
ce_cd
ce
sel_delay
cd(7..0)
status
(to control unit)
counter
cd(7..4)
load
load
cd(3..0)
1
time_out
(to control unit)
sel_nibble
i_write
nibble
(to control unit)
status
time_out
nibble
s_write ready
control unit
reset
clk
lcd_data
ce_cd
sel_nibble
sel_delay
load
direccin
z
synch
data_in
ready
done
00 a 0f
10
11
12
13
- 60 -
Memoria experimental
Y las de salida:
seal
direccin
y
x
temp_wr
id_write
start
operation
00 a 07
08 a 0f
10
11
12
13
Con el objetivo de reducir el tamao del cdigo, se incluira una subrutina (entre otras) que
mostrara el resultado z en el visualizador despus de cada operacin:
subroutine display z;
send command c0 (cursor address = 40) to display;
internal loop (16 times)
store z(i) in data;
encode data;
display character data;
end internal loop;
- 61 -
Memoria experimental
synch
mult_out
done
in_port
15
z (15:0)
PicoBlaze
(CPU and
program memory)
reset
clk
port_id
write_strobe
operation
out_port
Registro
temp_write
Registro
8*4 bits
x (7:0)
Registro
8*4 bits
Registro
i_write
d_write
ready
lcd_interface
lcd_data
y (7:0)
Registro
2 bits
clk
clk
Unidad Aritmtica
Decimal
start
reset
clk
lcd_e
lcd_rs
lcd_rw
n = 8, lo que quiere decir que los operandos x e y sern de 8 dgitos BCD cada uno,
p = 56, es el nmero de etapas que se ejecutarn para calcular el resultado cuando
realicemos la divisin,
logp = 6, que son los bits necesarios para representar el valor de p.
- 62 -
Memoria experimental
Utilizaremos 2 registros de 32 bits (8 dgitos BCD por 4 bits cada uno) para almacenar los
valores que se vayan introduciendo de los operandos x e y; en el caso de la seal operation
tendremos suficiente con un registro de 2 bits.
Otros 2 registros ms sern necesarios para las seales temp_write y i_write/d_write de la
interfaz LCD.
Tambin incluiremos un divisor de frecuencia ya que la proporcionada por el reloj de la
placa es demasiado alta (50 MHz). En el circuito se aaden cuatro divisores de frecuencia
que generan clk_2, clk_4, clk_8 y clk; esta ltima seal es la que se utilizar como seal de
reloj de los diferentes bloques del circuito. Cada divisor reduce la frecuencia anterior a la
mitad, por lo que tras 4 divisores, la frecuencia inicial de 50 MHz se dividir por 16 y
obtendremos una frecuencia de trabajo de 3.125 MHz.
El siguiente paso consiste en crear un archivo UCF (User Constraint File) que asigne las
seales que utilizamos a los pines correspondientes de la Spartan-3E. Las descripciones
necesarias para cada elemento de la placa se pueden encontrar en la Spartan-3E Starter Kit
Board User Guide.
Los interruptores SW3 (mayor peso), SW2, SW1 y SW0 (menor peso) sern asignados a
los siguientes pines (entre parntesis):
- 63 -
Memoria experimental
Pulsadores:
Seal de reloj:
Nombre interno
PIN asociado
lcd_e
lcd_rs
lcd_rw
lcd_data<3>
lcd_data<2>
lcd_data<1>
lcd_data<0>
LCD_E
LCD_RS
LCD_RW
SF_D<11>
SF_D<10>
SF_D<9>
SF_D<8>
M18
L18
L17
M15
P17
R16
R15
- 64 -
Memoria experimental
Ahora que disponemos del modelo VHDL del circuito completo (main.vhd), con los
diferentes componentes virtuales que lo integran (kcpsm.vhd, arithmetic_unit.vhd,
lcd_interface.vhd, program_memory.vhd) y del archivo de asignacin de pines (pins.ucf),
procederemos a sintetizarlo e implementarlo en la FPGA.
Para ello utilizaremos la aplicacin Xilinx ISE Design Suite 11, con dos de sus programas,
ISE Project Navigator para generar el archivo e iMPACT para grabarlo en la placa.
Para mayor comodidad nuestra, uniremos en un solo archivo VHDL todos los
componentes que conforman la Unidad Aritmtica Decimal; este archivo ser el
blocks_uad.vhd. Por tanto, el listado de programas utilizado ser el siguiente:
blocks_uad.vhd
kcpsm.vhd
lcd_interface.vhd
main.vhd
pins.ucf
program_memory.vhd
- 65 -
Memoria experimental
Abrimos el programa ISE Project Navigator y creamos un nuevo proyecto (New Project) y
escogemos un nombre para l. El siguiente paso es seleccionar las caractersticas del
dispositivo que estamos utilizando, que en nuestro caso sern las siguientes:
- 66 -
Memoria experimental
El primer paso consiste en sintetizar el modelo (Synthesize - XST); esto genera un reporte
que indica los recursos necesarios estimados para el dispositivo:
- 67 -
Memoria experimental
Grabaremos nuestro diseo (archivo main.bit) a travs del puerto USB de la Spartan-3E.
Desde Configure Target Device, seleccionamos Manage Configuration Project (iMPACT),
los que nos llevar a la aplicacin iMPACT. A travs de Boundary Scan, buscamos el
dispositivo (Initialize Chain) y se muestra en pantalla:
- 68 -
Memoria experimental
- 69 -
5. ANEXOS
Anexos
- 71 -
Anexos
END architecture_oda;
- 72 -
Anexos
<=
<=
<=
<=
(NOT(add_sub)
e(1);
(NOT(add_sub)
(NOT(add_sub)
NOT(e(2)) AND
END architecture_nc;
- 73 -
Anexos
--Complemento a 9 de 'y'
--en funcin de 'add_sub'
- 74 -
Anexos
PORT(
DOWNTO
DOWNTO
DOWNTO
DOWNTO
0);
0);
0);
0));
- 75 -
Anexos
--producto binario
--mayor a 9
--mayor a 19
--entre 10 y 19
- 76 -
IS PORT(
DOWNTO 0);
DOWNTO 0);
DOWNTO 0);
DOWNTO 0));
Anexos
- 77 -
Anexos
- 78 -
Anexos
--Inicio
BEGIN
multiplier: n_by_one_multiplier
GENERIC MAP(n => n)
PORT MAP(
x => x,
y => int_y(4*m+3 DOWNTO 4*m),
z => x_by_yi);
long_x_by_yi <= initial_zeroes&x_by_yi;
adder: n_adder_subs
GENERIC MAP(n => n+m)
PORT MAP(
x => long_x_by_yi,
y => z_by_10,
add_sub => '0',
z => next_z);
- 79 -
Anexos
- 80 -
--dividendo
--divisor
--seal de inicio
--seal de reloj
--inicializa operacin
--resultado (cociente)
--operacin realizada
Anexos
--Inicio
BEGIN
yy <= "0000" & y;
multiplier_r_by_2: n_by_one_multiplier
--Multiplicador de r x 2
GENERIC MAP(n => n)
PORT MAP(
x => r,
y => "0010",
--2 en decimal
z => rr);
--resultado 2r
- 81 -
Anexos
--2r
--Resta como operacin a realizar
--resultado de 2r-y
--Sentencias secuenciales
register_r: PROCESS(clk)
BEGIN
IF clk'EVENT AND clk = '1' THEN
IF load = '1' THEN r <= x;
ELSIF ce = '1' THEN r <= s1;
END IF;
END IF;
END PROCESS;
register_qq: PROCESS(clk)
BEGIN
IF clk'EVENT AND clk = '1' THEN
IF load = '1' THEN qq <= (OTHERS => '0');--Valor inicial de qq es 0
ELSIF ce = '1' THEN qq <= s2;
--Actualiza el valor de qq
END IF;
END IF;
END PROCESS;
register_ulp: PROCESS(clk)
BEGIN
IF clk'EVENT AND clk = '1' THEN
IF load = '1' THEN ulp <= "0101" & initial_zeroes_2;
--El valor inicial es 5, que representa 0.5
ELSIF ce = '1' THEN ulp <= ulp_by_5(4*p+3 DOWNTO 4);--Actualiza ulp
END IF;
END IF;
END PROCESS;
- 82 -
Anexos
- 83 -
--operando x
--operando y
--operacin
--seal de inicio
--seal de reloj
--inicializa
--resultado
--operacin lista
Anexos
--dividendo
--divisor
--seal de inicio
--seal de reloj
--inicializa operacin
--resultado (cociente)
--operacin realizada
--Inicio
BEGIN
start1 <= start AND NOT(operation(0)) AND operation(1);
start2 <= start AND operation(0) AND operation(1);
- 84 -
- 85 -
Anexos
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
attribute
INIT_00
INIT_01
INIT_02
INIT_03
INIT_04
INIT_05
INIT_06
INIT_07
INIT_08
INIT_09
INIT_0A
INIT_0B
INIT_0C
INIT_0D
INIT_0E
INIT_0F
INIT_10
INIT_11
INIT_12
INIT_13
INIT_14
INIT_15
INIT_16
INIT_17
INIT_18
INIT_19
INIT_1A
INIT_1B
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
- 86 -
Anexos
Anexos
INIT_1C : string ;
INIT_1D : string ;
INIT_1E : string ;
INIT_1F : string ;
INIT_20 : string ;
INIT_21 : string ;
INIT_22 : string ;
INIT_23 : string ;
INIT_24 : string ;
INIT_25 : string ;
INIT_26 : string ;
INIT_27 : string ;
INIT_28 : string ;
INIT_29 : string ;
INIT_2A : string ;
INIT_2B : string ;
INIT_2C : string ;
INIT_2D : string ;
INIT_2E : string ;
INIT_2F : string ;
INIT_30 : string ;
INIT_31 : string ;
INIT_32 : string ;
INIT_33 : string ;
INIT_34 : string ;
INIT_35 : string ;
INIT_36 : string ;
INIT_37 : string ;
INIT_38 : string ;
INIT_39 : string ;
INIT_3A : string ;
INIT_3B : string ;
INIT_3C : string ;
INIT_3D : string ;
INIT_3E : string ;
INIT_3F : string ;
INITP_00 : string ;
INITP_01 : string ;
INITP_02 : string ;
INITP_03 : string ;
INITP_04 : string ;
INITP_05 : string ;
INITP_06 : string ;
INITP_07 : string ;
- 87 -
;
;
;
;
;
;
;
;
Anexos
;
;
;
;
;
;
;
;
begin
bram : component RAMB4_S8_S16
generic map (
INIT_00 =>
X"8322E2130200832B9D0561018339834BF210A211832B010F8340038083400301",
INIT_01 =>
X"83228347E212E2130203832B83228347E212E2130202832B8322E2130201832B",
INIT_02 =>
X"6000A010952B6000A01080809D2561018339834BB210010F834003C08100832B",
INIT_03 =>
X"8080E0110000E0110002E2108335808091356000A01280809532640104FF912E",
INIT_04 =>
X"808042309D50600AC020808091476000A0138080E0110000E0110001E3108335",
INIT_05 =>
X"0000000000000000000000000000000000000000000000000000808042406209",
INIT_06 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_07 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_08 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_09 =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0A =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0B =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0C =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0D =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0E =>
X"0000000000000000000000000000000000000000000000000000000000000000",
INIT_0F =>
X"0000000000000000000000000000000000000000000000000000000000000000"
)
port map (
DIB => "0000000000000000",
ENB => '1',
WEB => '0',
RSTB =>
'0',
CLKB => clk,
ADDRB => address,
DOB => instruction( 15 downto 0 ),
- 88 -
Anexos
IS PORT(
IN STD_LOGIC_VECTOR(3 DOWNTO 0);
IN STD_LOGIC;
IN STD_LOGIC;
IN STD_LOGIC;
OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
OUT STD_LOGIC;
OUT STD_LOGIC;
OUT STD_LOGIC);
- 89 -
Anexos
--Interfaz LCD
COMPONENT arithmetic_unit IS
--Unidad aritmtica decimal
GENERIC (n, p, logp: NATURAL);
PORT(
x:
IN
STD_LOGIC_VECTOR(4*n-1 DOWNTO 0); --operando x
y:
IN
STD_LOGIC_VECTOR(4*n-1 DOWNTO 0); --operando y
operation: IN
STD_LOGIC_VECTOR(1 DOWNTO 0);
--operacin
start:
IN
STD_LOGIC;
--seal de inicio
clk:
IN
STD_LOGIC;
--seal de reloj
reset:
IN
STD_LOGIC;
--inicializa
z:
OUT STD_LOGIC_VECTOR(8*n-1 DOWNTO 0); --resultado
done:
OUT STD_LOGIC);
--operacin lista
END COMPONENT;
--Declaracin de seales
SIGNAL port_id, in_port: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL mult_out: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL ready, done: STD_LOGIC;
SIGNAL instruction: STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL address, out_port: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL interrupt, write_strobe, read_strobe: STD_LOGIC;
SIGNAL temp_wr: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL i_write, d_write: STD_LOGIC;
SIGNAL id_write: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL x, y: STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL operation: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL z: STD_LOGIC_VECTOR(63 DOWNTO 0);
SIGNAL start_op: STD_LOGIC;
SIGNAL clk_2, clk_4, clk_8, clk: STD_LOGIC;
- 90 -
Anexos
--Inicio
BEGIN
WITH port_id SELECT in_port <=
("0000000"&synch) when "00010000",
("0000"&data_in) when "00010001",
("0000000"&ready) when "00010010",
("0000000"&done) when "00010011",
("0000"&mult_out) when others;
processor: kcpsm PORT MAP(
instruction, in_port, interrupt, reset, clk, address, port_id,
out_port, write_strobe, read_strobe);
memory: program_memory PORT MAP(
address => address,
clk => clk,
instruction => instruction);
output_interface: lcd_interface PORT MAP(
temp_wr, reset, clk, i_write, d_write, lcd_data, lcd_e, lcd_rs,
lcd_rw, ready);
--Divisor de frecuencia
PROCESS(ext_clk)
BEGIN
IF reset = '1' THEN clk_2 <= '0';
ELSIF ext_clk'EVENT AND ext_clk = '1' THEN clk_2 <= NOT(clk_2);
END IF;
END PROCESS;
PROCESS(clk_2)
BEGIN
IF reset = '1' THEN clk_4 <= '0';
ELSIF clk_2'EVENT AND clk_2 = '1' THEN clk_4 <= NOT(clk_4);
END IF;
END PROCESS;
PROCESS(clk_4)
BEGIN
IF reset = '1' THEN clk_8 <= '0';
ELSIF clk_4'EVENT AND clk_4 = '1' THEN clk_8 <= NOT(clk_8);
END IF;
END PROCESS;
PROCESS(clk_8)
BEGIN
IF reset = '1' THEN clk <= '0';
ELSIF clk_8'EVENT AND clk_8 = '1' THEN clk <= NOT(clk);
END IF;
END PROCESS;
--Registros
register_temp_wr: PROCESS(clk)
BEGIN
IF clk'event AND clk = '0' THEN
IF port_id = "00010000" AND write_strobe = '1' THEN temp_wr <=
out_port;
END IF;
END IF;
END PROCESS;
- 91 -
- 92 -
Anexos
- 93 -
Anexos
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
DSIN
$00
$01
$02
$03
$04
$05
$06
$07
$08
$09
$0a
$0b
$0c
$0d
$0e
$0f
$10
$11
$12
$13
;direcciones de salida
y0
y1
y2
y3
y4
y5
y6
y7
x0
x1
x2
x3
x4
x5
x6
x7
temp_wr
id_write
start
operation
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
DSOUT
$00
$01
$02
$03
$04
$05
$06
$07
$08
$09
$0a
$0b
$0c
$0d
$0e
$0f
$10
$11
$12
$13
;registros internos
acc
address
data
command
counter
EQU
EQU
EQU
EQU
EQU
s0
s1
s2
s3
s4
- 94 -
Anexos
Anexos
- 95 -
Anexos
;subroutines:
;display the result of the operation
display_z:
load command, $c0
call lcd_control
;send command c0 (cursor address = 40) to
;display
load address, $0f
;initial address = 15
first_bis:
in data, address
call encode_data
call lcd_data
sub address, $01
jump NC, first_bis
ret
;read z(address)
;data = ASCII code
;display character data
;update address
;check whether address < 0
- 96 -
Anexos
;
;
;
;
- 97 -
6. BIBLIOGRAFA
Bibliografa
6. Bibliografa
[1]
Serafn Alfonso Prez, Enrique Soto, Santiago Fernndez, Diseo de Sistemas Digitales con VDHL,
Editorial Thomson, 2002.
[2]
Fernando Pardo Carpio, Jos A. Boluda Grau, VHDL: Lenguaje para sntesis y modelado de
circuitos, Editorial Ra-Ma, 1999.
[3]
John F. Wakerly, Diseo digital. Principios y prcticas, Tercera edicin, Editorial Prentice Hall,
2001.
[4]
Thomas L. Floyd, Fundamentos de sistemas digitales, Novena edicin, Editorial Prentice Hall,
2006.
[5]
[6]
J.-P. Deschamps, G. Sutter, G. Bioul, M. Vazquez, Decimal division: algorithms and FPGA
implementations.
[7]
[8]
[9]
[10]
Spartan-3E FPGA Starter Kit Board User Guide, UG230 (v1.1), Xilinx, 2008.
[11]
[12]
PicoBlaze 8-Bit Microcontroller for Virtex-E and Spartan-II/IIE Devices, XAPP213 (v2.1), Xilinx,
2003.
[13]
http://www.model.com/
[14]
http://www.xilinx.com/
- 99 -