¿sería este un buen diseño de una máquina apilada?

0

Tengo una tarea para diseñar una máquina de pila de 8 bits. Me preguntaba si esto funcionaría:

Mi problema es que no estoy muy seguro de si este diseño funcionará, apenas he encontrado ningún diseño en una máquina de dirección cero y los que he encontrado han tenido una marca y me corrigen si me equivoco. mar es un registro de dirección, ¿cómo se puede contar como una máquina de dirección cero que utiliza un registro de dirección? Puede que me haya salido mal en alguna parte pero no puedo verlo. ¿Funcionará este diseño ya que no estoy usando ninguna memoria?

    
pregunta user23012

4 respuestas

2

Si leo stevenvh correctamente, su solución implica tener un espacio de datos direccionable, aunque esté 'oculto' de los tipos de acceso habituales de carga / almacenamiento. Desde el punto de vista del hardware, una dirección de datos abandona la CPU, va a una RAM externa y un bus de datos transfiere datos a / desde la CPU, indistinguible de un tipo tradicional de carga / almacenamiento de CPU. Pero si su CPU solo permite los tipos de acceso que menciona a ese espacio de datos, entonces el modelo de programación necesariamente tiene que estar orientado a la pila y, por lo tanto, sería una implementación legítima.

Dicho esto, una implementación alternativa sería implementar el espacio de datos como una pila. La interfaz de la CPU a la unidad de pila podría ser un bus de datos bidireccional de 8 bits, con dos líneas de control, una para insertar los datos actuales en la pila, una para leer (y eliminar) la palabra más alta de la pila. Ahora para hacer las cosas más convenientes para trabajar con su ALU, podría hacer posible leer la palabra principal sin eliminarla, y es posible que también desee tener acceso directo a la segunda palabra. Hay muchas otras formas en las que puedes ir, también. Puede conectar directamente la palabra de pila superior a la entrada ALU A y la segunda palabra de pila a la entrada ALU B; o puede colocar un registro de datos temporal para mantener una entrada en la ALU mientras que la otra entrada proviene de la pila. (Aquí es donde los mods se ponen tensos sobre el final abierto de su pregunta, y puedo ver por qué: no quiero diseñarlo para usted, pero espero que esto le dé un par de ideas)

Por último, vamos a poner un poco de alcance en esta pila. Como dijo '8 bits', debe señalarse que en el pasado, el 6502 sobrevivió con solo 256 bytes de pila. Ciertas calculadoras HP están orientadas a la pila y funcionan con solo cuatro niveles de pila. Por lo tanto, como ejercicio académico, como una prueba de concepto, no debes preocuparte por el suministro de gobs y de memoria para tu stack. No estoy seguro de que en realidad haya un dispositivo LIFO de un solo chip que pueda usar, pero si lo hay, y es pequeño, no se desanime. En realidad, hacer una pila de hardware de 74hc374s o algo probablemente no sería divertido, pero nuevamente, en el lado positivo, podrías hacer mucho con solo unos pocos niveles de pila.

    
respondido por el JustJeff
4

Nota: esta fue la respuesta que quería publicar antes de editar la pregunta. Espero haber interpretado la pregunta correctamente. Sin embargo, la edición no me lo deja más claro.

¿Desea que la pila esté en la RAM común o en una pila separada (limitada)?
Si se basa en RAM, necesita un puntero de pila que apunte a la última dirección utilizada o la siguiente dirección libre (se utilizan ambos métodos). Digamos que eliges la primera dirección gratuita.
Empujar datos en la pila es simplemente escribir en la dirección a la que se apunta, y disminuir el puntero de la pila. Puede comparar el nuevo valor con la dirección más baja permitida y generar una interrupción por desbordamiento de pila si son iguales.
Revisar los datos es lo contrario: incremente el puntero de la pila y lea los datos en esa dirección. Nuevamente, puede comparar la dirección con la más alta permitida y generar una interrupción de desbordamiento de pila si el puntero de pila es mayor. En ese caso, no se leen los datos, ya que de todos modos no serán válidos.
Idealmente, el rango de direcciones asignado a la pila sería administrado por el sistema operativo y protegido por el acceso directo de las aplicaciones. Sin embargo, la mayoría de los microcontroladores de 8 bits no tienen esquemas de protección de anillo de hardware, por lo que las aplicaciones no pueden ocultar la pila

