• No results found

Disseny d'un Microprocessador en una plataforma reconfigurable

N/A
N/A
Protected

Academic year: 2022

Share "Disseny d'un Microprocessador en una plataforma reconfigurable"

Copied!
123
0
0

Laster.... (Se fulltekst nå)

Fulltekst

(1)

T reball Final de Grau

AUTOMÀTICA

Disseny d’un Microprocessador en una plataforma reconfigurable

ARNOLD MC GIVER MAMANI

Tutor

Sebastián Antonio Bota Ferragut

Escola Politècnica Superior

Universitat de les Illes Balears

(2)
(3)

Índice general i

Índice de figuras iii

Índice de cuadros iv

Acrónimos vii

Resumen ix

1 Introducción 1

2 CPU, partes de un microprocesador 3

2.1 Unidad de Proceso (UP) . . . 3

2.1.1 Registros de uso general . . . 4

2.1.2 IR, Instruction Register . . . 5

2.1.3 PC, Program Counter . . . 6

2.1.4 MAR, Memory Address Register . . . 7

2.1.5 MDR, Memory Data Register . . . 7

2.1.6 ACC, Acumulador . . . 8

2.1.7 Unidad Aritmético Lógica (ALU), Unidad Aritmético Lógica . . 8

2.1.8 Otros componentes . . . 12

2.1.9 Visión global - Unidad de proceso . . . 14

2.2 Unidad de Control (UC) . . . 17

2.2.1 Sequenciador . . . 17

2.2.2 IRdecoder . . . 23

2.2.3 Multiplexor de condiciones de entrada . . . 26

2.2.4 CtrlSeq . . . 27

2.2.5 Batería de puertas AND . . . 29

2.2.6 Memoria Read Only Memory (ROM) de microcodigo . . . 30

2.2.7 Diseño de ROM y el conjunto de instrucciones . . . 33

2.2.8 Visión global - Unidad de Control (UC) . . . 37

2.3 Memoria Random Access Memory (RAM) . . . 40

2.3.1 Arquitectura memoria RAM . . . 41

2.4 Visión global - Microprocesador . . . 44

3 Adaptación al hardware - DE2-70 47 3.1 Reloj . . . 48

(4)

3.2 Liquid Crystal Display (LCD) . . . 49

3.2.1 LCD controller . . . 50

3.2.2 LCD . . . 54

4 Implementación y test de funcionamiento 59 4.1 Simulaciones de funcionamiento . . . 60

4.1.1 Ciclo de inicialización . . . 61

4.1.2 Ciclo de fetch . . . 61

4.1.3 Instrucción LDR1 . . . 62

4.1.4 Instrucción LDR2 . . . 63

4.1.5 Instrucción ADD . . . 65

4.1.6 Instrucción STR1 . . . 67

4.1.7 Instrucción CMP . . . 69

4.1.8 Instrucción BRE . . . 71

4.1.9 Instrucción JMP . . . 72

4.1.10 Instrucción FI . . . 73

4.1.11 Instrucción NOP . . . 74

4.1.12 Instrucción DJNZR1 . . . 75

4.1.13 Instrucción DELAY . . . 77

4.1.14 Resto de Instrucciones . . . 78

4.2 Test sobre la placa de altera - DE2-70 . . . 78

5 Conclusiones 83

A Anexos 85

Bibliografía 111

(5)

2.1 Estructura de la unidad de proceso . . . 4

2.2 registro de uso general . . . 5

2.3 Registro Program Counter . . . 7

2.4 Componente ALU . . . 12

2.5 Componente multiplexor de 12 bits . . . 13

2.6 Componente tri-estado . . . 14

2.7 Componente unidad de proceso . . . 15

2.8 Estructura interna de la unidad de proceso . . . 16

2.9 Componente multiplexor de 8 bits . . . 19

2.10 Componente Registro microPC . . . 20

2.11 Componente incrementador . . . 21

2.12 Componente sequenciador . . . 23

2.13 Componente IRdecoder . . . 24

2.14 Componente Multiplexor de condiciones de entrada . . . 27

2.15 Componente ctrlSeq . . . 29

2.16 Componente batería de puertas ANDs . . . 30

2.17 Componente memoria ROM . . . 33

2.18 Componente unidad de control . . . 38

2.19 Estructura interna de la unidad de control . . . 39

2.20 Componente memoria RAM . . . 41

2.21 Componente microprocesador . . . 44

2.22 Estructura interna del uProcesador . . . 45

3.1 Componente clock . . . 49

3.2 Condiciones de alimentación interna . . . 50

3.3 Componente lcd controller . . . 51

3.4 Controlador del LCD . . . 51

3.5 Componente LCD . . . 56

4.1 Ejecución de la instrucción LDR1 . . . 60

4.2 Ejecución de la instrucción LDR2 . . . 64

4.3 Ejecución de la instrucción LDR1 Y LDR2 . . . 65

4.4 Ejecución de la instrucción ADD . . . 66

4.5 Ejecución de la instrucción STR1 . . . 67

4.6 Simulación de escritura en ram . . . 69

4.7 Ejecución de intrucción CMP - sin condición completa . . . 70

4.8 Ejecución de intrucción CMP - con condición completa . . . 71

(6)

4.11 Ejecución de instrucción FI . . . 74

4.12 Ejecución de instrucción NOP . . . 75

4.13 Ejecución de instrucción DJNZR1 - Inicial . . . 76

4.14 Ejecución de instrucción DJNZR1 - Final . . . 76

4.15 Ejecución de instrucción DELAY . . . 77

4.16 Diseño e implementación del microprocesador . . . 78

4.17 Pin planer - conexión de puertos en QUARTUS II . . . 79

4.18 Placa de altera DE2-70 . . . 79

4.19 Placa DE2-70 - Switches y pulsadores . . . 80

4.20 Placa DE2-70 - lcd . . . 81

4.21 Placa DE2-70 - Tiempo de reset . . . 82

A.1 Placa DE2-70 - Configuración de botones . . . 107

A.2 Placa DE2-70 - Configuración del reloj . . . 108

A.3 Placa DE2-70 - Configuración de leds . . . 108

A.4 Placa DE2-70 - Configuración de switches . . . 108

A.5 Placa DE2-70 - Configuración del lcd . . . 109

A.6 Placa DE2-70 - Configuración del lcd . . . 109

Í NDICE DE CUADROS

2.1 Conjunto de instrucciones del microprocesador . . . 25

2.2 Tabla de control del sequenciador . . . 27

2.3 Formato de una instrucción . . . 33

2.4 Microcodigo . . . 36

3.1 Representación en la pantalla LCD . . . 56

(7)

