/***************************************************************************
mipscpu.h - description
-------------------
begin : Thu Nov 23 2000
copyright : (C) 2000 by Jose Maria Requena Lopez
email : jmrequena@larural.es
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef MIPSCPU_H
#define MIPSCPU_H
//// Archivos especificos de este proyecto
#include "mipscontrol.h"
class MipsCPU {
public:
MipsCPU(int iteracion,int ciclo_reloj); //Constructor
~MipsCPU(); //Destructor
int iter;
int ciclo;
//Elementos funcionales
FR_32x32 regs; //Archivo de Registros
REG_32 pc; //Contador de programa
ALU_32BIT_CLA pcAlu; //Sumador de la direccion de PC=PC+4
ALU_32BIT_CLA addrAlu; //Sumadro de calculo de nueva direccion
ALU_32BIT_CLA alu; //Unidad arimetico-logica principal
ALU_CONTROL aluControl; //Control de la ALU
MipsMuxBubble pcSourceMux; //Multiplexor de fuente datos para PC
MipsMuxBubble regDstMux; //Multiplexor de registro destino
MipsMuxBubble aluSrcMux; //Multiplexor de fuente de datos para la ALU
MipsMuxBubble memToRegMux; //Multiplexor de memoria a registro
AND branchAnd; //Y logico de instrucciones de salto
AND PCWriteAnd; //AND de la salida del bubbleUnit con el reloj
AND IFIDWriteAnd; //AND de la salida del bubleUnit con el reloj
OR RegWriteOr; //OR del RegWrite con la seņal de reloj
MipsControl control; //Unidad de control de la CPU
MipSignExtender signExt; //Extendedor de signo 16 - 32
MipsLeftShifter leftShift; //Desplazamiento a la izquierda 2 posiciones
MipsBubbleUnit bubbleUnit; //Unidad de detencion de riesgos
MipsMuxBubble muxBubble; //Selector de la salida del control y la unidad de
//detencion de riesgos
///Registros de segmentacion
REG_32 iFiD[2]; //Registro IF_ID
REG_32 iDeX[4]; //Registro ID_EX
REG_32 eXmeM[3]; //Registro EX_MEM
REG_32 meMwB[2]; //Registro MEM_WB
REG_8 zeroRegDstReg; //Registro de 8 bits para guardar la salida cero,
//y el valor de Registro-destino en el registro
//EX_MEM.Se usaran los 6 bits de orden inferior
//El Zero de la Alu es el LSB
REG_8 regDstReg; //Registro de 8 bits para guardar el valor de
//Registro-destino en el registro MEM_WB
//Analogamente se usaran los 5 bits de orden inferior
REG_16 IDEXRegsLow; //Registro para guardar los 10 bits de las dos direcciones
//de registros en las instrucciones aritmeticos logicas o
//de carga
//Extension de los registros de segmentacion para
//guardar las seņales de control
REG_16 extEx;
REG_8 extMem;
REG_4 extWb;
//Las seņales de control se propagaran a traves de estos registros de
//tal manera que siempre tendremos esta distribucion de seņales-bit
/*
ETAPA ID_EX-------------Registro extEx----------------------------
AluSrc 0
AluOp 1-2
RegDst 3
MemWrite 4
MemRead 5
Branch 6
MemToReg 7
RegWrite 8
ETAPA EX_MEM-------------Registro extMem--------------------------
MemWrite 0
MemRead 1
Branch 2
MemToReg 3
RegWrite 4
ETAPA MEM_WB-------------Registro extWb---------------------------
MemToReg 0
RegWrite 1
*/
////Seņales de control
WIRE aluSrc;
WIRE aluOp1;
WIRE aluOp0;
WIRE RegDst;
WIRE memRead;
WIRE memWrite;
WIRE branch;
WIRE memToReg;
WIRE RegWrite;
///Seņales de detencion de la segmentacion
WIRE PCWrite;
WIRE IFIDWrite;
WIRE stopControl;
WIRE controlBubble[9];
WIRE zeroBubble;
///Conexiones de las extensiones de control de los registros de segmentacion
WIRE control_to_idex[9];
WIRE idex_to_exmem[5];
WIRE exmem_to_memwb[2];
//Resto de conexiones
WIRE a[32],b[32],c[32],d[32],e[32],f[32],g,h[32],i[32],j[32],
k[5],l[5],m[5],n[5],o[5],p[32],q[32],r[32],s[32],t[32],u[32],
w[32],x[32],y[2],z[32],zero,aa[32],bb,cc[32],dd[32],ee[32],ff[32],gg[32],hh[32],
ii,jj,kk,bnegate;
//Conexiones usadas como buffer a registros de tamaņo sobrante del bus real
//EJ:extensiones de control donde se usan 9 bits pero se usa un registro de 16 bits
WIRE addr0[5];
WIRE addr1[5];
WIRE addr3[16];
WIRE addr4[5];
WIRE addr5[16];
WIRE addr6[16];
WIRE addr7[16],addr8[16];
WIRE addr9[6];
WIRE addr11[8],addr12[8];
WIRE addr13[8];
WIRE addr14[8];
WIRE addr15[8];
WIRE addr16[8];
WIRE addr17[4],addr18[4];
void run(WIRE& clock,WIRE DataAddr[32],
WIRE DataIn[32],WIRE DataOut[32],
WIRE Ins[32],WIRE InsAddr[32],
WIRE& RAMWrite,WIRE& RAMRead,bool *end);
};
#endif
| Generated by: root@localhost.localdomain on Sat Dec 2 02:26:22 200. |