Mostrando las entradas con la etiqueta tangnano. Mostrar todas las entradas
Mostrando las entradas con la etiqueta tangnano. Mostrar todas las entradas

sábado, 21 de junio de 2025

Introducción tarjeta FPGA - TangNANO 9K

FPGA Sipeed TangNANO

Fig1. Tarjeta TangNANO9K
 

Saludos cordiales a los interesados en el mundo de la electrónica digital, agradezco tu visita a mi blog y quiero recordarte que cualquier sugerencia o critica constructiva sera bienvenida, me pueden contactar con los datos que dejo al finalizar esta publicación. Mencionar también que el propósito de la presente publicación solo tiene fines educativos.

Hoy quiero continuar con el aprendizaje de los dispositivos lógicos programables describiendo las características y el uso de una tarjeta de desarrollo TangNANO9K, que viene a ser una mejora de la primera que publique en un entrada anterior.  Esta tarjeta mantiene su reducido tamaño y bajo precio que lo hace ideal para utilizar las practicas de laboratorio de la materia Sistemas Digitales.  Además se pretende hacer uso de lenguajes descriptivos HDL con la posibilidad de implementar los circuitos digitales de baja a mediana complejidad generando así experiencias de trabajo.

Esta tarjeta posee un chip FPGA GW1NR-9C de la serie Litle Bee fabricado por Gowin Semiconductor, una empresa China relativamente nueva con respecto a otros fabricantes como Altera, Xilinx o Lattice. La tarjeta en particular esta construida y comercializada por SIPEED con el sobrenombre de TangNANO 9K, integrando el chip GW1NR-LV9QN88PC6/I5 y representa un modelo intermedio de su serie, por lo que tomando en cuenta los fines educativos podemos deducir que la misma dispone de recursos suficientes para realizar nuestras practicas de laboratorio, además su bajo costo y la integración del hardware adicional nos permitirá cargar y depurar el firmware conectando al puerto USB de nuestro ordenador.

Doy por entendido que ya se cuenta con conocimientos básicos de electrónica digital, dispositivos lógicos programables y lenguajes HDL. Si aun no estas familiarizado con las FPGA's aquí te dejo algunos enlaces muy interesantes:

Introducción a la FPGA 

Hablando del chip en si, el modelo  GW1NR-9C cuenta con un total de 8648 LUT's (Look-Up Tables), para tener una idea mas simple podemos imaginar que estas FPGA disponen principalmente de dos elementos denominados como Unidad Lógica Configurable (CLU) y Unidad Funcional Configurable (CFU), entonces la configuracion lógica de estos elementos es controlada por las LUT. Por lo general las LUT son de cuatro entradas LUT-4, pero pueden interconectarse para formar LUT de mas entradas, son como las tabla de verdad pero con las salidas pre-establecidas durante el proceso de sintensis.

Adicionalmente la FPGA GW1NR-9C dispone de los siguientes elementos:

  • 468Kbit de memoria en bloque B-SRAM con una disposición configurable.
  • 17280 bits de memoria Shadow S-SRAM
  • 608Kbit de memoria de usuario no volátil tipo FLASH.
  • 6480 Registros Bi-estables síncronos (FF)
  • 41 pines de entrada y salida distribuidos en 4 bancos
  • 64Mbit de memoria SDRAM
  • 20 Multiplicadores 18x18 y 2 PLL

La configuracion inicial que adquiere una FPGA es parte del proceso de carga del firmware en la que podemos considerar los siguientes escenarios:

Se establece temporalmente mediante JTAG, la configuracion de todos los elementos lógicos necesario de una FPGA para fines de prueba y depuración del circuito digital que se implementara. En este caso, la configuracion es volátil, y se perderá la funcionalidad cuando se reinicie el circuito.

Se transfiere la configuracion a una memoria no volátil, entonces cuando se energiza el circuito la FPGA configura toda su lógica desde esta memoria, para luego iniciar la funcionalidad del circuito implementado.