2.1 Registro de uso general . . . 4

2.2 Instruction Register . . . 6

2.3 Program Counter . . . 6

2.4 Unidad aritmético lógica - entity . . . 8

2.5 Unidad aritmético lógica - arquitectura . . . 9

2.6 Unidad aritmético lógica - proceso comb . . . 10

2.7 Unidad aritmético lógica - proceso reg . . . 10

2.8 Multiplexor de 2 canales de 12 bits . . . 12

2.9 Tri-estado . . . 13

2.10 Multiplexor de 4 canales de 8 bits . . . 18

2.11 Registro de 8 bits - MicroPC . . . 19

2.12 Incrementador . . . 20

2.13 Sequenciador . . . 21

2.14 IRdecoder . . . 23

2.15 Multiplexor de condiciones de entrada . . . 26

2.16 CtrlSeq . . . 28

2.17 Bateria de puertas AND . . . 29

2.18 Memoria rom . . . 31

2.19 Unidad de control . . . 37

2.20 Memoria ram . . . 40

2.21 Memoria ram arquitecura y programa . . . 41

3.1 Reloj de periodo variable . . . 48

3.2 Componente LCD controller de inicialización . . . 50

3.3 Arquitectura del componente LCD controller de inicialización . . . 52

3.4 Componente de gestión de envíos al lcd . . . 54

3.5 Arquitectura del componente de gestión de envíos al lcd . . . 56

A.1 Batería de Ands - vhd . . . 85

A.2 Multiplexor de 4 canales de 1 bit - vhd . . . 85

A.3 Multiplexor de 2 canales de 12 bits - vhd . . . 86

A.4 Multiplexor de 4 canales de 8 bits - vhd . . . 86

A.5 Tri estado - vhd . . . 87

A.6 Registro de 8 bits - microPC - vhd . . . 87

A.7 Registro de 12 bits - Program counter - vhd . . . 87

A.8 Registro de 12 bits - Resto de registros - vhd . . . 88

A.9 Ctrl Seq - vhd . . . 88

A.10 ALU - vhd . . . 89

A.11 Incrementador - vhd . . . 90

(8)

A.12 IRdecoder - vhd . . . 90

A.13 Memoria ROM - vhd . . . 91

A.14 Memoria RAM - vhd . . . 92

A.15 Sequenciador - vhd . . . 93

A.16 Unidad de Control - vhd . . . 94

A.17 Unidad de Proceso - vhd . . . 95

A.18 Microprocesador - vhd . . . 97

A.19 Clock - vhd . . . 101

A.20 LCD - vhd . . . 101

A.21 lcd _controller - vhd . . . 104

A.22 Testbench - del microprocesador - vhd . . . 106

(9)

ROM Read Only Memory RAM Random Access Memory VHDL VHSIC and HDL

FPGA Field Programmable Gate Array UP Unidad de Proceso

UC Unidad de Control LCD Liquid Crystal Display SO Sistema Operativo

ALU Unidad Aritmético Lógica

RISC Reduced Instruction Set Computer CISC Complex Instruction Set Computer

(10)
(11)

El estudio se centra en el diseño de un microprocesador de 12 bits [1], un diseño que va desde la creación de cada una de las partes que lo componen, pasando por la simulación de cada una de ellas hasta el ensamblaje en un solo componente al cual se llama micropro- cesador. Adicionalmente se ha estudiado el funcionamiento del LCD para poder visualizar los datos de los registros

La finalidad de este trabajo es comprender como funciona un microprocesador, como se relacionan sus registros, como se controla el flujo de datos, como afecta y la importancia de la memoria RAM y ROM para el funcionamiento del microprocesador y finalmente como se muestran los resultados.

Se hace uso de dos programas para realizar el proyecto, QUARTUS II y modelsim, se ha utilizado principalmente este ultimo para realizar el diseño y la simulación y el primero para cargar el diseño en la Placa de altera y conectar los puertos del diseño a los pines de la placa.

Se ha empezado diseñando las partes mas simples como pueden ser los multiplexores o registros hasta partes mas complejas como la UP o la UC.

Por otro lado también se diseña una memoria RAM la cual contiene el programa que almacena los datos y las instrucciones con las que trabaja el microprocesador.

El lenguaje empleado es VHSIC and HDL (VHDL) debido a sus características de progra- mación concurrente y a su utilidad en el diseño de componentes digitales.

Con respecto a las instrucciones, algunas tardan mas ejecutarse que otras debido principalmente a su ciclo de ejecución. Además el numero de instrucciones que el micro- procesador procesa esta acotado por el tamaño de la memoria ROM. El ciclo de instrucción que no es mas que la suma del ciclo de fetch y el ciclo de ejecución es fijo y no depende de la cantidad de datos a procesar

Con respecto a las memorias, estas funcionan por flanco de bajada y los registros por flanco de subida aunque pueden intercambiarse pero manteniendo esa estructura debido a que los datos deben estar estables antes de ser procesados.

Por otro lado el tamaño de los registros determina la cantidad de datos que el microproce- sador puede procesar en un ciclo de reloj, cuanto mayor sea este mayor volumen de datos podrá procesar en un mismo tiempo.

Es posible añadir nuevas instrucciones ampliando el bus de direcciones de la ROM pero este hecho conlleva tener que modificar la arquitectura del microprocesador para adaptarla a su nueva condición

Es también posible mejorar el rendimiento del procesador optimizando el conjunto de

(12)

instrucciones, haciendo instrucciones mas simples y no tan complejas.

Palabras clave:microprocesador, ciclo de instrucción, simulación, Unidad de Proceso (UP), Unidad de Control (UC).

(13)

C

APÍTU

1

I NTRODUCCIÓN

Los microprocesadores se hallan presente en la mayoría de dispositivos actualmente desde aparatos sencillos como electrodomésticos, hasta ordenadores personales donde es necesario un Sistema Operativo (SO) que gestione los recursos tanto hardware como software para su funcionamiento.

La diversificación de microprocesadores hace necesario su estudio y caracterización, debi- do a que tienen aplicación directa e indirecta en muchos campos de la ingeniería como la electrónica, aeronáutica, informática, etc.

Los microprocesadores forman parte de sistemas que requieren un control y es este el que les brinda las herramientas, instrucciones y datos, para poder llevarlas a cabo. Por todo esto se estudiara la arquitectura de un microprocesador [2],[3].

Para diseñar la arquitectura del microprocesador primeramente se ha recopilado in- formación relativa él, seguidamente se procedió a programar en VHDL cada una de las partes que lo componen ( [4], [5], [6], [7]), posteriormente se procedió a ensamblar cada una de las partes hasta crear un bloque funcional, simular el proyecto con el programa modelsim , cargar el proyecto en la placa altera con la ayuda del programa Quartus II, realizar pruebas para comprobar su correcto funcionamiento.

