Post on 27-Feb-2018
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.