Introducción

En esta sección se encuentra publicado el código fuente del microprocesador MIPS64 para números enteros, implementado en mi Proyecto de Fin de Carrera: Implementación VHDL del microprocesador MIPS64: Un enfoque docente. Puedes acceder a la memoria de dicho proyecto haciendo click aquí.

El código está escrito en VHDL (acrónimo que representa la combinación de VHSIC y HDL, donde VHSIC es el acrónimo de Very High Speed Integrated Circuit y HDL es a su vez el acrónimo de Hardware Description Language), un lenguaje de descripción y modelado diseñado para describir la funcionalidad y la organización de sistemas hardware digitales, placas de circuitos, y componentes.

Implementaciones MIPS64 completas

Aquí puedes ver y descargar las implementaciones completas realizadas en el proyecto, comprimidas en formato zip:

  • MIPS64 secuencial, versión estructural
  • » Acceder

  • MIPS64 secuencial, versión funcional
  • » Acceder

  • MIPS64 segmentado, versión funcional
  • » Acceder


    VHDL funcional vs. VHDL estructural

    VHDL puede ser usado para la descripción algorítmica o funcional de un circuito. Sin necesidad de conocer la estructura interna de un circuito es posible describirlo explicando su funcionalidad: esto es especialmente útil en simulación, ya que se permite simular un sistema sin conocer su estructura interna y sus detalles de implementación a bajo nivel.

    Otra manera de usar VHDL es el enfoque estructural en el que primero se diseña una biblioteca de componentes de bajo nivel y posteioromente se describen sistemas más complejos mediante la interconexión de estos componentes.

    Para la versión secuencial del MIPS se han utilizado los dos enfoques, y como se ha decidido que el funcional es mucho más sencillo y didáctico para los fines de este proyecto, se ha partido de esta descripción funcional para implementar la versión segmentada.

    Descripción MIPS64 secuencial

    Esta es la lista de componentes escritos en VHDL que forman parte de la implementación secuencial del microprocesador MIPS64. Haz click en cualquier de estos componentes para ver su código fuente.

    • Instruction Fetch


    • Instruction Fetch Esta etapa busca en memoria la instrucción que le indica el Program Counter (PC), además de sumar 4 al PC (las instrucciones son siempre de 32 bits).

      Compuesta por un multiplexor, un registro de 32 bits (PC), la memoria de instrucciones, y un sumador.







      Descargas proporcionadas (Instruction Fetch):



    • Instruction Decode


    • Instruction Decode La etapa Instruction Decode ha de decodificar la instrucción en curso. También lee los operandos fuente de los registros especificados por la instrucción que se ha decodificado. Además, en esta etapa se extiende el signo del operando inmediato, en caso de ser necesario.

      Esta etapa es la más compleja de todo el diseño. Está compuesta por 4 multiplexores, 2 registros de 64 bits, 1 extensor de signo, 1 sumador, 1 comparador, y por último, un banco de registros compuesto por 32 registros de 64 bits cada uno.



      Descargas proporcionadas (Instruction Decode):



    • Execution


    • Execution El paso de la etapa ID a la etapa EX se suele denominar "emisión" de la instrucción. En esta etapa, la ALU realiza la operación requerida con los operandos a su disposición.

      A partir de esta etapa, el número de elementos que componen las etapas decrece bastante: la etapa Execution está compuesta por 1 multiplexor y una ALU.




      Descargas proporcionadas (Execution):



    • Memory


    • Memory Se realizan los accesos a memoria para las instrucciones LOAD / STORE. También se hacen efectivas las instrucciones de salto.

      El único componente de esta etapa es una memoria de datos, capaz de almacenar 16 KB, o lo que es lo mismo, una caché de nivel 1 (L1) de 16 KB.






      Descargas proporcionadas (Memory):



    • WriteBack


    • WriteBack La función de esta etapa es realizar la escritura del resultado obtenido en un registro.

      La etapa WriteBack está compuesta por un único multiplexor, cuya función consiste en decidir que dato se guardará en el banco de registros: el resultado de la ALU o bien el resultado de acceder a memoria.



      Descargas proporcionadas (WriteBack):



    • Unidad de Control

    • Control Unit
      La Unidad de Control se encarga de sincronizar las acciones que realiza cada una de estas etapas, generando las señales de control que gobiernan el funcionamiento de la ruta de datos.




      Descargas proporcionadas (Unidad de Control):



    • Microprocesador MIPS64 (secuencial)

    • MIPS64
      El microprocesador MIPS64 se obtiene como resultado de interconectar las etapas descritas anteriormente, junto con la unidad de control.


      Descargas proporcionadas (MIPS64):
      NOTA IMPORTANTE
      • Para poder compilar correctamente el código perteneciente al MIPS64 estructural , es necesario tener los archivos VHDL pertenecientes al resto de componentes que forman las etapas indicadas anteriormente. Es el caso de multiplexores, sumadores, registros, etc.

        SE RECOMIENDA DESCARGAR EL PAQUETE MIPS64 SECUENCIAL / ESTRUCTURAL ENTERO!

        » Descargar MIPS64 versión secuencial / estructural


    Descrpción MIPS64 segmentado

    En el diseño segmentado, la arquitectura variará muy poco con respecto a la arquitectura secuencial mostrada con anterioridad. Básicamente, el elemento principal que diferencia a la arquitectura segmentada respecto de la secuencial es el registro de segmentación. Por supuesto, la otra modificación importante aparece en la unidad de control. A continuación se presenta la lista de componentes que forman parte de la implementación MIPS64 segmentada / funcional:

    • Instruction Fetch


    • Instruction Fetch Esta etapa busca en memoria la instrucción que le indica el Program Counter (PC), además de sumar 4 al PC (las instrucciones son siempre de 32 bits).

      Esta etapa no cambia con respecto a la versión secuencial.







      Descargas proporcionadas (Instruction Fetch):



    • Instruction Decode


    • Instruction Decode La etapa Instruction Decode ha de decodificar la instrucción en curso. También extrae los datos de los registros especificados por la instrucción que está decodificando. Además, en esta etapa se extiende el signo de los operandos, en caso de ser necesario.

      El cambio más notable respecto a la versión anterior es la disposición de un multiplexor (el que selecciona la dirección de escritura en el banco de registros). Esto es debido a que la dirección de escritura debe propagarse a las siguientes etapas, hasta llegar a la etapa WB, donde realmente es válida dicha dirección. Si realizáramos la escritura directamente en la etapa ID, muy probablemente obtengamos resultados inválidos.








      Descargas proporcionadas (Instruction Decode):



    • Execution


    • Execution El paso de la etapa ID a la etapa EX se suele denominar "emisión" de la instrucción. En esta etapa, la ALU realiza la operación requerida con los operandos; cabe destacar que en el caso de accesos a memoria, se calcula la dirección de acceso.

      Esta etapa no cambia con respecto a la versión secuencial.





      Descargas proporcionadas (Execution):



    • Memory


    • Memory En MEMORY se realizan los accesos a memoria para las instrucciones LOAD / STORE. También se hacen efectivas las direcciones de salto.

      Esta etapa no cambia con respecto a la versión secuencial.







      Descargas proporcionadas (Memory):



    • WriteBack


    • WriteBack La función de esta etapa es realizar la escritura en registros de los datos obtenidos.

      Esta etapa tampoco cambia con respecto a la versión secuencial.






      Descargas proporcionadas (WriteBack):



    • Unidad de Control

    • Control Unit
      La Unidad de Control se encarga de generar las señales de control que se irán propagando a través de los registros de segmentación junto con cada instrucción.


      Descargas proporcionadas (Unidad de Control):



    • Microprocesador MIPS64 (segmentado)


    • MIPS64
      El microprocesador MIPS64 se obtiene como resultado de interconectar las etapas descritas anteriormente, junto con la unidad de control.

      Descargas proporcionadas (MIPS64):
      NOTA IMPORTANTE
      • En la implementación proporcionada no están resueltos los riesgos que aparecen como resultado de la segmentación del procesador.