El proyecto se divide en 3 partes:

Unidad de Control (UC), Unidad de Proceso (UP), memoria RAM, adicionalmente consta también de un regulador de frecuencia y dos bloque de control del LCD.

La Unidad de Control (UC) a su vez esta compuesta de componentes como son:

• Sequenciador

• Multiplexor de condición de entradas

• microPc

• Incrementador

(14)

• Decodificador de instrucciones

• Ctrlsq

• Batería de puertas ands

• Memoria rom

La Unidad de Proceso (UP) esta compuesta de:

• 2 Registros de operación con datos

• Registros de operación con instrucciones

• ALU (unidad aritmético lógica)

• 2 buses de datos internos

Finalmente tenemos la memoria RAM:

• RAM: La cual contiene el programa a ejecutar, esta compuesta de instrucciones que el microprocesador entiende y también una parte de datos que es con la cual trabaja.

Los resultados de ejecución pueden ser almacenados en la memoria, con lo que es normal que exista una zona reservada a resultados. Los datos y resultados suelen ser externos al microprocesador,(suitches, leds, etc) ya que estos se mapean a una posición de la memoria RAM.

Paralelo al diseño del microprocesador hay dos componentes:

• regulador de frecuencia: permite regular el ciclo de reloj mediante el control de un switch de la placa de altera, este switch marca la velocidad de proceso así como la velocidad de acceso a las memorias ROM y RAM.

• 2 controladores de LCD: el primer controlador convierte los datos de los registros en datos que el LCD puede visualizar y gestiona los envíos al LCD. El segundo controlador inicializa el LCD y marca los tiempos de envíos de datos al LCD y su ejecución.

La velocidad de operación en el LCD viene marcada por el ciclo de reloj de 50 MHz que proviene del oscilador que lleva incorporado la placa altera.

En este proyecto se presenta paso a paso el diseño de cada componente así como una simulación de cada una de sus partes si fuese necesario. Al final se mostrara el microprocesador con todas sus partes integradas así como una simulación de ello.

(15)

C

APÍTU

2

CPU, PARTES DE UN MICROPROCESADOR

2.1 Unidad de Proceso (UP)

La unidad de proceso forma una papel importante ya que es el encargado de mover los datos e instrucciones, acceder a la memoria RAM mediante sus buses para leer o escribir, en ella también se encuentran los registros que no son mas que elementos de memoria que guardan los datos que serán procesados. Los registros son los dispositivos de memoria con los que finalmente trabaja el micro.

Los componentes de la Unidad de Proceso (UP) son:

• 2 registros de uso general R1, R2

• Un registro IR, Instruction Register

• Un registro PC, Program Counter

• Un registro MAR, Memory Address Register

• Un registro MDR, Memory Data Register

• Un registro ACC, Acumulador

• Una unidad aritmético lógica, ALU

• Otros elementos como:

– Multiplexor de 2 canales de 12 bits – 6 tri-estados

– 2 buses de datos

(16)

R1

R2

IR

PC

MAR

MDR

ACC

ALU

A B

MEMORIA RAM

C

BUS 2 BUS 1

FLAGS

Figura 2.1: Estructura de la unidad de proceso 2.1.1 Registros de uso general

Se ha diseñado dos registros de uso general que se pueden utilizar para realizar operaciones o guardar resultados.

El código vhdl para implementar los registros es:

1 l i b r a r y i e e e ;

u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

3

e n t i t y r e g i s

5 p o r t (

Ck : i n s t d _ l o g i c;

(17)

7 a s y n R e s e t n : i n s t d _ l o g i c;

D a t a i n : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ;

9 Load : i n s t d _ l o g i c;

D a t a o u t : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 )

11 ) ; end e n t i t y;

13

a r c h i t e c t u r e b e h a v e o f r e g i s

15 b e g i n

p r o c e s s( Ck , a s y n R e s e t n ) i s

17 v a r i a b l e s t a t e : s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; b e g i n

19

i f( a s y n R e s e t n = ’ 0 ’ ) t h e n s t a t e : = " 0 0 0 0 0 0 0 0 0 0 0 0 " ;

21

e l s i f ( Ck ’ e v e n t and Ck = ’ 1 ’ ) t h e n

23

i f( Load = ’ 1 ’ ) t h e n

25 s t a t e : = D a t a i n ;

end i f;

27

end i f;

29 D a t a o u t <= s t a t e ; end p r o c e s s;

31 end b e h a v e ;

Listing 2.1: Registro de uso general

Como se observa en el código de arriba, la entity define los puertos, consta de 5 puertos 4 de entradas y uno de salida. Una señal de reloj, Ck para coordinar el registro, una señal asynResetn para borrar el contenido del registro, Datain que corresponde a los datos a guardar, una señal Load para cargar el registro y Dataout como salida.

Su funcionamiento es sencillo y esta definido en su arquitectura, la señal Load carga los datos que llegan por Datain en un flanco de subida y los envía a DataOut. Si no vuelve a ver una nueva carga mediante la señal Load se mantiene el ultimo valor de Dataout. La señal AsynResetn tiene mayor prioridad que el flanco. AsynResetn es una señal asíncrona.

Figura 2.2: registro de uso general 2.1.2 IR, Instruction Register

La instrucción que se esta procesando, se almacena en el ciclo de fetch en este registro para su posterior tratamiento. En el ciclo de ejecución se determina si se hará uso de esté.

Algunas instrucciones como LOAD o STR o instrucciones de salto hacen uso de este registro para extraer la dirección física desde donde extraer o hacia donde guardar los

(18)

datos en memoria o a que dirección del programa saltar respectivamente.

El código vhdl para implementar este registro es:

l i b r a r y i e e e ;

2 u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

4 e n t i t y r e g i s p o r t (

6 Ck : i n s t d _ l o g i c;

a s y n R e s e t n : i n s t d _ l o g i c;

8 D a t a i n : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; Load : i n s t d _ l o g i c;

10 D a t a o u t : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ) ;

12 end e n t i t y;

14 a r c h i t e c t u r e b e h a v e o f r e g i s b e g i n

16 p r o c e s s( Ck , a s y n R e s e t n ) i s

v a r i a b l e s t a t e : s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ;

18 b e g i n

20 i f( a s y n R e s e t n = ’ 0 ’ ) t h e n s t a t e : = " 0 0 0 0 0 0 0 0 0 0 0 0 " ;

22 e l s i f ( Ck ’ e v e n t and Ck = ’ 1 ’ ) t h e n

24 i f( Load = ’ 1 ’ ) t h e n

