OPENRISC

 

OpenRISC: es un diseño abierto de la CPU del Risc de la fuente abierta de OpenCores.

Que sea de fuente abierta se refiere generalmente a cualquier software en que el código fuente esté en public domain o esté comúnmente en copyrighted por una o más personas/entities y distribuido debajo de una licencia de abrir fuente.

La computadora del sistema de instrucciones reducida (Risc), es una filosofía de diseño de la CPU de l computadora que favorece un sistema más pequeño y más simple de las instrucciones. Ejemplos de Risc SPARC, MIPS, POWER PC.

 

FILOSOFIA DE DISEÑO DEL RISC

 

En la última investigación e los años 70 en la IBM (y proyectos similares a otra parte) demostró que la mayoría de los programas no hizo caso a la mayoría de estos modos de dirección “ortogonal”. Este era un efecto secundario del uso de aumento de recopiladores de generar los programas, en comparación con la escritura de ellos en lenguaje ensamblador. Los recopiladores tendieron para ser bastantes mudos en los términos de las características que utilizaron, en gran parte un efecto secundario de procurar ser bastante pequeños. El mercado se movía claramente al uso más amplio uniforme de recopiladores, diluyendo la utilidad de estos modos ortogonales aún más.

Otro descubrimiento estaba ya que esta operaciones fueron utilizadas raramente, ya que tardaban mucho en realizar operaciones que otros más pequeños realizaban.

Esta paradoja que se parecía era un efecto secundario del tiempo pasado diseñando el CPUs, los diseñadores no tenían simplemente tiempo para templar cada instrucción posible, y en lugar de otro templado solamente más usadas. Un ejemplo era la instrucción del INDICE del VAX, que funcionó más lento que un lazo que ponía el mismo código en ejecución.

En el tiempo casi igual, CPUs comenzó a funcionar más rápidamente que la memoria que el habló. Incluso en los últimos años 70 era evidente que esta disparidad iba continuar creciendo por lo menos la década próxima ,momento en le cual la CPU sería diez a los centenares de épocas más rápidamente que la memoria. Esto significo que las ventajas de templar un modo de dirección serían abrumadas totalmente por la velocidad reducida.

Otra parte del diseño del Risc vino de medidas prácticas en programas del mundo real. Tanenbaum resumió muchos de éstos, demostrando que eran la mayoría de los procesadores overdesigned. Por ejemplo él demostró que el98% de todas las constantes en un programa cabrían en trece pedacitos, a cada diseño de la CPU dedicó algún múltiplo de ocho pedacitos a almacenarlos, típicamente 8, 16 o32, una palabra entera. Tomando este hecho en cuenta sugiere que una máquina permita que las constantes sean almacenadas en los pedacitos inusitados de la instrucción, disminuyendo el número de los accesos de memoria. En vez de cargar encima de números de memoria o los registros correctos cuando la CPU los necesitó y por lo tanto fue más rápido.

Así la filosofía del Risc era hacer instrucciones más pequeñas, implicando menos de ellos, y redujo el sistema de instrucción. El código fue puesto en ejecución como serie de estas instrucciones simples, en vez de solo una instrucción compleja que tenía el mismo resultado. Esto tenía efectos secundarios ya al salir llevaba datos con él, significando que había menos necesidad de utilizar los registros o memoria. En el mismo tiempo de interfaz de la memoria era considerablemente más simple, permitiendo que sea templada.

Sin embargo el Risc también tenía desventajas. Puesto que es necesario usar varias instrucciones parta realizar tareas simples, el número total de las instrucciones leídas en memoria más grande, y por tanto dura. Cuando no estaba claro si habría un aumento neto en el funcionamiento debido a esta limitación, y había una batalla casi continua en la prensa y en el mundo del diseño sobre los conceptos del Risc.

 

ALGUNOS TIPOS DE RISC

 

OpenRISC 1000 es una arquitectura de una familia de la fuente abierta, corazones synthesizeable del microprocesador del RISC. Es una carga 32-bit y arquitectura del RISC del almacén diseñada con énfasis sobre velocidad, sistema de instrucción compacto y scalability. OpenRISC 1000 apunta la amplia gama de ambientes encajados.