Fig2. Elementos de la Placa TangNANO9K

La placa TangNANO 9K integra adicionalmente los siguientes elementos:

  • Un chip de memoria FLASH de 32Mbits para guardar el firmware
  • Un cristal de 27MHz conectado a la entrada pin 52(GCLKT1)
  • Dos pulsadores con resistencias pull-up conectadas los pines 3 y 4
  • Seis leds conectados a los pines 10,11,13,14,15 y 16
  • Puerto de salida a pantalla RGB/LCD y HDMI
  • Puerto lector de memorias microSD
  • Puerto de carga y depuración USB-C

La integración de todos estos elementos facilita la conectividad y puesta en marcha de los circuitos que vamos a elaborar, conforme a la siguiente distribución de pines.

Fig3. Mapa de pines Tangnano9k (src: wiki.sipeed.com)

A diferencia de la tangnano original esta tarjeta si cuenta con una memoria no volátil externa de 32Mbit que permitirán la carga de firmware a la FPGA de manera permanente.

Software Gowin Requerido

Este FPGA es un producto creado por Gowinsemi, es decir que es propietario y necesitaremos utilizar software desarrollado por este fabricante, este software que consta principalmente de un IDE debemos descargar e instalar en nuestro ordenador para así trabajar con el desarrollo del circuito, para llevar esta instalación debemos seguir los siguientes pasos:

  1. Registrarse en la pagina de GoWin,  <Click Aquí>; 
  2. Ingresar con la cuenta registrada. <Click Aquí>; 
  3. Descargar el software Gowin EDA Standard. <Click Aquí>; 
  4. Solicitar la licencia completando el formulario. <Click Aquí>;

Después de 24 horas, Gowin le enviara la licencia al correo que registro en el formulario, y cuando proceda a instalar el software Gowin EDA Standard, al momento de iniciar por primera vez se le pedirá la activación con la licencia que le fue enviada.

Ya con el software Gowin EDA instalado sera posible diseñar y sintetizar nuestros circuitos digitales en la tarjeta TangNano9K.

Creación y configuración del proyecto Gowin

La versión utilizada al momento de crear esta entrada es la 1.9.11.02, luego de instalar y registrar la licencia, arrancaremos la aplicación de diseño GoWin FPGA Designer, y crearemos nuestro primer proyecto a través del menú File->New->FPGA Design Project.

Fig4. Asignación del nombre de proyecto Gowin

Luego de establecer la ruta o carpeta de trabajo y el nombre de nuestro proyecto testnano1, el asistente nos pedirá la informacion del chip FPGA que utilizaremos.

Fig5. Selección del dispositivo FPGA
Finalmente nos muestra un resumen de la configuracion inicial de nuestro, en la revisaremos que los datos proporcionados sean correctos, así como la selección de nuestro dispositivo FPGA.

Fig6. Resumen de la configuracion inicial

Luego de completar la configuracion inicial, agregaremos al proyecto nuestro primer archivo verilog, para esto seleccionamos a través del menú File->New->Verilog File, y completo el nombre del archivo que en mi caso coloque top.

Fig7. Creación del archivo Verilog

A continuación se muestra el código modulo del modulo top.v con sus respectivos comentarios explicando con mayor detalle la operación del circuito, escribimos este código a nuestro archivo tal como se observa en la figura 8.

module top(but1, but2, led1, led2);
input but1, but2; 
//define las dos entradas
output led1, led2;
//define las dos salidas
assign led1 = but1;
//asigna al led1 el estado del but1
assign led2 = but2;
//asigna al led1 el estado del but1
endmodule

Fig8. Modulo descriptivo top.v

Luego debemos agregar una archivo que se utiliza para describir la asignación de pines y su restricción, para esto seleccionamos a través del menú File->New->Physical Constraint File y completo el campo con el nombre top.cst
 