s t a t e : = D a t a i n ;

26 end i f;

28 end i f;

D a t a o u t <= s t a t e ;

30 end p r o c e s s; end b e h a v e ;

Listing 2.2: Instruction Register

Como se observa en el código vhdl de arriba su funcionamiento es idéntico a los registros de uso común, lo que varia es su utilidad.

2.1.3 PC, Program Counter

Encargado de almacenar la dirección física de la siguiente instrucción a ejecutar. La dirección corresponde a una dirección de la memoria RAM.

El código vhdl para implementar este registro es:

l i b r a r y i e e e ;

2 u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

4 e n t i t y f f 1 2 i s p o r t (

6 d a t a i n : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; ck : i n s t d _ l o g i c;

8 g l R e s e t n : i n s t d _ l o g i c; l o a d : i n s t d _ l o g i c;

10 i n i t : i n s t d _ l o g i c;

d a t a o u t : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 )

12 ) ; end f f 1 2 ;

14

(19)

a r c h i t e c t u r e b e h a v e o f f f 1 2 i s

16 b e g i n

p r o c e s s( ck , g l R e s e t n ) i s

18 v a r i a b l e s t a t e : s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; b e g i n

20

i f( g l R e s e t n = ’ 0 ’ ) t h e n s t a t e : = " 0 0 0 0 0 0 0 0 0 0 0 0 " ;

22

e l s i f ( ck ’ e v e n t and ck = ’ 1 ’ ) t h e n

24

i f( l o a d = ’ 1 ’ ) t h e n

26 i f( i n i t = ’ 1 ’ ) t h e n s t a t e : = " 0 0 0 0 0 0 0 0 0 0 0 0 " ; −−v a l o r p r e d e t e r m i n a d o e l s i f( i n i t = ’ 0 ’ ) t h e n s t a t e : = d a t a i n ;

28 end i f;

end i f;

30

end i f;

32 d a t a o u t <= s t a t e ; end p r o c e s s;

34 end b e h a v e ;

Listing 2.3: Program Counter

Como se observa en el código de arriba, la entity es similar a los anteriores registros mostrados con la diferencia de que esté tiene una señal adicional llamada init. Esta señal permite inicializar a una dirección predeterminada, en el código de arriba a 0x000 en hexadecimal. Esta dirección hace referencia a una dirección de la memoria RAM y representa el lugar a partir del cual empieza a ejecutarse el programa. La linea de código de inicialización es la 26, no confundir con la linea 21, esta ultima pone el registro a 0 y es casualidad que coincida con la anterior linea.

Figura 2.3: Registro Program Counter 2.1.4 MAR, Memory Address Register

Encargado de guardar la dirección física donde se hará una operación de lectura o escritura.

El código vhdl es idéntico a los registros de uso común.

2.1.5 MDR, Memory Data Register

Encargado de guardar un dato relacionado con la memoria ram para una operación de lectura o escritura.

(20)

El código vhdl es idéntico a los registros de uso común.

2.1.6 ACC, Acumulador

Encargado de almacenar temporalmente el primer operando de la ALU.

Este registro conecta el bus de datos que viene del tri-estado con el operando A de la ALU. Esto es así debido a que solo disponemos de un único bus de salida de los registros y también por que para realizar una operación con 2 operandos(A y B) la ALU necesita que estén disponibles en el ciclo de calculo.

El código vhdl es idéntico a los registros de uso común.

2.1.7 ALU, Unidad Aritmético Lógica

Encargado de realizar las operaciones de procesamiento de datos

El código vhdl para implementar este componente lo dividimos en 3, para profundizar en los detalles de su funcionamiento:

l i b r a r y i e e e ;

2 u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l; u s e i e e e . n u m e r i c _ s t d .a l l;

4 u s e i e e e . s t d _ l o g i c _ u n s i g n e d .a l l; u s e i e e e . s t d _ l o g i c _ a r i t h .a l l;

6 u s e i e e e . n u m e r i c _ b i t .a l l;

8 e n t i t y ALU i s p o r t(

10 A : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; B : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ;

12 s e l : i n s t d _ l o g i c _ v e c t o r( 2 downto 0 ) ; Ck : i n s t d _ l o g i c;

14 C : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; C a r r y : o u t s t d _ l o g i c;

16 z e r o : o u t s t d _ l o g i c; n e g a t i v e : o u t s t d _ l o g i c

18 ) ;

end e n t i t y;

Listing 2.4: Unidad aritmético lógica - entity

El código de arriba corresponde a la entity de la ALU, en el se define los puertos de entrada y salida. Las señales A y B corresponden a los operandos de entrada, la señal sel codifica el tipo de operación que se quiera llevar a cabo, las operaciones que existen están detalladas a continuación:

• sel=000, realiza paso transparente de los datos de B hacia C

• sel=001, realiza la resta A−C y el resultado sale por C

• sel=010, realiza la sumaA+C y el resultado sale por C

• sel=011, realiza una mascara de los 4 primeros bits de B y el resultado va hacia C

• sel=100, realiza un incremento en 1 a B por tantoC=B+1

(21)

• sel=101, realiza una rotación de los datos de B mas el carry,

• sel=110, realiza un desplazamiento de los datos de B incluyendo el carry sin variar el carry

• sel=111, no definido, se puede añadir una operación mas

Por otro lado están las señales de salida, como C que es el resultado de una operación, ademas tenemos unos indicadores, también llamados flags, Carry, zero, negative.

• Carry, indica si la operación actual tiene un carry

• zero, indica si la operación actual da como resultado cero en sus doce últimos bits

• negative, indica si la operación actual da como resultado un numero negativo Finalmente esta la señal Ck que no es mas que el reloj del sistema, su presencia es debido principalmente para coordinar las salidas de los flags.

1 a r c h i t e c t u r e b e h a v e o f ALU i s

s i g n a l r e s u l t a d o : s t d _ l o g i c _ v e c t o r( 1 2 downto 0 ) ;

3 s i g n a l c a r r y V : s t d _ l o g i c;

5 b e g i n

7 comb : p r o c e s s( s e l , A , B )

v a r i a b l e temp : s t d _ l o g i c _ v e c t o r( 1 2 downto 0 ) ;

9 b e g i n

c a s e s e l i s

11 when " 000 " => temp : = ’ 0 ’ & B ; −−p a s o t r a n s p a r e n t e

when " 001 " => temp : = ( ’ 0 ’ & A) + ( ’ 0 ’ & n o t( B ) ) + 1 ; −−r e s t a

13 when " 010 " => temp : = ( ’ 0 ’ & A) + ( ’ 0 ’ & B ) ; −−suma