Las características del funcionamiento incluyen arquitectura completamente 32-bit, la ayuda de gran alcance de la memoria virtual, la coherencia del escondrijo, la ayuda opcional de SMP y de SMT y la información programar estática opcional. La arquitectura define varias características para los ambientes encajados. Los más notables son los tamaños 32-bit y 16-bit mezclados de la palabra de la instrucción, el sistema de instrucción optimizado para los ambientes encajados, el número configurable de los registros de los fines generales, el escondrijo configurable y los tamaños de TLB, la ayuda dinámica de la gerencia de la energía y el espacio para las instrucciones proporcionadas usuario.

La arquitectura 1000 de OpenRISC es un precursor de arquitecturas richful más de gran alcance y características de la generación siguiente de OpenRISC.

Implementions de la arquitectura 1000 de OpenRISC estará disponible en fuente completa en este Web site y será apoyado con las herramientas de desarrollo del software de GNU, con un puerto del sistema operativo de Linux de la fuente abierta, con un puerto del sistema operativo en tiempo real de la fuente de los eCos abiertos de Cygnus y con simuladores arquitectónicos y de la puesta en práctica. La mayoría de las puestas en práctica serán modulares diseñado y vendedor independiente. Podrán interconectar con otros corazones abiertos de la fuente disponibles de este Web site. Los ejemplos de tales corazones adicionales son reguladores de SDRAM y del PCI.

Las puestas en práctica de la arquitectura varían en funcionamiento y complexness. Algunos están apuntando usos altamente encajados con la cuenta baja de la puerta, funcionamiento bajo ( < 1 Dhrystone MIPS / MHz) and low power requirements. Others target high performance embedded applications with performance of 2 and more Dhrystone MIPS / MHz.

La primera puesta en práctica 1000 de OpenRISC podrá comparar con base de ARM7+. OPENCORES.ORG anima a compañías que diseñen y pongan sus propias puestas en práctica de la arquitectura 1000 de OpenRISC.

 

 

OPENRISC1000= OPENRIS1200

La puntería de este proyecto es diseñar y mantener una base 1200 del IP de OpenRISC. El OpenRISC 1200 es una puesta en práctica de la familia 1000 del procesador de OpenRISC.

El OR1200 es un escalar 32-bit RISC con la micro-arquitectura de Harvard, la tubería del número entero de 5 etapas, la ayuda de la memoria virtual (MMU) y las capacidades básicas de DSP.

Los escondrijos del defecto son el escondrijo dirigir-traz 1-way y el escondrijo dirigir-traz 1-way de la instrucción 8KB, cada uno de los datos 8KB con tamaño de la línea 16-byte. Ambos escondrijos se marcan con etiqueta físicamente.

Por el defecto MMUs son puestos en ejecución y se construyen de 64-entry 1-way basado picadillo dirigen -mpped la instrucción dirigir-traz 1-way basada picadillo TLB y 64-entry TLB de los datos.

Las instalaciones suplementales incluyen eliminan errores de la unidad para eliminar errores en tiempo real, el contador de tiempo de alta resolución de la señal, el regulador de interrupción programable y la ayuda de la gerencia de la energía.

Cuando esta puesto en ejecución en un proceso típico de 0.18u los 6LM debe proporcionar sobre el dhrystone 300 2,1 MIPS en 300MHz y 300 operaciones del MAC 32x32 de DSP, por lo menos el 20% más que cualquier otro competidor en esta clase. La configuración del defecto OR1200 utiliza aproximadamente los transistores del 1M.

RISCuva8

El Proyecto "OpenRISC" (Procesador RISC Abierto)

 En este se está diseñando en Verilog un procesador de propósito general de 8 bits, denominado "RISCuva8" .    En el diseño de este procesador se ha buscado, principalmente, la simplicidad. Emplea como unidad de proceso una arquitectura genérica de tres buses, y como unidad de control un modelo básico de secuenciador. Sin embargo, el resultado es suficientemente potente como para poder ser utilizado en cualquier aplicación integrada en un chip, como pueden ser tarjetas inteligentes, teléfonos móviles, etc. De hecho, puede ser una alternativa ventajosa al procesador KCPSM de Xilinx .

 

