Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Temas de diseño con HDL que no dependen de un lenguaje en particular, o que pueden aplicarse a cualquier lenguaje (diseño óptimo de FSM, optimizaciones para facilitar el timing closure, etc). Si hay que poner algún ejemplo podrá usarse VHDL o Verilog (o idealmente, el mismo ejemplo en ambos lenguajes)
Responder
Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 80
Registrado: 14 Ago 2018, 01:15

Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por mcleod_ideafix » 01 Sep 2018, 03:45

Una de las características más comunes de las llamadas placas "entrenadoras" de FPGA (es decir, las placas que se venden precisamente para poder practicar con FPGAs por parte de Digilent, Terasic, y otros) es que disponen de cantidad de sistemas sencillos de usar, tanto de entrada de datos (botoneras, interruptores, conmutadores rotativos, etc) como de salida de datos (leds, displays de 7 segmentos, displays OLED, etc).

de2-115.jpg
de2-115.jpg (102.16 KiB) Visto 13478 veces
Estos añadidos sirven fundamentalmente para ayudar a depurar el hardware que se está diseñando. Depurar hardware tiende a ser más complejo que depurar software, y en muchos casos, hay que optar por algo equivalente a lo que en software es un mensaje de depuración, un pitido, o alguna otra cosa. Por ejemplo: estás depurando un módulo hardware de acceso a un teclado y quieres comprobar que efectivamente el sistema se da cuenta de que se ha pulsado una tecla. Pues bien, coges y enlazas un led a la señal que indica que una tecla se ha pulasdo. Así, cuando se pulsa una tecla, se enciende el led y se apaga cuando la sueltas. Cosas así...

En ZXUNO, ZXDOS y UnAmiga no tenemos nada de esto. La entrada de estos sistemas es el ratón y el teclado, cuyos módulos de control han de codificarse, y la salida principal es la pantalla.

Pues bien, para ayudar a todos aquellos que estais portando cores y necesitais algo que ayude a depurar errores ocultos, o para los que están empezando con esto del VHDL y el Verilog y necesitan una ayuda para "ver" como se comporta su diseño, he escrito un módulo que permite, principalmente, mostrar en pantalla una representación visual de lo que hay en estas placas entrenadoras.

Concretamente, las características del módulo "display", que es como lo he llamado, son las siguientes:
- Display de 12 dígitos hexadecimales independientes, agrupados visualmente en grupos de 4. La fuente de letras (8x8) es configurable por el usuario en tiempo de diseño.
- 8 interruptores ON/OFF controlados por las teclas F1 a F8 en el teclado
- 8 LEDs
- Generador de sincronismos y coordenadas de pixel X,Y para presentar gráficos en una pantalla de 640x480 a 60 Hz.
- Acceso a todas las teclas del teclado y su estado (pulsada/soltada) con lo que podemos usar todo el teclado para entrada de datos.
- Los elementos visuales del módulo pueden configurarse para que aparezcan a partir de cualquier posición vertical de pantalla (centrados horizontalmente). Se puede incluso usar una línea de pantalla superior a la máxima visible (479) para ocultar por completo el display y así tener toda la pantalla para generar gráficos.

En esta figura podeis ver qué pinta tiene el display. Antes de echar la foto, he pulsado F1, F5, F6 y F8 para encender algunos interruptores. La tira de leds que hay debajo de ellos muestra el valor fijo binario 10101010. El display hexadecimal muestra la secuencia de dígitos 0123456789AB usando la fuente por defecto (IBM 437).

display.jpg
display.jpg (498.68 KiB) Visto 13478 veces
Para haceros una idea del tamaño de este display respecto de la anchura de la pantalla, tened en cuenta que el punto central del 0 ocupa 4 pixeles (un puntito hecho con 2x2 pixeles). Es decir, que cada carácter ocupa 16x16 pixeles, y dado que hay 12 caracteres más 2 espacios en blanco, la anchura de esa parte del display es de 112 píxeles, es decir, un 17,5% de la pantalla.

El módulo está escrito en Verilog, pero puede incluirse en proyectos tanto de Verilog como VHDL. He escrito un puñado de ejemplos... eso sí, en Verilog, porque no domino VHDL, que sirven para darle al usuario una idea un poco más concreta de cómo puede usar este módulo en sus diseños. Son en total 20 ejemplos, creo que decentemente comentados, y con una introducción sobre lo que hace y cómo usa el display. Hay un ejemplo aparte que no lo he escrito yo. No digo más... ;)

