PROYECTO FINAL DISEÑO DE UN MICROPROCESADOR · PDF fileuniversidad autÒnoma de...

Post on 27-Feb-2018

219 views 3 download

Transcript of PROYECTO FINAL DISEÑO DE UN MICROPROCESADOR · PDF fileuniversidad autÒnoma de...

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 1

PROYECTO FINAL

DISEÑO DE UN MICROPROCESADOR

SISTEMAS ELECTRONICOS INDUSTRIALES

VICTOR PEREZ GACHUZ

JOSE ALFREDO MARTINEZ PEREZ

HÈCTOR ALONSO JIMÈNEZ OSORIO

PROFESOR: GUSTAVO MONTEMAYOR

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO

PLANTEL SAN LORENZO TEZONCO

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 2

INTRODUCCIÒN

Este trabajo presentara las bases para el diseño de un microprocesador, por medio de

los dispositivos lógicos programables en lenguajes de descripción de hardware de alto nivel, de

esta forma se logró vincular la teoría con la práctica, de manera que el diseño del

microprocesador, se manipulara empleando uno de los lenguajes de descripción de hardware

más utilizados en la actualidad como es Verilog HDL. Asi se daran a conocer las bases de la

lógica booleana, la lógica secuencial y del diseño de dispositivos digitales básicos necesarios

para el desarrollo de un microprocesador.

EL LENGUAJE DE HARDWARE VERILOG

Verilog aparecio en 1984 basicamente por Gateway Design Automation. Por lo que fue

bien recibida por todos los diseñadores de circuitos integrados y de sistemas digitales, en poco

tiempo se convirtió en uno de los lenguajes más usados y populares, debido a que es fácil de

aprender, pues los programadores encuentran mucha similitud con otros lenguajes como el ya

conocido lenguaje basado en C ó Pascal.

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 3

MÓDULOS

Es la unidad básica de un diseño en Verilog. Consiste de uno o varios módulos

organizados jerárquicamente que contienen información sobre el diseño, es decir, contienen

instancias de otros módulos. La cual debe contener una sintaxis precisa para la declaración de

un módulo como se muestra de la siguiente forma.

module <nombre_del_módulo> ( lista_de_puertos ) ;

//Declaración de la lista de puertos

//Código del módulo

endmodule

Es posible utilizar un módulo dentro de otro, solo se debe crear una instancia del módulo

deseado. Pues las instancias a módulos nos permiten utilizar la funcionalidad de esos módulos

pero dentro de otros.

PUERTOS

Un puerto es un nombre que representa una entrada o una salida hacia un módulo. La

declaración de los puertos de entrada/salida utilizan las siguientes palabras reservadas:

input, declara puertos de entrada;

output, declara puertos de salida;

einout, declara puertos bidireccionales.

BLOQUES PROCEDURALES

Los bloques procedurales descritos como initial y always, son básicos para el modelado

de comportamientos, representan flujos de tareas, y pueden ser secuenciales o concurrentes,

los bloques procedurales no pueden anidarse.

initial begin

// Sentencia o bloque de

sentencias

end;

always begin

// Sentencia o bloque de sentencias

end;

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 4

Un bloque always es activado al inicio de la simulación y continuará ejecutándose

durante toda la simulación mientras que el bloque initial tambien se activa al inicio de la

simulación pero sólo se ejecuta una vez.

EVENTOS

Permiten controlar la ejecución de una sentencia o bloque de sentencias. Es un cambio

de valor en una net o en un registro. Su especificación es utilizando el símbolo @ seguido por

el nombre de la net o del registro.

@ (nombre_de_la_net_o_del_registro)

Las sentencias escritas después del evento de control serán ejecutadas cuando el

evento o los eventos de control sean detectados. Los tipos más comunes de eventos son el

flanco de subida utilizamos la palabra reservada posedge y el flanco de bajada utilizamos la

palabra negedge de una señal.

SENTENCIAS DE CONTROL DE PROGRAMA

Son la esencia de cualquier lenguaje pues gobiernan el flujo de ejecución de un

programa. Las podemos clasificar en dos categorías. Por las instrucciones condicionales if y

case; y por las sentencias de control de bucles while, for, entre otras.

if ( expresión_condicional )

// Bloque de sentencias 1

else

// Bloque de sentencias 2

case ( expresión )

case_item_1: // Bloque de sentencias

1

