Página 1 de 4

PCP, el Pequeño Computador Personal

Publicado: 18 Nov 2012, 16:59
por JoJo
Desde ViejuNET queremos presentaros un proyecto del que yo personalmente llevaba tiempo atras, la creacion de un computador de proposito general desde 0.

Este sistema, creado con la inestimable ayuda de zako es un computador completo con un procesador de creacion propia de 32 bits, Ithladin.

Aqui teneis un video del sistema arrancando y corriendo el Pong:

http://tube.vieju.net/video/PCP-Pong-minidemo/a33827d7e290bd3d36ae7f50f99112ee

Para mas info aqui esta su blog de desarrollo:

http://pcp.vieju.net/

Re: PCP, el Pequeño Computador Personal

Publicado: 18 Nov 2012, 17:53
por mentalthink
Que chulo JOJO, y puede representar colores graficos y demas cosillas... Muy chulo!!!, manténnos informados, al menos a mi me parece muy interesante.

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 08:18
por radastan
Al final todos teníamos la idea en mente... :D

¡Esperamos esquemas!

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 10:28
por mcleod_ideafix
Y además esa especificación de procesador está pidiendo a gritos ser implementada de forma física en una FPGA (por la cantidad de registros no cabría en una CPLD)

(yo, como siempre, barriendo para casa :P )

Preguntas:
- ¿Cuántos MIPS (millones de instrucciones por segundo) es capaz de ejecutar vuestra implementación en el AT Mega?
- ¿No habéis echado de menos otros tipos de saltos condicionales? Por ejemplo, tenéis un salto si mayor y otro salto si menor, pero ese "mayor" o "menor", ¿se refiere a números en complemento a dos o números en binario natural, sin signo? ¿Y un salto si overflow, o salto si signo?
- Las instrucciones de multiplicación y división, ¿producen resultados de 64 bits? ¿Tienen en cuenta el signo?
- Si todas las instrucciones ocupan 32 bits, la instrucción de carga inmediata, ¿cuántos bits puede cargar en un registro? (porque 32 no caben)

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 12:52
por JoJo
mcleod_ideafix escribió:Y además esa especificación de procesador está pidiendo a gritos ser implementada de forma física en una FPGA (por la cantidad de registros no cabría en una CPLD)

(yo, como siempre, barriendo para casa :P )

Preguntas:
- ¿Cuántos MIPS (millones de instrucciones por segundo) es capaz de ejecutar vuestra implementación en el AT Mega?
- ¿No habéis echado de menos otros tipos de saltos condicionales? Por ejemplo, tenéis un salto si mayor y otro salto si menor, pero ese "mayor" o "menor", ¿se refiere a números en complemento a dos o números en binario natural, sin signo? ¿Y un salto si overflow, o salto si signo?
- Las instrucciones de multiplicación y división, ¿producen resultados de 64 bits? ¿Tienen en cuenta el signo?
- Si todas las instrucciones ocupan 32 bits, la instrucción de carga inmediata, ¿cuántos bits puede cargar en un registro? (porque 32 no caben)


Si, es algo que tenemos en mente, el implementarlo en una FPGA en el futuro :)

- Pues no hemos hecho calculos. El Atmega rinde 1 MIPS por mhz, y esta a 16mhz, con lo que 16MIPS en crudo. La cpu funciona por emulacion, asi que habria que hacer calculos para determinar cuantas instrucciones se ejecutan realmente.
- De momento toda la implementacion es unsigned. No hay control de overflow.
- No, 32 bits, si hay overflow no esta controlado. No tengo pensamiento de añadir mas instrucciones condicionales, la idea es tener un juego de instrucciones muy reducido.
- Pues... 32 - 5 bits del coop - 4 bits del cod. registro, 23 bits en una carga directa... si quieres cargar un valor de 32 bits tendras que tirar de desplazamientos.

En todo caso todo esto es preliminar, es muy posible que cambie a C2 y para los resultados de 64 bits use un registro extra... ya iremos viendolo :)

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 12:54
por mcleod_ideafix
Más preguntas:
- Si se usan 4 bits para especificar un registro, y los registros r14 y r15 son en realidad el puntero de programa y el puntero de pila... ¿serían equivalentes estas instrucciones? LW R14,Rx <--> JMP Rx (en tal caso podría suprimirse la instrucción JMP del repertorio de instrucciones porque es superflua)
- Si hay 5 bits para el código de operación y 4 bits para referenciar a un registro, la instrucción LD Rx,cte sólo puede almacenar una constante de 32-5-4=23 bits. ¿Cómo se almacenaría una constante más larga? EDITO: ya he visto tu respuesta
- La instrucción SYS tiene un parámetro que es un número, pero... ¿qué es ese número? ¿un índice a un vector de direcciones tal vez?
- ¿Cuál es el mapa de memoria del sistema y dónde empieza a ejecutarse?

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 13:01
por mcleod_ideafix
JoJo escribió:- De momento toda la implementacion es unsigned. No hay control de overflow.