La estructura de directorios del ZIP adjunto es la siguiente:
- comun : contiene el módulo "display", y los ficheros .HEX de las fuentes de caracteres para el display, así como los ficheros PNG originales de esas fuentes (echadles un vistazo) y utilidades para hacer la conversión desde el PNG al HEX (se necesita ImageMagick instalado)
- ejemplos : los 20 ejemplos
- ejemplo99 : el ejemplo "extra"
- unamiga : proyecto completo para Quartus 18 que permite explorar cualquiera de los ejemplos
- zxdos : idem, pero para ZX-DOS usando el ISE Webpack 14.7
- zxuno : idem, pero para ZX-UNO v4.1 (o cualquiera compatible con él)
- zxuno_addon_vga18bits : idem, pero para el ZX-UNO con el addon VGA de 18 bits
En todos los casos, la salida de video es VGA. No RGB ni video compuesto.

Para elegir un ejemplo, sintetizarlo y verlo en acción, una vez que habeis cargado en Quartus o ISE Webpack el proyecto que corresponde a vuestra placa, abrid el fichero tld_modulos_entrenamiento_nombredevuestraplaca.v y allí vereis un montón de "includes" con comentarios. Quitadle los comentarios al que vais a usar y dejádselo a los demás. Llevad el propio fichero de ejemplo al editor para leer la introducción y saber qué hace, y cómo podemos manejarlo.

Huelga decir que se necesita el programador JTAG para trabajar con esto, enviando el diseño listo a la FPGA (USB Blaster para UnAmiga, Xilinx JTAG o algo euivalente para ZXUNO y ZXDOS). Es posible, para ZXUNO y ZXDOS, generar el fichero .ZX1 / .ZX2 a partir del BIT y grabarlo a la flash de la FPGA desde la BIOS. De todas formas, si estais pensando ligeramente en serio trastear con la FPGA, necesitareis un cable JTAG sí o sí.

OJO en Quartus, porque este entorno tiene la costumbre de cuando menos te lo esperas, añadir el fichero con el ejemplo actual al proyecto como si fuera uno más. No debe permitirse eso, sino que los ejemplos son siempre incluidos desde el tld, nunca van aparte.

Cada ejemplo asume que el TLD proporciona un reloj de 25 MHz. En cada proyecto se ha incluido un generador de reloj adecuado a cada placa.

Luego contaré más cosas, pero de momento podeis bichear con los ejemplos que os he pasado. Aunque esto no es un curso de HDL o de Verilog en particular, muchos de vosotros, sobre todo si teneis algo de bagaje en programación en C, Java u otro lenguaje con sintaxis similar, se sorprenderá al pillar la idea de todo el código, o al menos parte de él.
Adjuntos
modulos_entrenamiento.zip
(156.79 KiB) Descargado 454 veces

Avatar de Usuario
neuro_999
PLA
Mensajes: 28
Registrado: 17 Ago 2018, 10:49

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por neuro_999 » 01 Sep 2018, 08:01

Joder que pasada.
Entiendo que el modulo se "pinta" encima de la pantalla del core que estamos depurando como si un osd se tratara?.
Me parece super util, sobre todo xq estoy cansao de andar cambiando los 2 unicos leds que tiene el zxdos para andar haciendo pruebas.
Cuanta memoria se come el font?

Avatar de Usuario
jepalza
Spartan 3
Mensajes: 226
Registrado: 14 Ago 2018, 18:51

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por jepalza » 01 Sep 2018, 09:37

Cuando hice el core del Amstrad CPC 6128 de Renaud Hélias sobre el ZXUNO, tuve problemas para depurar algunas zonas, y el propio renaud me hizo un OSD que mostraba en pantalla junto al propio Amstrad funcionando, superpuesto sobre su pantalla, unos "led" virtuales, creo recordar que me puso 8 en total , por que con el único del ZXUNO no había manera de conocer algunos detalles. Ese "display" virtual, lo usábamos como binario, para mostrar un número, por ejemplo, si daba error al acceder al sistema FAT, ponía , por decir algo, 8 leds virtuales encendidos, o sea, hFF. Era un invento muy curioso y muy útil.
El problema es que estaba realizado en esquemas del Xilinx, que es mas complejo de mantener si estas trabajando en verilog.
En la versión final de core, eso se eliminó, por que sino, no entraba en la FPGA

Avatar de Usuario
mcleod_ideafix
Site Admin
Mensajes: 80
Registrado: 14 Ago 2018, 01:15

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por mcleod_ideafix » 01 Sep 2018, 11:28