Fig9. Creación del archivo de asignación

Una vez creado el archivo podemos encontrar en la barra de iconos la opción para abrir el FloorPlanner, en la que escribiremos la asignación de pines físicos a los entradas y salidas declaradas en el modulo descriptivo top.v, es importante que antes realizar esta asignación el código verilog sea sintetizado sin errores.

Fig10. Barra de iconos (FloorPlanner)

Fig11. Asignación de pines en (I/O constraint)
Los pines 3, 4 corresponden a los pulsadores S1, S2  y los pines 10,11 al LED1, LED2 de la TangNANO9K.
Finalmente FloorPlanner nos genera automáticamente el código del archivo top.cst por lo que ahora nos queda solamente hacer la sintentizacion y ruteo del proyecto, tal como se puede ver en la siguiente imagen.

Fig12. Archivo de Asignación física para ruteo final

Ahora tenemos listo los archivos generados en la carpeta /impl/pnr dentro de la carpeta de nuestro proyecto, entre estos archivos se encuentra el firmware o bitstream que deberá cargarse a la FPGA, este archivo contiene la configuracion de todas la LUTS y recursos adicionales. 

Cargando el firmware a la FPGA

Fig13. Ejecución de Gowin Programmer
Este paso representa básicamente la implementación del circuito digital en la FPGA, en el caso de la tarjeta Tangnano9k bastara con conectar a un puerto USB y proceder a la descarga del archivo testnano1.fs a la FPGA. Para llevar a cabo esta operación GoWin cuenta con la opción GoWin Programmer pero debido a razones de compatibilidad entre las versiones, te tenido inconvenientes con mi ordenador que corre Linux/Debian 12, por lo que vi mejor utilizar openFPGALoader que es un software de distribución libre y además soporte una gran variedad de tarjetas FPGA. El repositorio oficial es: https://github.com/trabucayre/openFPGALoader

Una vez instalado, bastara acceder a la linea de comandos, ingresar al directorio del proyecto, luego a la subcarpeta /impl/prn donde se encuentra el firmware,  y ejecutar la siguiente orden.

#openFPGALoader -m -b tangnano testnano1.fs
    Jtag frequency : requested 2.50MHz -> real 2.00MHz  
    erase SRAM Done
    Flash SRAM: [=============================] 100.00%
    Done

Si nuestro fin es cargar el firmware de forma permanente, entonces debemos transferir el archivo a la memoria FLASH que integra la tarjeta, aplicando el siguiente comando:  #openFPGALoader -f -b tangnano testnano1.fs

En este momento el circuito que hemos diseñado ya debería estar funcionando.

Como resumen de todo lo descrito en la sección, te dejo un vídeo donde se observa la creación e implementación del proyecto con el software GoWin EDA y también el acceso al repositorio GOLAB1 donde alojare algunos ejemplos de uso para esta tarjeta. 

Nuevamente quiero agradecer tu visita a mi blog, se que no detalle muchos pasos con relación a la instalación de los programas utilizados pero cualquier consulta al respecto puede escribirme al correo y con mucho gusto veré como colaborar. 

Atentamente, Pablo Zárate A.  email: pablinza@me.com / pablinzte@gmail.com, @pablinzar

Santa Cruz de la Sierra - Bolivia



lunes, 6 de marzo de 2023

Introducción tarjeta FPGA - TangNANO

FPGA Sipeed TangNANO

Fig.1 Tarjeta TangNano 2704 (GW1N-1)

Saludos cordiales, esperando aportar con un granito de arena en el aprendizaje de la electrónica digital, agradezco tu visita a mi blog, y recordar que cualquier sugerencia o critica constructiva sin duda me escriben a pablinza@me.com. Mencionar también que el propósito de la presente publicación solo tiene fines educativos.