case_item_n: // Bloque de sentencias

n

endcase

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 5

Bucle While

while ( expresión_condicional )

// Bloque de sentencias

Se ejecutará mientras la expresión

condicional sea verdadera y es

evaluada cada vez que el bucle inicia, si

la condición continúa siendo verdadera

entonces se ejecutará el bloque de

sentencias asociado, si no, el control

del programa pasará a la siguiente

instruccion fuera del bucle.

Bucle For

for(asignación_inicial;expresión;actualiza_contador);

begin

// Bloque de sentencias

end

Primero se inicializa el contador del

bucle como lo especifica

asignación_inicial, despues la

condición de salida dada por expresión

es evaluada, si es cero, desconocido o

alta impedancia, el bucle finaliza, de lo

contrario, el bucle continúa ejecutando

su bloque de sentencias, por último el

contador del bucle es modificado de

acuerdo a lo indicado por la expresión

actualiza_contador, asi sucesivamente

hasta que la expresión sea falsa.

Bucle Repeat

repeat ( expresión )

// Bloque de sentencias

Ejecuta un bloque de sentencias

determinado número de veces

especificado entre paréntesis después

de la palabra reservada repeat, puede

ser una constante o una variable, pero

debe ser un número entero. Es muy útil

en casos en los que se conoce por

adelantado el número de veces que se

desea ejecutar, por ejemplo, al

inicializar vectores y memorias.

Bucle Forever

forever

begin

// Bloque de sentencias

Comienza con la palabra reservada

Forever seguida de la sentencias o

bloque de sentencias que se desean

repetir, si el bloque de sentencias tiene

más de una sentencia, entonces

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 6

end deberán escribirse entre las palabras

begin y end para delimitar el bloque.

Repetirá el bloque de sentencias

continuamente hasta finalizar la

simulación, este bucle tiene la misma

funcionalidad que el bloque procedural

always.

TIPOS DE DATOS

Nets: Una net es un cable transportando un señal conectado a diferentes componentes lógicos

de un diseño o bien redes de conexión, actualizan continuamente sus salidas con respecto a

los cambios registrados en sus entradas. La siguiente figura, la net out_b está conectada a in_a

mediante una compuerta not; siempre el valor de in_a provocará cambios en out_b.

Regs (registros): La diferencia entre las nets y los regs, es que los registros tienen que ser

asignados con valores de manera explícita. El valor almacenado en un reg se mantendrá hasta

que un nuevo valor sea asignado y se declaran con la palabra reservada reg, su tamaño es de

un bit. Los registros pueden almacenar números negativos en complemento a dos, durante la

aritmética serán tratados como números sin signo.

Integers: Permiten almacenar números enteros negativos y positivos. Deben ser declarados

mediante la palabra reservada integer y su tamaño depende de la máquina host, pero al menos

son de 32 bits. Los enteros son muy parecidos a los registros, la diferencia es que los registros

son tratados como valores sin signo, en cambio, los integers son tratados como valores con

signo.

Las nets son declaradas mediante las siguientes palabras reservadas: wire, supply0, supply1, entre otras. Su tamaño por default es de 1 bit

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 7

Reales: Números que tienen parte entera y parte decimal. Cuando sean declarados debe

escribir al menos un dígito después del punto decimal. Ademas de la palabra reservada real, su

tamaño depende de la máquina host, pero al menos son de 64 bits. Puede ser convertido en

entero, solo redondeado al entero más cercano.

Declaración de tres variables del tipo real

real num1, num2, num3;

Time: Las variables time son registros de 64 bits que almacenan valores sin signo. Se declaran

utilizando la palabra reservada time.

Vectores: Sabemos que las nets y los regs son variables de un bit, si se desea usar una

variable de mayor tamaño se declarar como un vector. Los vectores pueden accederse

totalmente o parcialmente, podemos asignar valores a todo el vector o a algunos elementos de

él. La declaración de un vector es la siguiente:

<Tipo_de_dato> [Tamaño_del_vector] <Nombre_de_la_variable>

El [Tamaño_del_vector] representa el número de elementos que integran un vector. El

rango se declara colocando el valor del bit más significativo a la izquierda y el índice del bit

menos significativo a la derecha:

[Tamaño_del_vector] = [Bit_más_significativo : Bit_menos_significativo]

Se referencia a cada bit del vector de la siguiente forma:

<Nombre_de_la_variable> [Referencia_a_los_bits]

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 8

Ejemplo.

reg [3:0] salida; // salida es un registro de 4 bits, el bit más significativo es 3 y el bit menos

significativo es 0

wire [31:0] dato; // dato es una net de 32 bits

salida = 4’b0101; // vector salida.

dato[3:0] = salida; // vector dato.

Arreglos: Un arreglo (array) de elementos lleva la siguiente lógica:

<Tipo_de_dato> [Tamaño_del_vector] <Nombre_de_la_variable> [Tamaño_del_arreglo]

La referencia a los elementos del arreglo se hace de la siguiente manera.

<Nombre_de_la_variable> [Referencia_al_arreglo] [Referencia_a_los_bits]

FORMATO DE NÚMEROS ENTEROS

Pueden representarse en binario, decimal, hexadecimal u octal. El formato general para su

representación es:

<tamaño>’<base><número>

Valores X y Z: Existen dos valores especiales, x y z, que también se utilizan para representar

números. El valor x representa un valor desconocido y z un valor de alta impedancia. Una x

declara cuatro bits desconocidos en hexadecimal, tres en octal y uno en binario. Una z declara

valores de alta impedancia de manera similar a x.

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 9

El valor de z es muy útil para implantar circuitos tres estados, es aquel cuya salida

puede presentar un nivel lógico alto, un nivel lógico bajo o una alta impedancia, cuando la

salida se aísla del circuito. Son empleados donde las salidas de diversos componentes están

conectadas a un mismo bus, el circuito se asegura de conectar la salida adecuada al bus y de

aislar al resto de las salidas para evitar múltiples escrituras en el bus.

Operadores aritméticos: Símbolos: *, /, +, -, % son multiplicación, división, suma, sustracción

y módulo. Sean a, b y c tres vectores del tipo reg de 4 bits cada uno, donde a = 4’b1100 y b =

4’b0011 entonces,

Multiplicación: c = a * b = 4’b1000 (los cuatro bits menos significativos de 36)

División: c = a / b = 4’b0100

Adición: c = a + b = 4’b1111

Sustracción: c = a – b = 4’b1001

Módulo: c = a % b = 4’b0000

Operadores lógicos: Símbolos: !, &&, | | son AND lógico, OR lógico y NOT lógico. Verdadero

(1), falso (0) o desconocido (x). Un operando es verdadero si es diferente de cero, y falso si es

cero. Los valores de alta impedancia y desconocido evalúan a falso. Un operando puede ser

una variable o una expresión la cual será evaluada a verdadero o falso.

Si a = 4’b0010, b = 4’b0000 y c = 4’bxxxx entonces,

AND lógico: a && b evalúa a falso

OR lógico: a | | b evalúa a verdadero

OR lógico: a | | c evalúa a verdadero

NOT lógico: ! c evalúa a desconocido

Operadores de relación: Símbolos: >, <, >=, <= son mayor que, menor que, mayor o igual a,

y menor o igual a. Verdadero y falso se definen de la misma manera que en los operadores

lógicos. En este caso si algún operando es desconocido entonces toda la expresión es

desconocida.

Sean a = 4’h2, b = 4’h5 y c = 4’hx, entonces:

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 10

Menor que: a < b evalúa a verdadero

Mayor que: a > b evalúa a falso

Menor o igual a: c <= a evalúa a desconocido

Operadores de igualdad: Símbolos: ==, !=, ===, !== son igualdad lógica (==) y desigualdad

lógica (!=). Comparan sus operandos bit a bit. Si los bits más significativos de alguno de los

operandos presentan valores de desconocido o de alta impedancia el resultado de la

evaluación será desconocido (x). Para comparar igualdad y desigualdad entre valores de x y z

deberá utilizar los operadores === para igualdad y !== para desigualdad.

Si a = 4’h4, b = 4’h7 y c = 4’bxx10 entonces, Igualdad: a == b evalúa a falso y Desigualdad: a

!= b evalúa a desconocido.

Operadores bitwise: Símbolos: ~, &, |, ^, (~^, ^~) son negación, AND, OR , XOR y XNOR.

Estos operadores ejecutan operaciones bit a bit sobre sus operandos, si alguno de los

operandos es más pequeño en tamaño respecto al otro entonces es extendido hacia la

izquierda con los ceros necesarios.

Sean a = 4’b1100, b = 4’b0011 y c = 4’b0101 entonces,