neuro_999 escribió:
01 Sep 2018, 08:01
Joder que pasada.
Entiendo que el modulo se "pinta" encima de la pantalla del core que estamos depurando como si un osd se tratara?.
Exacto.
neuro_999 escribió:
01 Sep 2018, 08:01
Cuanta memoria se come el font?
El font usa 128 bytes (16 caracteres de 8x8 pixeles).

Avatar de Usuario
yombo
Veroboard
Mensajes: 18
Registrado: 17 Ago 2018, 10:51

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por yombo » 01 Sep 2018, 11:31

¡Me hubiera venido bien! Durante el desarrollo del core de Videopac usé estos 8 LED verdes que se ven en la foto. También pueden verse dos joysticks hechos con botones sobre protoboards. Usé los LED mientras debugueaba la carga de SD, tanto para ver un código de error si se producía, como para ver el dato leído de la SD.

Imagen
ERROR:NgdBuild:455 - logical net 'yombo' has multiple driver(s):
ERROR:NgdBuild:924 - input pad net 'yombo' is driving non-buffer primitives:

Mejias3D
Veroboard
Mensajes: 10
Registrado: 17 Ago 2018, 17:41

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por Mejias3D » 01 Sep 2018, 11:46

Es Admirable todo lo que hacéis y lo que sabéis. Somos afortunados de tener a personas como vosotros. Va por todos los que aparecen en este hilo y también por el resto de ingenieros que aportan a Zx-Uno en todas sus versiones y clones, la placa genérica LX16 (aka ZX-DOS), Unamiga, sintetizadores y programadores en general. Sois grandes :-)

Avatar de Usuario
Subcritical
Spartan 3
Mensajes: 225
Registrado: 24 Ago 2018, 14:52

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por Subcritical » 07 Feb 2019, 03:56

He añadido soporte para la placa Terasic DE2_70 en estos módulos.
fpga_training_modules-master.zip
(183.66 KiB) Descargado 387 veces

Avatar de Usuario
Subcritical
Spartan 3
Mensajes: 225
Registrado: 24 Ago 2018, 14:52

Re: Módulos hardware para poder usar nuestras placas como si fueran entrenadoras

Mensaje por Subcritical » 09 Abr 2019, 22:46

He modificado el último ejemplo de bart, para que responda a las señales de un mando de juegos alegándose y acercándose así como invertir la dirección de giro.


añadiendo este código donde estaba la generación automática del ángulo del ejemplo 99.

Código: Seleccionar todo

      if (inc_angle) angle <= angle + 1;
      if (dec_angle) angle <= angle - 1;
      if (inc_zoom) scale <= scale + 50;
      if (dec_zoom) scale <= scale - 50;
Y en el modulo de cabecera generando las variables necesarias como parámetros para luego agregar a la localización quedando la cabecera del módulo así.

Código: Seleccionar todo

module tld_modulos_entrenamiento_zxuno (
  input wire clk50mhz,
	input wire inc_angle, //para rotozoomer demo4
	input wire dec_angle, //para rotozoomer demo4
	input wire inc_zoom,  //para rotozoomer demo4
	input wire dec_zoom,  //para rotozoomer demo4
  input wire clkps2,
  input wire dataps2,
  output wire [5:0] r,
  output wire [5:0] g,
  output wire [5:0] b,
  output wire hsync,
  output wire vsync
  );
en el .qsf correspondiente hay que poner las siguientes lineas para altera en unamiga.

Código: Seleccionar todo

set_location_assignment PIN_P3 -to dec_angle
set_location_assignment PIN_R3 -to dec_zoom
set_location_assignment PIN_N5 -to inc_angle
set_location_assignment PIN_R4 -to inc_zoom
#joystisks pull up
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to dec_angle
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to dec_angle
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to dec_zoom
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to dec_zoom
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to inc_angle
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to inc_angle
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to inc_zoom
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to inc_zoom
en el .ucf correspondiente hay que poner las siguientes lineas para xilinx en zxuno.

Código: Seleccionar todo

## angulos
NET "inc_angle" LOC="P1"  | IOSTANDARD = LVCMOS33 | PULLUP;  #JOY6
NET "dec_angle" LOC="P5"  | IOSTANDARD = LVCMOS33 | PULLUP;  #JOY4
NET "inc_zoom" LOC="P6"  | IOSTANDARD = LVCMOS33 | PULLUP;  #JOY3
NET "dec_zoom" LOC="P7"  | IOSTANDARD = LVCMOS33 | PULLUP;  #JOY2
FIcheros modificados:
Ejemplo99_con_mando_de_juegos.zip
(3.44 KiB) Descargado 397 veces

Responder

Volver a “General”