Hoy quiero hacer una introducción y comentar acerca de una tarjeta de desarrollo, que tiene algo muy peculiar que sobresale con el resto de tarjetas; y es su reducido tamaño y precio me sin duda me da a entender que tengo a mano el dispositivo adecuado para introducir en la materia de sistemas digitales el uso de lenguajes descriptivos con la posibilidad de implementar los circuitos como parte de las experiencias que se pretende generar en las actividades efectuadas en laboratorio.

Fig2. Elementos de la Tarjeta TangNANO

Esta tarjeta posee un chip FPGA GW1N-1 de la serie Litle Bee fabricado por Gowin Semiconductor, una empresa China relativamente nueva con respecto a otros fabricantes como Altera, Xilinx o Lattice. Viendo mas de cerca, la tarjeta comercializada por SIPEED con el sobrenombre de TangNANO, utiliza el chip GW1N-LV9QN48C6/I5 que físicamente se distingue por el encapsulado QFN-48, y representa el modelo mas básico de su serie, pero considerando los fines educativos para nuestro caso, podemos afirmar que cuenta con recursos suficientes para realizar nuestras practicas de laboratorio y particularmente la razón que mas relevancia tiene al menos desde mi perspectiva, es su bajo costo y la no dependencia de hardware adicional para depurar y cargar el firmare en la memoria, por lo que solo bastara conectarlo a un puerto USB de nuestro ordenador y empezar a trabajar con el.

Doy por entendido que ya se cuenta con conocimientos básicos de electrónica digital, dispositivos lógicos programables y lenguajes HDL. Si aun no estas familiarizado con las FPGA's aquí te dejo algunos enlaces muy interesantes:

Introducción a la FPGA 

Hablando del chip en si, el modelo  GW1N-1 cuenta con un total de 1152 LUT's (Look-Up Tables), para tener una idea mas simple de esto podemos imaginar que cada LUT controla la función lógica de un elemento logico configurable, por lo tanto los valores de entrada a cada LUT se almacenaran en una memoria para configurar la estructura funcional del circuito que se va implementar.

Adicionalmente la FPGA GW1N-1 dispone de los siguientes elementos:

  • 72Kbit de memoria en bloque B-SRAM con una disposición configurable.
  • 96Kbit de memoria de usuario no volatil tipo FLASH.
  • 864 Registros Bi-estables síncronos (FF)
  • 41 pines de entrada y salida distribuidos en 4 bancos

La configuracion inicial que adquiere una FPGA es parte del proceso de carga del firmware en la que podemos considerar los siguientes dos escenarios:

Se establece temporalmente mediante JTAG, la configuracion de todos los elementos lógicos necesario de una FPGA para fines de prueba y depuración del circuito digital que se implementara. En este caso, la configuracion es volátil, y se perderá la funcionalidad cuando se reinicie el circuito.

Se transfiere la configuracion a una memoria no volátil, entonces cuando se energiza el circuito la FPGA configura toda su lógica desde esta memoria, para luego iniciar la funcionalidad del circuito implementado.

La placa TangNANO integra adicionalmente un chip de memoria PSRAM de 64Mbits que podrá utilizarse como recurso de almacenamiento temporal extra, también posee un cristal de 24MHz conectado a la entrada pin 35 (GCLKT2) , dos pulsadores con sus resistencias pull-up conectadas los pines 14/15, un led RGB conectado a los pines 16/17/18 y elementos necesarios para su puesta en marcha, facilitando la conectividad conforme a la siguiente distribución de pines.

Fig3. Distribución de pines TangNANO

Un aspecto importante de mencionar con respecto a esta tarjeta, es que no dispone una memoria externa para almacenar la configuracion o firmware del circuito por lo que los circuitos implementados con fines de prueba serán de  forma temporal.

Software Gowin Requerido