Negación: ~a evalúa a 4’b0011

AND: a & c evalúa a 4’b0100

OR: a | b evalúa a 4’b1111

XOR: b ^ c evalúa a 4’b0110

XNOR: a ~^ c evalúa a 4’b0110

Operadores de corrimiento: Símbolos: <<, >> son corrimiento a la izquierda y corrimiento a la

derecha. El corrimiento toma como parámetros un vector y un entero que indica el número de

corrimientos deseado. Los bits vacíos provocados por los corrimientos son llenados con ceros.

Sea a = 4’b1010 entonces,

Izquierda: a << 1 corrimiento a la izquierda de un bit = 4’b0100

Derecha: a >> 2 corrimiento a la derecha de dos bits = 4’b0010.

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 11

Despues de tener en cuenta la mayoría de las características necesarias en Verilog, podemos

iniciar con la construcción del microprocesador.

CONSTRUCCION DEL MICROPROCESADOR UTILIZANDO VERILOG

REGISTROS

En la elaboraciòn de este microprocesador se utilizaron los registros R1,R2,R3,R4,MAR,MBR,

A, B y un IR, estos registros contienen una entrada y salidas de 16 bits excepto el registro MAR

ya que contiene entrada de 16 bits y salida de 9 bits, sin embargo todos los registros tienen una

opcion de carga, un enable y un reloj, ademas los datos se guardan en la instrucción reg que

de igual manera tiene 16 bits, sin embargo, el registro de instrucción IR almacena el código de

operación de la próxima instrucción a ejecutar, el cual representa una dirección de salto que le

indica al secuenciador en dónde comienzan las micro-operaciones para dicha instrucción.

Todos los registros mencionados estan conformados con el siguiente codigo que se muestra

acontinuaciòn:

//+++++++++++++++++++++++++++++++++++++++++++++++//

// REGISTROS //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module registroR1 (salMUX,loadr1,enabler1,clk,sr1);

input[15:0] salMUX;

input clk, enabler1,loadr1;

output[15:0] sr1;

reg[15:0] qr1;

always @(posedge clk)

begin

if (loadr1)

qr1 <= salMUX;

end

assign sr1 = enabler1 ? 'Z : qr1;

endmodule

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 12

CONTADOR DE 16 BITS

Este tipo de registro también funciona como una unidad de almacenamiento; sin embargo, el

contador de 16 bits integrado le da mayor funcionalidad, pues le permite incrementar o

decrementar el valor almacenado cuando sea necesario.

Tenemos un registro de contador que tiene como entrada un reloj, una opcion de carga, un

anable y en la salida hay 9 bits ya que si se activa la opcion de carga con un 1 logico en la

salida veremos el conteo incrementandose en uno, de esta manera se muestra el codigoen

verilog.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// REGISTRO PC //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module registroPC(clk,enablePC,loadPC,sPC);

input enablePC;

input clk;

input loadPC;

output [9:0] sPC;

reg[9:0] direccionPC;

initial direccionPC=10'b0000000000;

always @(posedge clk)

begin

if(loadPC)

direccionPC<=direccionPC+1;

end

assign sPC = enablePC ? 'Z : direccionPC;

endmodule

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 13

UNIDAD DE PROCESOS ARITMÉTICOS

Se encarga de ejecutar las operaciones lógico aritméticas, para ello, cuenta con una

unidad lógico aritmética (ALU) que le permite ejecutar operaciones tales como suma, resta,

and, or, or-exclusivo, entre otras.

Tiene tres modulos necesarios

1.- selecciona las fuentes de donde provendrán los datos a operar

2.- efectúa las operaciones entre los operandos seleccionados.

3.- se encarga de efectuar los corrimientos y de colocar en el registro destino el resultado de

las operaciones.

En este codigo se muestra las operaciones que debe realizar el microprocesador al momento

de selccionarlas, tiene una salida y una entrada de 16 bits ademas de contiene un selector de 4

bits, acontinuacion se muestra el codigo en verilog.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// UNIDAD ARITMÉTICA LÓGICA //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module alu(sALU,A,B,F,enableALU);

input [3:0]sALU;//selector de 4 bits

input [15:0]A;

input [15:0]B;

input enableALU;

output [15:0]F;

reg [15:0]Fq;

always@*

case(sALU)

4'b0000 : begin Fq=A+B; end//suma con carri