Características Generales

El RISCuva8 es el núcleo de un procesador de propósito general de 8 bits con arquitectura RISC. Ejecuta todas sus instrucciones básicas en un solo ciclo de reloj. Puede operar por encima de los 40 MHz y ocupa muy poco espacio en una FPGA. Si el programa ejecutable es grande, está disponible una versión que accede a memoria externa.

Las principales características del procesador son las siguientes:

      · Dispone de 16 registros internos de 8 bits ( r0 a r15 ), utilizables todos ellos en todas las operaciones.
      · La memoria de programa es de hasta 16 K palabras de 16 bits (32 KB).
      · Accede a su memoria de datos, separada de la anterior, con sus puertos externos.
      · Su código de instrucciones, completamente ortogonal, dispone de 34 operaciones básicas.
      · Emplea indistintamente dos registros (rD = rD op rS) o un registro y una constante (rD = rD op K).
      · Su ALU de 8 bits puede realizar 16 operaciones (ADD, ADC, AND, OR, INC, DEC, RRC, ...).
      · Dispone de una instrucción (MAC) que facilita la multiplicación (8x8 en 12 ciclos).
      · Permite las comparaciones habituales: Z, NZ, C, NC, V, GT y LT.
      · Accede al exterior a través de 256 puertos de entrada/salida de ocho bits.
      · También incluye 16 canales de entrada y otros 16 de salida, todos ellos de un bit.
      · Dispone de una pila interna de 16 posiciones, pero únicamente para direcciones de retorno.
      · Dispone de interrupciones de un nivel, de DMA y de un modo de bajo consumo.

      · Ocupa unos 290 LCs en una Spartan-II de Xilinx.

    Como se podrá observar, el diseño se ha reducido a lo que es esencial en el núcleo de un procesador: un banco de registros, diversas unidades de cálculo, un contador de programa y poco más. El acceso al exterior se realiza normalmente a través de sus 256 puertos de entrada/salida, pero no se ha implementado un interfaz directo con la memoria: se ha de montar en hardware externo, lo cual es muy fácil si se hace en una FPGA. Lo mismo ocurre con la pila de datos y con otros elementos, como el controlador de interrupciones y de DMA.

 

Código de Instrucciones

    El procesador RISCuva8 dispone de 34 instrucciones , las cuales se ejecutan en un ciclo de reloj. Los 16 bits del código de instrucción se organizan generalmente en cuatro campos, dedicándose los dos últimos a identificar los registros empleados en la operación.

    Las instrucciones se organizan en dos tipo básicos, identificados por el bit más significativo del código de instrucción: las de salto incondicional , que incluyen saltos y llamadas a subrutina, y las de ejecución condicional . En este último caso, se dedican otros tres bits siguientes a establecer una condición, y la instrucción sólo se lleva a cabo si dicha condición resulta verdadera, lo que permite --entre otras muchas cosas-- efectuar saltos condicionales.