Si tiene registros de pila especiales en lugar de RAM común, es casi lo mismo si usa una RAM pequeña para ello, solo se arreglarán los valores de comparación de desbordamiento / desbordamiento de pila.
Una forma alternativa sería utilizar una serie de flip-flops D que se pueden conectar hacia arriba o hacia abajo, dependiendo de si presionas o haces pop. Entonces, dependiendo de la dirección, FF 1 copia los datos de FF 0, FF 2 copias de FF 1, etc., o FF 0 copias de FF 1, FF 1 copias de FF 2, etc. La complejidad aquí es lineal con el tamaño de pila, donde Es fijo para el enfoque de RAM.

    
respondido por el stevenvh
2

A veces es bueno tener una semántica de pila que permita que se empuje un número arbitrario de elementos, siempre que solo aparezca el número correcto; La pila de empuje ilustrada proporciona tal semántica. Desafortunadamente, los registros que pueden aceptar entradas desde arriba o desde abajo pueden ser costosos de realizar, ya sea en VLSI o en lógica discreta. La RAM es un buen enfoque, pero es difícil obtener una semántica de desbordamiento que se comporte como se describe anteriormente.

Un buen enfoque es utilizar un cruce entre la RAM y los enfoques de pila de empuje: cada ranura de pila solo se carga desde la inmediatamente anterior, pero cada ranura de pila tiene un flip flop que indica si contiene datos válidos. Al presionar un elemento en la pila, cada elemento se carga con el anterior si todos los elementos anteriores son válidos. Al resaltar un elemento en la pila, el elemento válido más alto se imprime y establece como no válido.

Si hay muchos elementos de pila, es probable que la RAM sea más barata que la pila de pushdown descrita anteriormente, incluso si se necesita tener un puntero de pila y un contador de elementos empujados (empujar cuando la pila está llena debería golpear la pila puntero, pero deje el contador de elementos empujados al máximo). Sin embargo, para dos artículos, la pila de empuje hacia abajo descrita anteriormente será más simple (si a uno no le importa detectar el desbordamiento de la pila, puede omitir el flip flop de 'datos válidos' de la ranura inferior). Para 2-8 elementos, cualquiera de los dos enfoques debería ser viable.

    
respondido por el supercat
2

Lo siento, este arreglo no funcionará. Actualmente tiene ambas entradas ALU conectadas directamente al bus de datos sin ningún tipo de cierre o registro intermedio. Actualmente no tiene forma de presentar dos números diferentes a la entrada de la ALU, lo que hace imposible calcular "9 - 7". La mayoría de las máquinas apiladoras que he visto tienen

  • una entrada de ALU conectada por cable a la salida del TOP de la pila,
  • la otra entrada de ALU está cableada a la SIGUIENTE de la pila (o al bus de datos conectado a la memoria donde se almacena el resto de la pila), y
  • la salida de ALU está cableada a la entrada de TOP of stack.

¿cómo se puede contar como una máquina de direcciones cero que utiliza un registro de direcciones?

Normalmente interpreto "dirección cero" como " cero operando " conjunto de instrucciones. Dado que las fuentes y el destino de la instrucción "agregar" son siempre la parte superior de la pila, la siguiente en la pila y la parte superior de la pila, están implícitas y no es necesario especificarlas explícitamente en cada instrucción "agregar". La instrucción "agregar" en otras CPU señala explícitamente 1, 2 o 3 operandos (lo que los convierte en 1-operando, 2-operando o 3-operando CPU). Todas las CPU que he visto tienen más "registros de dirección" visibles para el programador que operandos, y con frecuencia tienen incluso más "registros de dirección" micro-arquitectónicos invisibles para el programador.

Ver

respondido por el davidcary

Lea otras preguntas en las etiquetas