4'b0001 : begin Fq=A+(~B+1); end//resta con carry

4'b0010 : begin Fq=A+1; end//incremento

4'b0011 : begin Fq=A-1; end//decremento

4'b0100 : begin Fq=A&B; end//AND

4'b0101 : begin Fq=A|B; end//OR

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 14

4'b0110 : begin Fq=A^B; end//XOR

4'b0111 : begin Fq=~B; end//NOT

4'b1000 :begin //desplazamiento logico a la derecha

Fq=A;

Fq[0]<=Fq[1];Fq[1]<=Fq[2];

Fq[2]<=Fq[3];Fq[3]<=Fq[4];

Fq[4]<=Fq[5];Fq[5]<=Fq[6];

Fq[6]<=Fq[7];Fq[7]<=Fq[8];

Fq[8]<=Fq[9];Fq[9]<=Fq[10];

Fq[10]<=Fq[11];Fq[11]<=Fq[12];

Fq[12]<=Fq[13];Fq[13]<=Fq[14];

Fq[14]<=Fq[15];Fq[15]<=0;

end ………………………………

UNIDAD DE CONTROL

Decodifica las instrucciones en lenguaje ensamblador y ejecutar las micro-operaciones

necesarias para llevarlas a cabo. Los integrantes son: el registro de instrucción, el

secuenciador, la memoria de microprograma y la lógica de selección.

Este codigo es el mas importante ya que este va a controlar a todo el microprocesador,

en esta unidad de control se tiene una sola entrada el cual es el reloj, ademas de tener los

enables y las opciones de carga de todos los codigos creados para este microprocesador y

unicamente la memoria es la que cambia ya que en este codigo utiliza la opcion de leer

memoria, en este codigo se empieza con el ciclo Fetch para despues realizar con las

microoperaciones. Acontinuacion se muestra uan parte del codigo hecho.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// UNIDAD DE CONTROL //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module

unidadCONTROL(clk,sCONT,sIR,enablePC,enableMAR,selMUX,readMEM,enableMBR,loadPC,

enableIR,enabler1,enableCONT,enabler4,sALU,enableA,loadr1,loadMAR,loadMBR,loadIR,loadr4,e

nabler2,enabler3,

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 15

loadA,enableMEM,loadr2,loadr3,loadB,enableB,enableALU);

input clk;

input [3:0] sCONT;

input [15:0] sIR;

output reg enablePC,enableMAR,readMEM,enableMBR,enableIR,enabler1,

enableCONT,enabler4,enableA,loadA,loadPC,loadMAR,loadr1,loadMBR,loadIR,loadr4,enabler2,en

abler3,enableMEM

,loadr2,loadr3,loadB,enableB,enableALU;

output reg [2:0] selMUX;

output reg [3:0]sALU;

initial enableCONT=1'b0;

always @*

case(sCONT)

4'b0000 : begin //////////////////// CICLO DE FETH////////////////////

enablePC=1'b0;///MAR<-----PC

selMUX=3'b001;

enableMAR=1'b0;

loadMAR=1'b1;

end

4'b0001 : begin

loadMAR=1'b0;//MBR<-----M[MAR]

readMEM=1'b1;

enableMEM=1'b0;

enableMBR=1'b0;

loadMBR=1'b1;

loadPC=1'b1;

end

4'b0010 : begin

readMEM=1'b0;//IR<------MBR

loadMBR=1'b0;

loadPC=1'b0;

selMUX=3'b000;

loadIR=1'b1;

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 16

enableIR=1'b0;

end

4'b0011 : begin

case(sIR)

16'b0000000000000001:begin//LD R1, R4

loadIR=1'b0;//R4<------IR

selMUX=3'b110;

loadr4=1'b1;

enabler4=1'b0;

end

16'b0000010000000001:begin//MOV R2,R1

loadIR=1'b0;//R2<------R1

selMUX=3'b101;

enabler2=1'b0;

loadr2=1'b1;

end

16'b0000100000000001:begin//NOT R2

loadIR=1'b0;//A<-----R2

selMUX=3'b100;

enableB=1'b0;

loadB=1'b1;

end

16'b0000110000000001:begin//INC R3

loadIR=1'b0;//A<---------R2

selMUX=3'b011;

loadA=1'b1;

enableA=1'b0;

end

16'b0001000000000001:begin//AND R3,R1

loadIR=1'b0;//A<--------R1