when " 011 " => temp : = ’ 0 ’ & ( B and " 0 0 0 0 1 1 1 1 1 1 1 1 " ) ; −−m a s c a r a de 8 b i t s

15 when " 100 " => temp : = ( ( ’ 0 ’ & B ) + 1 ) ; −−i n c r e m e n t

when " 101 " => temp : = ( ’ 0 ’ & ( t o _ s t d l o g i c v e c t o r ( t o _ b i t v e c t o r ( B ) s r l 1 ) ) )

; −−r o t a c i o n ( R ) i n c l u yendo c a r r y

17 temp ( 1 2 ) : = B ( 0 ) ;

temp ( 1 1 ) : = c a r r y V ;

19 when " 110 " => temp : = ( ’ 0 ’ & ( t o _ s t d l o g i c v e c t o r ( t o _ b i t v e c t o r ( B ) s r l 1 ) ) )

; −−d e s p l a z a m i e n t o ( R ) i n c l u yendo c a r r y temp ( 1 1 ) : = c a r r y V ;

21 when o t h e r s => temp : = "XXXXXXXXXXXXX" ; end c a s e;

23

r e s u l t a d o <= temp ;

25 end p r o c e s s comb ;

27 r e g : p r o c e s s( Ck ) b e g i n

29

i f( Ck ’ e v e n t and Ck = ’ 1 ’ ) t h e n

31

i f( s e l = " 001 " o r s e l = " 010 " o r s e l = " 100 " o r s e l = " 101 " o r s e l = " 110 " ) t h e n

33

i f( s e l = " 001 " o r s e l = " 010 " o r s e l = " 101 " o r s e l = " 110 " ) t h e n −−c a s o e s p e c i a l de l a s e n a l z e r o

35

i f( r e s u l t a d o ( 1 1 downto 0 ) = " 0 0 0 0 0 0 0 0 0 0 0 0 " ) t h e n z e r o < = ’ 1 ’ ;

37 e l s e z e r o < = ’ 0 ’ ;

end i f;

39

end i f;

(22)

41

n e g a t i v e <= r e s u l t a d o ( 1 2 ) ;

43 c a r r y <= r e s u l t a d o ( 1 2 ) ; c a r r y V <= r e s u l t a d o ( 1 2 ) ;

45 end i f;

end i f;

47

end p r o c e s s r e g ;

49

C<= r e s u l t a d o ( 1 1 downto 0 ) ;

51

end a r c h i t e c t u r e;

Listing 2.5: Unidad aritmético lógica - arquitectura

El código de arriba es la arquitectura de la ALU y representa el funcionamiento de está. Como se puede observar esta compuesta de 2 procesos, un proceso combinacional y otro secuencial. Esta diferencia viene dada por que en el proceso combinacional todas sus señales están en su lista de sensibilidad. en cambio en el proceso secuencial solo se encuentran algunas señales, en este caso el reloj.

comb : p r o c e s s( s e l , A , B )

2 v a r i a b l e temp : s t d _ l o g i c _ v e c t o r( 1 2 downto 0 ) ; b e g i n

4 c a s e s e l i s

when " 000 " => temp : = ’ 0 ’ & B ; −−p a s o t r a n s p a r e n t e

6 when " 001 " => temp : = ( ’ 0 ’ & A) + ( ’ 0 ’ & n o t( B ) ) + 1 ; −−r e s t a when " 010 " => temp : = ( ’ 0 ’ & A) + ( ’ 0 ’ & B ) ; −−suma

8 when " 011 " => temp : = ’ 0 ’ & ( B and " 0 0 0 0 1 1 1 1 1 1 1 1 " ) ; −−m a s c a r a de 8 b i t s when " 100 " => temp : = ( ( ’ 0 ’ & B ) + 1 ) ; −−i n c r e m e n t

10 when " 101 " => temp : = ( ’ 0 ’ & ( t o _ s t d l o g i c v e c t o r ( t o _ b i t v e c t o r ( B ) s r l 1 ) ) )

; −−r o t a c i o n ( R ) i n c l u yendo c a r r y temp ( 1 2 ) : = B ( 0 ) ;

12 temp ( 1 1 ) : = c a r r y V ;

when " 110 " => temp : = ( ’ 0 ’ & ( t o _ s t d l o g i c v e c t o r ( t o _ b i t v e c t o r ( B ) s r l 1 ) ) )

; −−d e s p l a z a m i e n t o ( R ) i n c l u yendo c a r r y

14 temp ( 1 1 ) : = c a r r y V ;

when o t h e r s => temp : = "XXXXXXXXXXXXX" ;

16 end c a s e;

18 r e s u l t a d o <= temp ; end p r o c e s s comb ;

Listing 2.6: Unidad aritmético lógica - proceso comb

En el proceso comb, las operaciones se realizan inmediatamente y su salida la señal resultado se actualiza en ese instante, esta señal se utiliza en el proceso reg para determinar los flags de la operación.

Este proceso es combinacional por lo que cualquier variación en los operandos A o B o por un cambio repentino de operación en sel, conseguirá que se recalcule la salida resultado.

1 r e g : p r o c e s s( Ck ) b e g i n

3

i f( Ck ’ e v e n t and Ck = ’ 1 ’ ) t h e n

5

i f( s e l = " 001 " o r s e l = " 010 " o r s e l = " 100 " o r s e l = " 101 " o r s e l = " 110 " ) t h e n

7

i f( s e l = " 001 " o r s e l = " 010 " o r s e l = " 101 " o r s e l = " 110 " ) t h e n −−c a s o e s p e c i a l de l a s e n a l z e r o

9

i f( r e s u l t a d o ( 1 1 downto 0 ) = " 0 0 0 0 0 0 0 0 0 0 0 0 " ) t h e n z e r o < = ’ 1 ’ ;

11 e l s e z e r o < = ’ 0 ’ ;

(23)

end i f;

13

end i f;

15

n e g a t i v e <= r e s u l t a d o ( 1 2 ) ;

17 c a r r y <= r e s u l t a d o ( 1 2 ) ; c a r r y V <= r e s u l t a d o ( 1 2 ) ;

19 end i f;

end i f;

21

end p r o c e s s r e g ;

Listing 2.7: Unidad aritmético lógica - proceso reg

En el proceso reg, se observa que el código principal esta dentro de un if con condición de flanco ascendente, esto significa que los flags se actualizaran cuando haya un flanco ascendente; su estructura es similar a un registro.

Por otro lado se observa que los flags se actualizan para un conjunto de operaciones de la ALU.

• Las operaciones que actualizan los flags negative, carry son:

– operación resta – operación suma – operación incremento – operación rotación con carry – operación desplazamiento con carry