Este FPGA es un producto creado por Gowinsemi, es decir que es propietario y necesitaremos utilizar software desarrollado por este fabricante, este software que consta principalmente de un IDE debemos descargar e instalar en nuestro ordenador para así trabajar con el desarrollo del circuito, para llevar esta instalación debemos seguir los siguientes pasos:

  1. Registrarse en la pagina de GoWin,  <Click Aquí>; 
  2. Ingresar con la cuenta registrada. <Click Aquí>; 
  3. Descargar el software Gowin EDA Standard. <Click Aquí>; 
  4. Solicitar la licencia completando el formulario. <Click Aquí>;

Después de 24 horas, Gowin le enviara la licencia al correo que registro en el formulario, y cuando proceda a instalar el software Gowin EDA Standard, al momento de iniciar por primera vez se le pedirá la activación con la licencia que le fue enviada.

Ya con el software Gowin EDA instalado sera posible diseñar y sintetizar nuestros circuitos digitales en la tarjeta TangNano.

Fig4. Software Gowin EDA Standard

Creación y configuración del proyecto Gowin

La versión utilizada al momento de crear esta entrada es la 1.9.8.10, luego de instalar y registrar la licencia, arrancaremos la aplicación de diseño GoWin FPGA Designer, y crearemos nuestro primer proyecto a través del menú File->New->FPGA Design Project.

Fig5. Nombre del proyecto

Fig6. Selección del dispositivo    

Una vez creado el proyecto, en la parte superior izquierda no aparece la estructura del proyecto, aquí agregaremos haciendo click derecho un par de archivos.

Fig7. Adición de archivos al proyecto
El primer archivo corresponde con la codificación en verilog de un modulo descriptivo para hacer una pequeña prueba de funcionamiento, este archivo lo llamare testled.v

Fig8. Adición de un archivo verilog
 
Fig9. Asignación de nombre al archivo

El segundo archivo tiene como finalidad guardar el mapeo y configuración de las entradas y salidas del modulo descriptivo hacia los pines físicos de la FPGA, este archivo lo llamare tangnano.cst, haciendo referencia al modelo de tarjeta.

Fig10. Archivo para el mapeo de pines

Fig11. Asignación del nombre al archivo

Ahora la estructura final de nuestro proyecto, se vera como la imagen inferior, en este caso solo hay dos archivos que representan la estructura mínima para implementar un circuito digital.

Fig12. Estructura final del proyecto

Entonces es hora describir un circuito en el archivo testled.v, que va realizar una tarea bastante simple, un contador servirá para dividir la frecuencia principal del reloj de 24MHz a una frecuencia próxima al Herz, esto con el propósito de destellar de forma individual cada luz RGB integrado en la placa. Además el circuito también tendrá una entrada de reinicio con la que sera posible para y apagar el destello.

A continuación se muestra el código modulo testled con sus respectivos comentarios explicando con mayor detalle la operación del circuito.

module testled(clk, rstn, ledR,ledG,ledB);
input clk, rstn; //Entradas pines 35 y 14 reloj de 24MHz
output ledR, ledG, ledB; //Salidas pines 18, 17 y 16
reg [24:0] cnt; //Contador de 25-bit
reg [1:0] i; //Contador de 2-bit rango 0-3
reg [2:0] ledrgb;//Registro de 3-bit
wire clk1 = cnt[24];//Señal clk1 asignada al bit 25 del contador
assign {ledR, ledG, ledB} = ledrgb;//Se
ñales RGB del LED asignado al registro
 
always @(posedge clk) //Ciclo, frecuencia de 24MHz 
    cnt <= cnt + 1'b1; //Incremento y desborde, bit 25 con ciclo de 1.39s = 2^25/24M
 
always @(posedge clk1, negedge rstn) //Ciclo 1.39s aproximado 0.71Hz
    if(rstn == 0) ledrgb <= 3'b111;//Si rstn esta activo, LED Apagado
    else
    begin
        if(i == 0) ledrgb <= 3'b111; //LED Apagado
        if(i == 1) ledrgb <= 3'b110; //LED Color Azul
        if(i == 2) ledrgb <= 3'b101; //LED Color Verde
        if(i == 3) ledrgb <= 3'b011; //LED Color Rojo
        i <= i + 1'b1; //Incrementa contador.
    end
