13 votos

¿Cómo diseñar eficazmente el opcode de una CPU?

Estoy construyendo una CPU simple de 16 bits en Logisim y tengo la ALU lista y los opcodes que quiero tener. Ahora me resulta muy difícil encontrar la codificación correcta para los comandos de modo que los diferentes subcircuitos (por ejemplo, lógica, aritmética) no necesitan todos los cables de control (que construyen la codificación) como entrada, pero tan pocos como sea posible. ¿Existen estrategias o métodos que ayuden a un diseño eficiente de opcode?

gracias de antemano

1 votos

Construye primero tu ALU y mira qué cables de control necesita. Después, conéctalos directamente al registro de "instrucción actual". Lo mismo para la lógica de control de acceso a memoria, y cualquier otra clase importante de opcodes. Luego usa los bits que sobren para seleccionar qué subcircuito se activa.

1 votos

También está el artículo original de Ken Chapman sobre su máquina de programación de estados de 8 bits KCPSM, también conocida como PicoBlaze. Describe cómo eligió las instrucciones y diseñó la ISA. dc.uba.ar/materias/disfpga/2010/c2/descargas/

10voto

Eastern Monk Puntos 125

Creo que es un buen enfoque estudiar otros conjuntos de instrucciones.

Uno pequeño sería el MSP430 de TI es un procesador de 16bit con unas 22 instrucciones.

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

También podrías mirar los Atmel AVRs que también tienen un conjunto de instrucciones bastante pequeño.

En un pequeño proyecto mío intenté desarrollar un procesador sencillo de 32 bits en VHDL con un conjunto de instrucciones pequeño (14 instrucciones):

http://www.blog-tm.de/?p=80

Debido a mi actual tiempo libre no está totalmente terminado. Las instrucciones están implementadas pero dos no están probadas y quizás faltan algunas banderas de estado.

0 votos

Pero no encontré algo donde pudiera ver cuál es la codificación real y por qué se eligió que fuera así.

0 votos

Puede encontrar la codificación actual en el repositorio: github.com/TM90/MISC_Processor/raw/master/Documentation/ . La razón por la que elijo estas codificaciones es para que la lógica en el decodificador de instrucciones sea mínima.

7voto

jns Puntos 449

Estudie (pero no reproduzca) el enfoque ARM de la codificación de instrucciones. Está fuertemente orientado a prefijos (como el enfoque de árbol Huffman recomendado por Dzarda) y es muy uniforme en términos de dónde está la parte de selección de registro de la instrucción.

El enfoque poco imaginativo pero fiable consiste en enumerar todas las señales de control que tienes, que probablemente serán más de 16 bits, y luego intentar hacer una minimización lógica estilo mapa de Karnaugh en ellos.

0 votos

No entiendo muy bien a qué te refieres con señales de control.

0 votos

Lo que he encontrado y me gusta del ARM es el campo condición, lo incluiré.

0 votos

Las señales de control son las entradas a los distintos multiplexores y habilitadores que dirigen los datos entre las partes de la CPU.

4voto

mk117 Puntos 113

Una vez intenté hacer una CPU de 4 bits con núcleo de 8 bits de longitud de instrucción en Logisim. Terminó con una simple máquina de estados, más que una CPU, en realidad.

Cosas que buscar al azar

  • Árboles de Huffman
  • ¿Codificación de longitud fija o variable?
  • ¿Es un diseño von Neumann con un único espacio de direcciones, o al estilo Harvard con datos/programas separados?

Excelente vídeo en Computerphile sobre los árboles Huffman:

https://www.youtube.com/watch?v=umTbivyJoiI

0 votos

La codificación Huffman no funciona para una codificación de longitud fija, ¿verdad?

0 votos

@Benjoyo Me puedo imaginar un escenario con los bits sobrantes siendo usados para variaciones de las instrucciones más usadas, proporcionando así más funcionalidad.

0 votos

Pero no entiendo qué tipo de optimización aporta esto. No me ayuda con el diseño del circuito. ¿Cuál es el objetivo cuando se utiliza la codificación Huffman para opcode?

4voto