– la operación paso transparente y mascara mantienen los flags anteriores

• Las operaciones que actualizan el flag zero son:

– operación resta – operación suma

– operación rotación con carry – operación desplazamiento con carry

– la operación paso transparente, incremento y mascara mantiene el flag anterior

En definitiva en un ciclo de reloj el proceso comb realiza el calculo lo mas pronto posible, el resultado de la operación es enviado al proceso reg que en el flanco ascendente mas cercano actualizara los flags.

(24)

Figura 2.4: Componente ALU

2.1.8 Otros componentes

Multiplexor:

Además de los mencionados anteriormente, se ha diseñado un multiplexor de 2 cana- les de 12 bits. Su función es multiplexar el bus de datos que viene de la ALU y el bus que viene de la memoria RAM mediante un selector que es controlado por la unidad de control. La salida del multiplexor conecta con el registro MDR ya explicado anteriormente.

El código vhdl para implementar este componente es el siguiente:

l i b r a r y i e e e ;

2 u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

4 e n t i t y mux12_2 i s p o r t(

6 Bus_x , Mem: i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; MDRmem: i n s t d _ l o g i c;

8 MDRin : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ) ;

10 end e n t i t y;

12 a r c h i t e c t u r e m u x 1 2 _ 2 _ d a t a f l o w o f mux12_2 i s b e g i n

14 w i t h MDRmem s e l e c t MDRin <= b u s _ x when ’ 0 ’ ,

16 Mem when ’ 1 ’ ,

"XXXXXXXXXXXX" when o t h e r s; −−don ’ t c a r e

18 end m u x 1 2 _ 2 _ d a t a f l o w ;

Listing 2.8: Multiplexor de 2 canales de 12 bits

Bus_x es el bus de datos que viene de la salida de la ALU, Mem es el bus de datos que viene de la memoria RAM, MDRmem es el selector de buses y MDRin es la salida del multiplexor que conecta con el registro MDR. Se puede observar su funcionamiento en su arquitectura.

(25)

Figura 2.5: Componente multiplexor de 12 bits

Tri-estado:

La función del tri-estado es permitir la conexión de los registros con el bus de datos. Esto es debido a que todos los registros, a excepción del registro ACC, están conectados a un único bus; esta situación puede provocar que haya un colapso en el bus. Por defecto los tri-estados están en alta impedancia hasta que se habilite alguno y dar salida a los datos del registro hacia el bus; este bus conecta con la entrada del operando B de la ALU.

El código vhdl para implementar este componente es el siguiente:

1 l i b r a r y i e e e ;

u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

3

e n t i t y t r i _ s t a t e i s

5 p o r t(

e n a : i n s t d _ l o g i c;

7 A : i n s t d _ l o g i c _ v e c t o r( 1 1 downto 0 ) ; F : o u t s t d _ l o g i c _ v e c t o r( 1 1 downto 0 )

9 ) ;

end t r i _ s t a t e ;

11

a r c h i t e c t u r e t r i _ s t a t e _ d a t a f l o w o f t r i _ s t a t e i s

13 b e g i n

15 F<= A when ( e n a = ’ 1 ’ ) e l s e (o t h e r s => ’Z ’ ) ;

17 end t r i _ s t a t e _ d a t a f l o w ;

Listing 2.9: Tri-estado

Como se observa en el código de arriba la señal ena controla el paso de datos, esta señal es controlada por la unidad de control, la señal A es el puerto de entrada del tri-estado y viene de un registro, y F la salida al bus.

La Unidad de Proceso (UP) cuenta con 6 tri-estados, conectados a la salida de los registros a excepción del registro ACC que no tiene ninguno.

(26)

Figura 2.6: Componente tri-estado Bus de datos

La Unidad de Proceso (UP) cuenta con 2 buses, son los encargados de transportar datos de los registros, desde los registros y hacia los registros.

• Bus 1 : conecta la salida de los triestados con el operando B de la ALU, además conecta con el registro ACC.

• Bus 2 : conecta la salida de datos de la ALU con los registros R1, R2, IR, PC, MAR y con una entrada del multiplexor de 2 canales de 12 bits.

Ambos buses son de 12 bits debido a que son la cantidad de datos que son capaces de guardar los registros.

No existe código VHDL dedicado a estos porque se implementan cada uno median- te una linea de código en el programa que ensambla los registros, ALU, tri-estado y multiplexor. Esté ultimo componente se llama Unidad de Proceso (UP).

2.1.9 Visión global - Unidad de proceso

La unidad de proceso tiene las siguientes entradas y salidas:

• Entradas

– Ck: señal de reloj de todos los registros – glResetn: señal de reset de los registros

– R1Load, R2Load, IRLoad, PCLoad, MARLoad, MDRLoad, ACCLoad: señal de carga de los registros, cuando una señal load se activa el correspondiente registro carga el dato de entrada

– PCinit: señal que inicializa la dirección de la memoria RAM a un valor predeterminado

– R1out, R2out, IRout, PCout, MARout, MDRout: señal de control de los tri- estados, permiten la salida de los registros al bus de datos 1

– ALUcode[2..0]: señal que indica la operación a realizar

– MEM[11..0]: señal de datos que vienen de la memoria RAM conectado con una de las entradas del multiplexor. También conocido como bus de datos de la RAM

(27)

– MDRmem: Señal que permite elegir entre el bus de datos de la RAM y el bus de datos 2; esta señal permite que en la entrada del registro MDR haya algún bus de datos seleccionado.

• Salidas

– Carry: flag de salida de la ALU – Zero: flag de salida de la ALU – Negative: flag de salida de la ALU

– R1data, R2data,PCdata, ACCdata: bus de datos que van conectados al LCD – IRdata: bus de datos que van al LCD, y también a la unidad de control; los 4

bits de mas peso codifican la instrucción.

– MARdata: bus de direcciones que conecta con la memoria RAM y con el LCD – MDRdata: bus de datos que conecta con la memoria RAM y con el LCD

Figura 2.7: Componente unidad de proceso

(28)

R1

R2

IR

PC

MAR

MDR

ACC

ALU glResetn

ck R1load

glResetn ck

glResetn ck

glResetn ck

glResetn ck

glResetn ck R2load

IRload

PCinit PCload

MARload

MDRload

glResetn ck ACCload

BUS2[11..0]

BUS1[11..0]

carry zero negative ck

ALUcode MDRmem

MEM[11..0]

R1data

R2data

IRdata

PCdata

MARdata

MDRdata

ACCdata

A B

C glResetn

ck

UNIDAD DE PROCESO

R1out

R2out

IRout

PCout

MARout

MDRout

Figura 2.8: Estructura interna de la unidad de proceso

