-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Voy a empezar a implementar bloques para realizar entrada/salida directamente desde los circuitos hardware. Cómo molaría tener una consola, con comandos, que esté implementandad totalmente en hardware 😄
Estos bloques además, permitirán depurar los circuitos más fácilmente
Vamos a partir del bloque serie de la colección Jedi. Para nosotros será una máquina básica, cuya función es la de transmitir un byte por el puerto serie. Como lo voy a tratar como una máquina, voy a modificar el compoente de la colección Jedi para darle el look de máquina
Ya tengo el bloque putc-bit, para enviar el estado de un bit. Voy a hacer la versión transparente (TC: Transparent channel) que permite encadenarlos. He hecho pruebas con caracteres normales y la cosa funciona bastante bien :-)
El componente putc-bit-TC también está listo. on este componente ya se puede hacer una "tabla de verdad" cutre, que aparezca bien muestreando a una frecuencia fija, o bien cuando hay un cambio en las entradas
El putc-bit (-TC) está funcionando muy bien. Ahora hay que permitir que se pueda enviar un carácter cualquiera Putc-char: ejemplo 2 hecho: Imprimir el estado del pulsador y un /n al final... OK!
Para probarlo con el tio hay que ejecutar esta línea:
tio -m INLCRNL /dev/ttyUSB1
El ejemplo 2 funciona muy bien directamente desde el terminal. Para configurarlo hay que poner:
stty -F /dev/ttyUSB1 raw ispeed 115200 ospeed 115200 cs8 -ignpar -cstopb -echo
Y luego con sólo hacer:
cat /dev/ttyUSB1
ya vemos lo que nos envía la placa :-) ¡¡Mola!!!
Ejemplo 3: puerta not. Se muestrean la entrada y la salida cada 100ms
Ejemplo 4 del Putc-char listo: tabla de verdad de la puerta not. Se envía el estado de la entrada y la salida cada vez que hay un cambio en el estado de la entrada
Putc-char-TC: Ejemplo 1 y 2 listos!
Ya tengo los ejemplos 3 y 4 de Putc-char-TC. Funcionan muy bien! :-) He hecho el ejemplo de monitorizar una puerta NOT, y va de lujo
Lo siguiente será meter el componente para las cadenas, que es super importante: PRINT!
¡Ya tengo una primera versión del bloque de Print! Voy a hacer algunons ejemplos
Para pasar de texto a ASCII se puede usar esta línea en python:
print(" ".join(["{:02X}".format(ord(i)) for i in "Mi cadena de texto"]) + " 00")
Ejemplos a hacer:
- Ejemplo 1: Imprimir dos cadenas, una al apretar el pulsador 1 y otra al apretar el 2 (OK)
- Ejemplo 2: Lo mismo pero con ASCII ART (OK)
- Ejemplo 3: Pantalla con mensaje inicial, al hacer reset: "HW STDIO...". Con el pulsador SW1 se cambia el estado de un LED (toggle) y se imprime la cadena OK!. Con el pulsador SW2 se imprime el estado actual del LED: ON u OFF
Para hacer pruebas con el terminal hw de entrada, se puede probar el ejemplo 3 pero usando la tecla r para "Leer" el estado del LED. Luego ampliarlo con otras teclas para cambiar las entradas
Para los mensajes en ARTE ASCII estoy usando este enlace: http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20
Ya tengo listo el bloque Getc-bit para recibir bits. Funciona muy bien!
TODO: Ejemplo 2 del getc-bit: Encender y apagar dos leds con 0,1 y 's' y 'n' TODO: InputLn-bit: para introducir un bit, con edición
Ejemplo 2 del getc-bit Listo! Se encienden y apagan los leds con 0,1 y 's' y 'n'
Ejemplo 3 del getc-bit Listo!: Preguntar inicialmente por el encendido de un circuito de prueba
TODO: Input-bit: para introducir un bit, con o sin eco. Es necesario porque hay que gestionar la habilitación o no de los receptores. Así, el receptor se convierte también en una máquina
Ya tengo los tres ejemplos del input-bit listos. También he hecho el bloque printLN-OK y su depurador correspondiente. Es el momento de hacer la Release 0.1. OK!
Ya tengo una versión de print para el bus stdout (print-asc). Se le pasa como parámetros caracteres ASCII (Colocando su código ascii en la memoria). Voy a modificar todos los ejemplos para usar este nueva rutina de print
¡Listo! El print-TC ya está eliminado y se ha sustituido por print-asc
¡Ya tengo el primer bloque print-str funcionando! Es para cadenas de 4 caracteres, y puesto que hay un 0 al final, solo podemos imprimir mensajes de 3 caracteres. Por ejemplo "OK\n" :-)
Antes de seguir voy a explorar más el bug que aparece en las memorias inicializadas desde cadena de texto al hacer la verificación:
En la línea:
localparam LEN = $size(STR)/8;
Sale este error:
Unable to evaluate parameter LEN value : ($size(<STR="\00\000", wid=16))/(32'b0000000000000000000000000001000)
Lo he reducido a lo mínimo, este código da error:
localparam STR = "hola";
localparam LEN = $size(STR);
OK. Ese error se soluciona usando $bits en vez de size
localparam LEN = $bits(STR);
Lo he probado y va bien... pero aparece otro error en el iverilog:
mem_8[LENT-1 - j] = str[ 8*(j+E)+1 : 8*(j+E+1) ];
El mensaje de error es:
A reference to a wire or reg ('j') is not allowed in a constant expression.
Part select expressions must be constant
El código mínimo que provoca el error es este:
reg [7:0] mem_8 [0:4];
reg [8:1] str = "hola";
integer j;
initial begin
for (j = 0; j < 4; j++)
mem_8[j] = str[j+1: j];
end
Parece que al verilog lo que no le gusta es usar el operador :, pero si se usa la variable j parece que se lo traga... Una posible solución sería obtener los 8 bits del caracter a pelo, usando concatenación de bits. Este es un ejemplo con 2 bits, que no da error:
mem_8[j] = {str[j], str[j-1]};
¿Funcionará para 8?
¡¡¡Siiiiii!!!! Joder... parece que funciona!!!! Ya no da el error en verificación y parece que sintetiza bien!! Perfecto! Ya tengo los bloques print-str-2 y print-str-4 operativos, con sus ejemplos de prueba :-)
Ya tengo listas todas las memorias que faltan: 64B, 128B y 256B, tanto de inicialización con código ASCII como con cadenas
- NEXT: Implementar print-asc-128B y sus circuitos implicados (máquina de contar con stop)
Listo print-asc-128 y print-str-128
- NEXT: print-asc-256 y print-str-256
Ya tengo todos los ejemplos migrados a los buses stdin y stdout. Primer ejemplo de hcalc-0.1, un calculadora de bit, que usa un acumulador (acc = acc + op). El usuario introduce el operando binario (0,1) y se va acumulando. El resultado se muestra sólo en un bit
Next: Calculadora de 1 bit de 2 operandos. Hay dos versiones, la version de terminal y la version que vaya rellenando op1 + op2 = res.... OK!
Next: Pruebas de la memoria de 2x1 bits...OK!
Next: Pruebas de la pila...
Recordatorio:
tio -m INLCRNL,ODELBS,OCRNL /dev/ttyUSB1