selMUX=3'b101;

loadA=1'b1;

end ……………………………………

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 17

SECUENCIADOR

Es el orquestador de la unidad de control. Sincroniza y dirige las tareas de control necesarias

para la ejecución de una instrucción. En este codigo nos muestra como esta compuesto con la

entrada de un reloj, un enable, una salida de 4 bits y operadores logicos, ademas es parecido

al registro de contador PC ya que se va incrementando en uno al momento que se hagan las

microoperaciones, en el codigo siguiente se muestra en contador de secuencia.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// CONTADOR DE SECUENCIA //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module CONTSE(clk,sCONT,enableCONT);

input enableCONT;

input clk;

output [3:0] sCONT;

reg[3:0] inicioCONT;

reg[3:0] inicioCONT1;

initial inicioCONT=4'b0000;

initial inicioCONT1=4'b0000;

always @(posedge clk)

begin

if(!enableCONT)

inicioCONT<=inicioCONT+1;

else

if(enableCONT && !inicioCONT1)

inicioCONT<=4'b000;

if(enableCONT)

inicioCONT1<=inicioCONT1+1;

else

if(!enableCONT && inicioCONT)

inicioCONT1<=4'b000;

end

assign sCONT = enableCONT ? inicioCONT1: inicioCONT;

endmodule

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 18

MEMORIA DE MICROPROGRAMA

Contiene la información suficiente para el control tanto de la arquitectura interna como

de la externa, la memoria de microprograma sabe qué líneas de control debe activar o

desactivar para cada módulo de la arquitectura, en base a la dirección de entrada que recibe

del secuenciador.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// MEMORIA 1KX16 //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module memoria_1kxn(sMAR,readMEM,eMBR,enableMEM);

parameter n=16;

input [9:0] sMAR;

input readMEM,enableMEM;

output [n-1:0] eMBR;

reg[n-1:0]mem[1023:0];

reg[n-1:0] qeMBR;

always@ *

begin

if(readMEM)

qeMBR = mem[sMAR];

end

assign eMBR = enableMEM ? 'Z : qeMBR;

initial

begin

mem[0]=16'h0001;//LD R1,R4

mem[1]=16'h0401;//MOV R2,R1

mem[2]=16'h0801;//NOT R2

mem[3]=16'h0C01;//INC R3

mem[4]=16'h1001;//AND R3, R1

mem[5]=16'h1C42;//ADD R1, R2

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 19

mem[6]=16'h1908;// ADD R1, R3,R4

mem[7]=16'h0404;//LD R3,@4

mem[8]=16'h0808;//LD R4,#NBR

mem[9]=16'h0F0F;

mem[10]=16'h0C00;//LD R1,ADDR "not de R4"

mem[11]=16'h1300;//LD R1, @ADDR "A or B"

mem[12]=16'h000D;

mem[13]=16'h000E; ……………………

UNIDAD DE CONTROL CABLEADA

En este codigo se encuentra el cableado de todos los codigos hechos la instrucción que se

utiliza en este codigo para el cableado es la de wire ya que con esta instrucción se

intercoenctan las salidas y los enables de todos los bloques del hechos del microprocesador.

//+++++++++++++++++++++++++++++++++++++++++++++++//

// BUS COMÚN //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module BUSGUS(clk);

input clk;

wire [3:0] sALU,sCONT;

wire [2:0] selMUX;

wire [15:0] salMUX;

wire [9:0] sMAR,sPC;

wire [15:0] eMBR,sMBR,sr1,sr2,sr3,sr4,sIR,F,A,B;

wire enableMAR,loadPC,readMEM,enableMBR,

enabler1,enabler2,enabler3,enabler4,

enableIR,enableA,enableB,enablePC,enableCONT,loadr1,loadr2,loadr3,loadr4,loadMAR,loadMBR,

loadIR,loadA,

enableMEM,loadB,enableALU;

registroMAR MAR(salMUX,enableMAR,clk,sMAR,loadMAR);

registroMBR MBR(eMBR,enableMBR,clk,sMBR,loadMBR);

registroPC PC(clk,enablePC,loadPC,sPC);

registroR1 R1(salMUX,loadr1,enabler1,clk,sr1);

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 20

registroR2 R2(salMUX,enabler2,clk,sr2,loadr2);

registroR3 R3(salMUX,enabler3,clk,sr3,loadr3);