(29)

2.2 Unidad de Control (UC)

La Unidad de Control (UC), al igual que la Unidad de Proceso (UP), es una parte fun- damental en el microprocesador, ya que sin este no se podría ejecutar las instrucciones almacenadas en la memoria RAM. La unidad de control genera una secuencia de ordenes para ejecutar una instrucción. Estas ordenes las recibe la unidad de proceso que se encarga de adecuar los registros, para finalmente procesar la instrucción.

En nuestro caso las instrucciones son de 12 bits, tamaño de datos de la memoria RAM.

Los 4 bits mas significativos (opcode) codifican la instrucción. Como se puede observar con 4 bits se puede codificar un total de 16 instrucciones, este grupo de instrucciones es comúnmente conocido como conjunto de instrucciones.

El resto de bits, los 8 bits menos significativos, pueden tener significados diferentes dependiendo a la instrucción que acompañen:

• representar un dato numérico, ejemplo 0x04

• representar una dirección de la memoria RAM donde se encuentran los datos a procesar

• representar una dirección de salto en caso de ser una instrucción de salto

• representar nada, en cuyo caso esta región de la instrucción estaría a 0x00

Conocido el formato de las instrucciones; se puede entender su procesamiento. Cada instrucción se implementa mediante un conjunto de microinstrucciones almacenadas en la memoria ROM. Estas microinstrucciones contienen todas las señales de control de la unidad de proceso necesarias para mover el flujo de datos de la unidad de proceso y así poder ejecutar una instrucción.

Para llevar a cabo este flujo de datos, la unidad de control tiene estos componentes:

• Un sequenciador

• Un componente llamado, IRdecoder

• Un multiplexor de condiciones de entrada

• Un bloque CtrlSeq

• Una bateria de puertas AND

• Una memoria rom 2.2.1 Sequenciador

El sequenciador es el encargado de entregar en su salida la dirección de microinstrucción siguiente a ejecutar. Como se ha mencionado en la sección de introducción cada microins- trucción ocupa una dirección de memoria de la ROM.

(30)

Tiene 3 modos de funcionamiento en función de las señales w3 y w1 que provienen de la microinstrucción que se este ejecutando:

• Modo de incremento del microPC

– w3w1=00 ó 11, permite generar la siguiente microinstrucción a ejecutar a partir de la microinstrucción anterior.

• Modo de carga de dirección de salto

– w3w1=01, permite cargar una dirección de salto de la ROM; la microinstruc- ción que se esta ejecutando lleva explicito una dirección de salto a otro punto de la memoria ROM.

• Modo de carga de dirección de salto externa

– w3w1=10, permite cargar una dirección de salto externa. Se utiliza este modo para indicar la dirección de la ROM donde se encuentra el inicio del ciclo de ejecución de una instrucción, previa decodificación del IRdecoder.

Los componente que hacen posible estos modos de funcionamiento dentro del sequen- ciador son:

Multiplexor

Multiplexor de 4 canales de 8 bits, con dos bits de selección w3 y w1 (de mayor peso y menor peso respectivamente).

El código vhdl para implementar este componente es el siguiente:

1 l i b r a r y i e e e ;

u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

3

e n t i t y mux8_4 i s

5 p o r t(

d a t a 0 x , d a t a 1 x , d a t a 2 x , d a t a 3 x : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

7 s e l : i n s t d _ l o g i c _ v e c t o r( 1 downto 0 ) ; r e s u l t : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 )

9 ) ;

end e n t i t y;

11

a r c h i t e c t u r e m u x 8 _ 4 _ d a t a f l o w o f mux8_4 i s

13 b e g i n

w i t h s e l s e l e c t

15 r e s u l t <= d a t a 0 x when " 00 " , −−s a l i d a i n c r e m e n t a d o r d a t a 1 x when " 01 " , −−i n p u t _ a d r e s s

17 d a t a 2 x when " 10 " , −−d e c o o d I n s t r u c d a t a 3 x when " 11 " , −−s a l i d a i n c r e m e n t a d o r

19 "XXXXXXXX" when o t h e r s; −−don ’ t c a r e

end m u x 8 _ 4 _ d a t a f l o w ;

Listing 2.10: Multiplexor de 4 canales de 8 bits

Como se observa en el código de arriba tiene 4 puertos de datos de 8 bits, data0x, data1x, data2x y data3x. Una señal sel de 2 bits, esta señal esta conectada a w3 y w1 señales que vienen de CtrlSeg. Una señal result de 8 bits que esta conectada con el regis- tro microPC; esta ultima señal le indica al microPC cual es la siguiente dirección de la

(31)

memoria ROM que tiene que enviar a la ROM.

Las conexiones de los datanx son las de la arquitectura del código de arriba:

• data0x y data3x : conecta con la salida del incrementador

• data1x : conecta con una sección del bus de salida de la memoria ROM; en concreto con la sección de dirección de salto.

• data2x : conecta con la salida del IRdecoder, esté envía direcciones del inicio del ciclo de ejecución de una instrucción, como un puntero a la memoria ROM.

Figura 2.9: Componente multiplexor de 8 bits MicroPC

Es un registro como los mencionados en apartados anteriores, solo que en este caso es de 8 bits y no de 12. Su función es almacenar la dirección siguiente de la microinstrucción a ejecutar.

El código vhdl para implementar este componente es el siguiente:

1 l i b r a r y i e e e ;

u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

3

e n t i t y f f 8 i s

5 p o r t (

d a t a i n : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

7 ck : i n s t d _ l o g i c; g l R e s e t n : i n s t d _ l o g i c;

9 d a t a o u t : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ) ;

11 end f f 8 ;

13 a r c h i t e c t u r e b e h a v e o f f f 8 i s b e g i n

15 p r o c e s s( ck , g l R e s e t n ) i s

v a r i a b l e s t a t e : s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

17 b e g i n

i f( g l R e s e t n = ’ 0 ’ ) t h e n s t a t e : = " 00000000 " ;

19

e l s i f ( ck ’ e v e n t and ck = ’ 1 ’ ) t h e n

21 s t a t e : = d a t a i n ;

(32)

end i f;

23

d a t a o u t <= s t a t e ;

25 end p r o c e s s;

27 end b e h a v e ;

Listing 2.11: Registro de 8 bits - MicroPC

Esta conectado a la salida del multiplexor de 4 canales de 8 bits, al reloj del sistema, a una señal de reset y su salida esta conectado a la entrada del incrementador y a la salida del sequenciador; la salida del sequenciador esta conectado al bus de direcciones de la memoria ROM.