endmodule

Finalizada la edición necesitamos definir en la configuración del proyecto, menú Project-> Configuration el modulo top, que vendrá a ser el modulo testled que acabamos de crear, aquí solo se debe colocar el nombre.

Fig13. Asignación del modulo Top  

Ya con estos ajustes sera posible sintetizar el circuito para que luego procedamos a trabajar con el mapeo del circuito, el archivo del mapa físico tangnano.cst puede ser generado de manera gráfica haciendo click en la opción floor planner, aquí se creara una matriz con la asignación de todas la entradas y salidas del modulo, por lo que tocara determinar la asignación de pines físicos en la FPGA.

Fig14. Asignación de pines en planificador

Otra forma de crear este archivo de mapas es editar la configuración de forma manual, esto sin duda implica mas trabajo para el diseñador, en cualquiera de los casos el código sera el siguiente:

IO_LOC "ledB" 17;
IO_PORT "ledB" IO_TYPE=LVTTL33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "ledG" 16;
IO_PORT "ledG" IO_TYPE=LVTTL33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "ledR" 18;
IO_PORT "ledR" IO_TYPE=LVTTL33 PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "rstn" 14;
IO_PORT "rstn" IO_TYPE=LVTTL33 PULL_MODE=UP BANK_VCCIO=3.3;
IO_LOC "clk" 35;
IO_PORT "clk" IO_TYPE=LVTTL33 PULL_MODE=UP BANK_VCCIO=3.3;


Una vez realizada la asignación de pines nos sera posible generar las conexiones y ruteo que posibilita la creación de un bitstream o firmware del circuito digital, cuyo resultado se almacena en el fichero gwn1_test.fs. Este archivo deberá sera cargado a la FPGA.

Cargando el firmware a la FPGA

Este paso representa básicamente la implementación del circuito digital en la FPGA, en el caso de la tarjeta TangNano bastara con conectar a un puerto USB y proceder a la descarga del archivo gw1n_test.fs a la FPGA. Para llevar a cabo esta operación GoWin cuenta con el software de Programación GoWin Programmer pero debido a la compatibilidad entre versiones con mi ordenador Linux/Debian 12 he preferido utilizar openFPGALoader que es un software de distribución libre y con soporte para una gran variedad de tarjetas FPGA. El repositorio oficial es: https://github.com/trabucayre/openFPGALoader

Una vez instalado, bastara acceder a la linea de comandos, ingresar al directorio del proyecto, luego el subdirectorio /impl/prn donde se encuentra el firmware,  y ejecutar la siguiente orden.

#openFPGALoader -m -b tangnano gw1n_test.fs
    write to ram
    Jtag frequency : requested 6.00MHz -> real 6.00MHz  
    Parse file Parse gw1n_test.fs:  Done
    DONE
    Jtag frequency : requested 2.50MHz -> real 2.00MHz  
    erase SRAM Done
    Flash SRAM: [=============================] 100.00%
    Done

Ahora nuestro circuito implementado ya debería estar funcionando en la FPGA

Fig15. Funcionamiento del circuito
Como resumen de todo lo descrito en la sección, te dejo un vídeo donde se observa la creación e implementación del proyecto con el software GoWin EDA.

Haz click <<aquí>> para descargar la carpeta del proyecto

Nuevamente quiero agradecer tu visita a mi blog, se que no detalle muchos pasos con relación a la instalación de los programas utilizados pero cualquier consulta al respecto puede escribirme al correo y con mucho gusto veré como colaborar. 

Atentamente, Pablo Zárate A.  email: pablinza@me.com / pablinzte@gmail.com, @pablinzar

Santa Cruz de la Sierra - Bolivia