Ryan Dignard Puntos 41

El ISA que escribí para clase una vez tenía un código de operación de 4 bits como este: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

En lugar de ser el más óptimo, es uno de los estilos más fáciles de construir/diseñar, ya que la señal de entrada de un solo bit puede controlar completamente el camino lógico que se toma. Alternativamente, se puede Código Huffman tus símbolos más utilizados y ponlos a cero para obtener un código de operación de longitud fija.

0 votos

Este tipo de optimización es lo que estoy buscando en este momento. Pero tengo un opcode de 5 bits y me cuesta agrupar los comandos para que tenga sentido en el circuito.

0 votos

@Benjoyo podrías tener un montón más de instrucciones ALU con el bit superior puesto. Además, mi cobertura de condiciones de salto era bastante débil y la mayoría de las ramas normales requerirían dos instrucciones. En general, pensé en las categorías como: Matemáticas / Control / Memoria

3voto

Alex Andronov Puntos 178

Una cosa que tendrás que considerar es si permites cualquier forma de instrucción multipalabra, o cualquier cosa que pueda "actuar" como una instrucción multipalabra; si lo haces, puede que entonces quieras considerar si usar palabras de instrucción adicionales después de la instrucción principal, o palabras prefijo antes de ella. Permitir prefijos y palabras de continuación puede aumentar la complejidad de la gestión de interrupciones, pero puede evitar la necesidad de encajar instrucciones poco utilizadas en el mismo espacio de opcode que las de uso común.

Si las instrucciones se obtienen en el ciclo anterior a su ejecución, se podría tener una instrucción de "bifurcación condicional" que o bien hiciera que se saltara la siguiente palabra de instrucción o bien que su contenido se transfiriera directamente al contador de programa; un diseño de este tipo podría añadir cierta complejidad adicional a la secuenciación de interrupciones, pero podría aliviar la necesidad de utilizar una gran parte del espacio de opcodes para instrucciones de "bifurcación", "salto" y "llamada", al tiempo que permitiría una gama mucho más amplia de condiciones de bifurcación de lo que sería posible de otro modo. Dado que una bifurcación que se toma generalmente requerirá un ciclo muerto después de la ejecución de la propia instrucción, independientemente de la procedencia de la dirección, hacer que la dirección provenga de la siguiente palabra que se ha obtenido, pero que no se ejecutará, no cuesta ningún tiempo extra.

Aunque mover la dirección de destino fuera de las instrucciones de bifurcación reducirá la cantidad de espacio de opcode que ocupan, un formato de opcode de 16 bits sigue siendo bastante ajustado. El uso de instrucciones prefijo puede ayudar en este sentido. Si, por ejemplo, uno quiere tener 32 registros, permitir que cualquier registro sea especificado independientemente como fuente1, fuente2, y destino requeriría 15 bits en el opcode, permitiendo un enorme total de dos instrucciones. No es muy útil. Por otro lado, sería bueno poder utilizar cualquiera de los 32 registros para cada uno de los tres operandos. Se podrían equilibrar los dos objetivos haciendo que cualquier operación de la ALU que no esté precedida por un prefijo utilice ocho bits para hacer dos selecciones de uno de dieciséis registros, pero que una operación de la ALU que siga inmediatamente a un prefijo utilice algunos bits del prefijo junto con ocho de la instrucción siguiente, para permitir la selección independiente de ambas fuentes y el destino del conjunto completo de 32. Las instrucciones que utilizan los registros superiores necesitarían dos palabras/ciclos en lugar de uno, pero en algunos casos esta compensación podría merecer la pena. La mayor dificultad con el uso de prefijos es que hay que evitar que se produzca una interrupción entre un prefijo y la siguiente instrucción, o bien asegurarse de que si se produce una interrupción, la instrucción posterior al prefijo seguirá utilizando los registros correctos [por ejemplo, haciendo que la lógica de almacenamiento del contador de programa guarde la dirección de la última instrucción sin prefijo ejecutada].

Utilizar instrucciones de varias palabras dificultará algunos aspectos del diseño, pero puede reducir la necesidad de tomar otras decisiones difíciles.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X