Ouch! Sin números con signo (mejor dicho, sin instrucciones condicionales que contemplen el signo) será complicado escribir según qué programas.

JoJo escribió:- No, 32 bits, si hay overflow no esta controlado. No tengo pensamiento de añadir mas instrucciones condicionales, la idea es tener un juego de instrucciones muy reducido.

Nosotros usamos un procesador didáctico también estilo RISC, pocas instrucciones, pero nos hemos preocupado de poder añadirle este tipo de instrucciones. Hacer un compilador de C que genere código para nuestro procesador es más sencillo si cuentas con esas instrucciones.

JoJo escribió:- Pues... 32 - 5 bits del coop - 4 bits del cod. registro, 23 bits en una carga directa... si quieres cargar un valor de 32 bits tendras que tirar de desplazamientos.

O haces como en algunos procesadores, que tienen una instrucción de carga de media palabra en la mitad alta o baja del registro. Con dos instrucciones de carga has conseguido cargar un dato de 32 bits completo.

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 13:55
por JoJo
mcleod_ideafix escribió:Más preguntas:
- Si se usan 4 bits para especificar un registro, y los registros r14 y r15 son en realidad el puntero de programa y el puntero de pila... ¿serían equivalentes estas instrucciones? LW R14,Rx <--> JMP Rx (en tal caso podría suprimirse la instrucción JMP del repertorio de instrucciones porque es superflua)
- Si hay 5 bits para el código de operación y 4 bits para referenciar a un registro, la instrucción LD Rx,cte sólo puede almacenar una constante de 32-5-4=23 bits. ¿Cómo se almacenaría una constante más larga? EDITO: ya he visto tu respuesta
- La instrucción SYS tiene un parámetro que es un número, pero... ¿qué es ese número? ¿un índice a un vector de direcciones tal vez?
- ¿Cuál es el mapa de memoria del sistema y dónde empieza a ejecutarse?


- Si, seria equivalente, pero hemos añadido JMP por claridad :) Tambien podriamos haber suprimido SUB y forzar a restar con sumas ;)
- No, virtualmente uno podria imaginarse que es como las INTs del pc, vector de interrupcion, destino de la rutina y volver... pero no, aqui esta creado todo por codigo dentro del Atmega. Puedes ver el fichero system.cpp de la implementacion.
- Lo mas simple posible, dado que no hay nada mapeado, ni vectores de interrupcion, ni I/O en memoria... el sistema arranca, carga el fichero bios.bin en la memoria desde 0x0, luego pone el PC en esa posicion y empieza a ejecutar.

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 14:09
por mcleod_ideafix
JoJo escribió:- Si, seria equivalente, pero hemos añadido JMP por claridad :) Tambien podriamos haber suprimido SUB y forzar a restar con sumas ;)

En el primer caso, ambos nmemónicos hacen exactamente lo mismo. Podrías usar una macro en el ensamblador que tradujera JMP por LD con el registro adecuado. Tardaría lo mismo y ocuparía lo mismo en memoria.

JMP [R5]: ocupa 32 bits. Carga en el registro contador de programa (RPC o R14) la palabra contenida en R5
LW R14,[R5]: ocupa 32 bits. Literalmente, carga la palabra contenida en R5 en R14 (RPC).

El segundo caso no es igual. Restar sumando implica calcular antes el complemento a 2 del sustraendo para poder sumárselo al minuendo. Calcular el complemento a 2 en vuestra CPU implica usar dos instrucciones: NOT (para calcular el complemento a 1) y ADD para incrementar el resultado.

SUB R1,R2,R3: ocupa 32 bits. Hace R3 := R1-R2

Su equivalente sin SUB sería:
NOT R2,R2 ;R2 complementado a 1
LD R3,1 ;Cargamos constante 1
ADD R2,R3,R2 ;Sumamos. Ahora R2 es el complemento a 2 de R2 original
ADD R1,R2,R3 ;Sumamos a R1 y resultado en R3
Ocuparía 128 bits, y tardaría, en principio, 4 veces más que el SUB original. SUB no sería superflua en este caso.

Re: PCP, el Pequeño Computador Personal

Publicado: 19 Nov 2012, 15:03
por JoJo
A ver, si, seria lo mismo, pero dado que la especificacion original dice que los registros de uso general son r0 - r13, rsp y rpc no deben de poder tocarse a mano.

En la implementacion actual si es asi, pero la idea es que no se puedan tocar como r14 y r15 ;)