Su funcionamiento varia un poco al de los registros mostrados en otras secciones, ya que se observa que no existe una señal load. Cada ciclo de reloj, en el flanco de subida, se cargan los datos a la salida del registro. Esta forma de funcionar se debe a que en cada ciclo de reloj se ejecuta una microinstrucción.

Figura 2.10: Componente Registro microPC Incrementador

Encargado de incrementar en una unidad el valor introducido en su entrada.

El código vhdl para implementar este componente es el siguiente:

1 l i b r a r y i e e e ;

u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

3 u s e i e e e . s t d _ l o g i c _ u n s i g n e d .a l l; u s e i e e e . s t d _ l o g i c _ a r i t h .a l l;

5

e n t i t y i n c r e m e n t a d o r i s

7 p o r t (

A : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

9 A _ P l u s : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ) ;

11 end i n c r e m e n t a d o r ;

13 a r c h i t e c t u r e b e h a v e o f i n c r e m e n t a d o r i s b e g i n

15 p r o c e s s(A) b e g i n

17 A_PLUS <= A + 1 ;

end p r o c e s s;

19

end b e h a v e ;

(33)

Listing 2.12: Incrementador

Su entrada esta conectado a la salida del registro microPC y su salida a 2 entradas del multiplexor de 4 canales de 8 bits.

Figura 2.11: Componente incrementador Visión global - Sequenciador

Los componentes anteriores dan forma al sequenciador, el funcionamiento correcto de cada componente es vital para que el conjunto se comporte adecuadamente.

El código vhdl para implementar la combinación de cada parte en una estructura nueva es el siguiente:

l i b r a r y i e e e ;

2 u s e i e e e . s t d _ l o g i c _ 1 1 6 4 .a l l;

4 e n t i t y s e q u e n c i a d o r i s p o r t(

6 c l o c k : i n s t d _ l o g i c; a s y n R e s e t n : i n s t d _ l o g i c;

8 w3 , w1 : i n s t d _ l o g i c;

i n p u t A d d r e s s : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

10 d e c o d I n s t r u c : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ; o u t p u t _ a d d r e s s : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 )

12 ) ; end e n t i t y;

14

a r c h i t e c t u r e s t r u c t u r a l o f s e q u e n c i a d o r i s

16 c o m p o n e n t f f 8 −−microPC p o r t (

18 d a t a i n : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ; ck : i n s t d _ l o g i c;

20 g l R e s e t n : i n s t d _ l o g i c;

d a t a o u t : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 )

22 ) ;

end c o m p o n e n t;

24

c o m p o n e n t i n c r e m e n t a d o r −−i n c r e m e n t a d o r

26 p o r t (

A : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

28 A _ P l u s : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ) ;

30 end c o m p o n e n t;

32 c o m p o n e n t mux8_4 −−m u l t i p l e x o r p o r t(

34 d a t a 0 x , d a t a 1 x , d a t a 2 x , d a t a 3 x : i n s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

(34)

s e l : i n s t d _ l o g i c _ v e c t o r( 1 downto 0 ) ;

36 r e s u l t : o u t s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ) ;

38 end c o m p o n e n t;

40 s i g n a l o u t p u t _ a d d r e s s _ i : s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ; s i g n a l n e w _ a d d r e s s _ i : s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ;

42 s i g n a l d a t a x _ i : s t d _ l o g i c _ v e c t o r( 7 downto 0 ) ; s i g n a l w3w1 : s t d _ l o g i c _ v e c t o r( 1 downto 0 ) ;

44

b e g i n

46 w3w1<= w3 & w1 ;

48 m i c r o P c : f f 8 p o r t map( n e w _ a d d r e s s _ i , c l o c k , a s y n R e s e t n , o u t p u t _ a d d r e s s _ i ) ; INC : i n c r e m e n t a d o r p o r t map( o u t p u t _ a d d r e s s _ i , d a t a x _ i ) ;

50 lpm_mux0 : mux8_4 p o r t map( d a t a x _ i , i n p u t A d d r e s s , d e c o d I n s t r u c , d a t a x _ i , w3w1 , n e w _ a d d r e s s _ i ) ;

52 o u t p u t _ a d d r e s s <= o u t p u t _ a d d r e s s _ i ; −−s a l i d a d e l s e q u e n c i a d o r end a r c h i t e c t u r e;

Listing 2.13: Sequenciador

Como se puede observar en el código de arriba, la entity de este componente tiene 7 puertos:

• Entrada

– clock: reloj del sistema conectado al registro interno microPC – asynResetn: un reset conectado al registro interno microPC

– w3, w1: dos señales de control que viene del bus de datos de la ROM, conec- tados con el multiplexor interno de 4 canales de 8 bits

– inputAddress: dirección de 8 bits que viene del bus de datos de la ROM, conectado también con el multiplexor interno

– decodInstruc: dirección de 8 bits que viene del IRdecoder, conectado con el multiplexor interno

• Salidas

– output_address: dirección de 8 bits conectado externamente con el bus de direcciones de la ROM y internamente con la salida del registro microPC Por otro lado tenemos la arquitectura:

• Arquitectura

– En las lineas [16-23], [25-30] y [32-38] están definidos los componentes microPC, incrementador y multiplexor de 4 canales de 8 bits respectivamente.

– En las lineas [40-43] están definidas las señales que se usan para conectar los componentes entre si.

– En la linea 46 convertimos 2 señales a un bus de 2 bits porque el componente multiplexor tiene como entrada un bus.

Referanser

RELATERTE DOKUMENTER

Una vez se comprueba que mediante el ejercicio físico se pueden conservar las habilidades cognitivas y, así, conseguir una buena vejez, se realiza este estudio con la

Por ejemplo, para un golfista: nivel 1- conseguir 50 puntos en bolos y 100 en dardos y así subiendo progresivamente (tareas y metas escalonadas) para poder ver si

Como se señaló antes, si el sujeto no tiene interacción con una persona será más propenso a ser deshonesto y además, en este caso, como el sujeto no puede

Como podemos observar en los gráficos, tanto en el Colegio Santísima Trinidad como en el de Vara de Rey, la comunicación entre las familias y los maestros es continua,

Según este estudio, se puede observar la eficacia de la terapia asistida con animales como tratamiento complementario en pacientes con fibromialgia para reducir el dolor y

Finalmente, se puede observar como el marketing digital y el comercio electrónico han provocado un cambio en el sector y para ello se va a centrar en las estrategias que

Para investigar esta cuestión, se realizó un cuestionario adaptado de Minera (2009) Motivación y Actitudes en el Aprendizaje de una Lengua Extranjera (MAALE), así como el

Para estos autores el estilo de respuesta rumiativo media en la relación entre el neuroticismo o afectividad negativa y los síntomas depresivos, considerando la