registroR4 R4(salMUX,enabler4,clk,sr4,loadr4);

registroIR IR(salMUX,enableIR,clk,sIR,loadIR);

BUSmux8x1 BUS(sr1,sr2,sr3,sr4,sPC,sMBR,sIR,F,selMUX,salMUX);

memoria_1kxn MEM(sMAR,readMEM,eMBR,enableMEM);

registroA RA(salMUX,enableA,clk,A,loadA);

registroB RB(salMUX,enableB,clk,B,loadB);

CONTSE CONTADOR(clk,sCONT,enableCONT);

alu ALU(sALU,A,B,F,enableALU);

unidadCONTROL

CONTROL(clk,sCONT,sIR,enablePC,enableMAR,selMUX,readMEM,enableMBR,loadPC,

enableIR,enabler1,enableCONT,enabler4,sALU,enableA,loadr1,loadMAR,loadMBR,loadIR,loadr4,e

nabler2,enabler3,loadA,

enableMEM,loadr2,loadr3,loadB,enableB,enableALU);

endmodule

MULTIPLEXOR

En este desarrollo del microprocesador no tenia que faltar nuestro multiplexor ya que

los multiplexores son circuitos combinacionales con varias entradas y una única salida

de datos, están dotados de entradas de control capaces de seleccionar una, y sólo una, de las

entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha

salida, esto ocurre al activar el selector

//+++++++++++++++++++++++++++++++++++++++++++++++//

// MULTIPLEXOR DE 8X1 //

//+++++++++++++++++++++++++++++++++++++++++++++++//

module BUSmux8x1(sr1,sr2,sr3,sr4,sPC,sMBR,sIR,F,selMUX,salMUX);

input [15:0] sr1,sr2,sr3,sr4,sMBR,F;

input [9:0] sPC,sIR;

input [2:0] selMUX;

output [15:0] salMUX;

reg[15:0] salMUX;

always@*

case(selMUX)

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 21

3'b000 :begin

salMUX<=sMBR;

end

3'b001:begin

salMUX<=sPC;

end

3'b010:begin

salMUX<=sr4;

end

3'b011: begin

salMUX<=sr3;

end

3'b100:begin

salMUX<=sr2;

end

3'b101:begin

salMUX<=sr1;

end

3'b110:begin

salMUX<=sIR;

end

3'b111:begin

salMUX<=F;

end

endcase

endmodule

CONCLUSIONES

Hèctor Jimènez

En este trabajo desarrollado se obtuvieron buenos resultados ya que al simular con el

programa modelsim cada bloque creado para el micricroprosesador se presentò lo que se

esperaba ademàs en cada còdigo se presentò una serie de instrucciones para el diseño de

este microprocesador, asìmismo, como se habìa mencionado anteriormente esta programaciòn

UNIVERSIDAD AUTÒNOMA DE LA CIUDAD DE MÈXICO SISTEMAS ELECTRÒNICOS DIGITALES

UACM ISEI Página 22

nos ayudo a enteder como es el funcionamiento interno del microprocesador ya que un

microprocesador es la pieza mas importante de una computadora.

Alfredo Martinez

Una parte importante del una computadora es el microprocesador, el cual es una herramienta

necesaria para la elaboraciòn y procesamiento de instrucciones. La elaboraciòn y complejidad

de este instrumento hacen que la base de la tecnologìa sea asombrosa. Apoyandonos en los

componentes que tiene ese instrumento y saber su estructura interna desde el mìnimo

componente así como el mas complejo y su interacciòn entre ellos. Apoyandonos en un

software que remplaza la parte fìsica que por el momento aunque no se implemento queda muy

clara y segura de poder implementarla sin complicaciones. El sabor de boca que deja la

conclusión de este producto, hace que la investigación necesaria para su elaboraciòn

enriquezca el conocimiento previamente adquirido, así como un paso enorme del como

funciona una computadora o una parte fundamental de ella. Queda muy claro cada unas de las

partes que componen dicho microprocesador y enlazan nuevas ideas para posibles mejoras o

contribuciones al desarrollo de mas tecnología. Además del hambre de aprender mas de este

instrumento y seguir tal vez con la implementación para conocer el cien porciento del

comportamiento así como de sus necesidades físicas.

Víctor Pérez:

En este trabajo entendí la estructura interna de los componentes de un procesador, su

principal función. Y como se interconectan internamente.