Las instrucciones más sencillas son las que efectúan los saltos y las llamadas a subrutina: "GOTO nnnn" y "CALL nnnn". Emplean 14 bits para identificar la dirección de destino, por lo que permiten que el código ejecutable sea de hasta 16 K instrucciones, que ocupan el espacio equivalente a 32 KB de memoria. Esto supera muy holgadamente la capacidad del KCPSM de Xilinx , el cual sólo puede ejecutar programas de hasta 256 instrucciones. En el caso de las subrutinas, el procesador dispone de una pila interna que retiene hasta 16 direcciones de retorno.

     Como hemos dicho, en este procesador no existen saltos condicionales, sino ejecuciones condicionales. Cualquier instrucción ejecutable, y todas salvo GOTO y CALL lo son, puede ejecutarse de forma condicional, es decir, sólo en el caso que determinado flag resulte válido. Por este motivo, los saltos condicionales tienen la forma "IF (flag) JP dirección-cercana", pero también se puede volver condicionalmente de una subrutina con "IF (flag) RET", o incluso se puede hacer "INC rN; IF (C) INC rM", lo cual implementaría con dos instrucciones el incremento de un registro de 16 bits {rM,rN}.

    Para estas ejecuciones condicionales se pueden evaluar hasta ocho situaciones distintas: '1' indica que la ejecución es incondicional, y será la habitual en la mayoría de las instrucciones; 'V' evalúa el desbordamiento ( overflow ), el cual se puede producir en operaciones aritméticas con signo (v.g. 127 + 1 = 128, que representa al -128, por lo que se ha producido desbordamiento en el código de ocho bits con signo); 'NC' y 'C' evalúan el acarreo (v.g. 128+128 = 256, pero el resultado en ocho bits es 0 y se activa el acarreo); 'GT' y 'LT' miran 'signo', y se activan si el resultado anterior fue 'mayor que cero' ( greater than zero ) o 'menor que cero' ( less than zero ); 'NZ' y 'Z' , finalmente, indican si el resultado anterior fue nulo o no, lo cual es muy útil para realizar comparaciones (si la resta de dos valores es cero, indica que eran iguales) y controlar bucles.

    Las operaciones habituales, aritméticas y lógicas, se pueden hacer de forma flexible y cómoda a través de las últimas ocho instrucciones. Emplean dos operandos, los cuales pueden ser o bien dos registros (por ejemplo "ADD r6, r15", que equivale a "r6 = r6 + r15"), o bien un registro y una constante ("ADD r6, 0xAB"). En este último caso se necesita la instrucción "IMM", que ejecutada justo antes suministra los ocho bits de la constante: "IMM 0xAB; ADD r6", es decir, "r6 = r6 + 0xAB". Lo visto en este caso puede ser utilizado en cualquier otro caso que pueda suponerse (por ejemplo, "OUT p15, 0xFF", que emite por un puerto p15 un valor constante de ocho bits, o "LD r6, 0xE4", que carga un valor en un registro, etc.), alcanzándose con ello una notable potencia y facilidad de uso.

    Adicionalmente, existen otras ocho operaciones unitarias, es decir, que actúan sobre un único registro. Estas son las operaciones típicas de incremento, decremento, diversos desplazamientos, etc. Una de ellas (MAC) realiza diversas tareas que facilitan la programación de la multiplicación, permitiendo realizar un producto 8x8 en tan sólo 12 ciclos de reloj.

    Para intercambiar datos con el exterior se utilizan, principalmente, las instrucciones IN y OUT , las cuales realizan transferencias de 8 bits a través de cualquiera de los 256 puertos disponibles. A pesar de que pueda parecer un tanto raro, este procesador no dispone directamente de un interfaz con la memoria, ni tampoco implementa una pila para guardar temporamente datos. Sin embargo, gracias a que el núcleo de este procesador se va a implementar en una FPGA, no es en absoluto complicado implementar fuera del núcleo, pero dentro de la misma FPGA, la lógica necesaria para disponer de esos recursos.

    Dos instrucciones adicionales, "SET0 chN" y "SET1 chN", controlan individualmente el estado de los 16 canales de entrada y salida de un bit. Dichos canales se pueden comprobar con las órdenes "TST0 chN" y "TST1 chN", que activan el bit de signo en concordancia con el estado del canal de entrada seleccionado. Esta capacidad, la de acceder individualmente a conexiones externas de un bit, es muy común en los microcontroladores y facilita la comunicación del procesador con el exterior (otros procesadores, memorias DRAM y/o SDRAM, dispositivos I2C, puertos RS-232, etc).


    Además de estas instrucciones básicas , que se ejecutan en un ciclo de reloj, el procesador RSCuva8 puede ejecutar muchas otras, derivadas inmediatamente del uso de una de las anteriores, o de la concatenación de varias de ellas.

Subrutina de Multiplicación

    El RISCuva8 incorpora dos instrucción que facilitan la multiplicación. La primera es "SWAP rD", que intercambia el contenido de los registro 'rD' y 'AUX' (este último es un registro interno de 8 bits, que también puede ser utilizado para guardar datos temporalmente); la segunda es "MAC rD", que multiplica el contenido del registro 'r0' por el bit menos significativo de AUX y acumula el resultado sobre los registros 'rD' y 'AUX', quedándose el registro 'rD' con la parte más significativa.