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

miércoles, 9 de abril de 2025

Verilog en Linux

Si bien existen herramientas específicas, de fabricantes como Xilinx o Intel, que funcionan en Linux, es interesante tener un herramienta liviana y gratuita para realizar pruebas.

Comenzar instalando iverilog, el cual es un compilador que traduce código fuente Verilog en un programa ejecutable para simulaciones.

# apt install iverilog

Luego instalar gtkwave, la cual es una herramienta de visualización de archivos VCD (entre otros). 

Nota: VCD son las iniciales de "Value Change Dump" , y es un formato de archivos industrial estándar para el volcado de simulaciones.

# apt install gtkwave

Ahora en un editor de texto, creamos un sencillo ejemplo en verilog de una compuerta and de 2 entradas, llamado and_2_in.v :


module and_2_in(
input a,
input b,
output x
);

assign x = (a & b);
endmodule

Luego, en la misma carpeta, creamos un testbench de ejemplo, and_2_in_tb.v


  
`timescale 10ns/100ps

module and_2_in_tb;

reg i,j;
wire z;

and_2_in u0_DUT(
.a(i),
.b(j),
.x(z)
);

initial begin

$dumpfile("wave_tb_and_2_in.vcd");
$dumpvars(0,and_2_in_tb);
i=1'b0;
j=1'b0;
#5 i=1'b1;
#5 i=1'b0;
#5 j=1'b1;
#5 i=1'b0;
#5 i=1'b1;
#5 j=1'b1;
#5 $finish;
end
endmodule

Compilamos el programa and_2_in.v, y además pasamos como argumento el testbench and_2_in_tb.v, con el comando:

$ iverilog -o out_and_2_in and_2_in.v and_2_in_tb.v

 Iverilog generará el archivo ejecutable out_and_2_in . Este archivo no es ejecutable por cualquier plataforma, por lo que se invoca a vvp.

 Lanzamos vvp, el cual es el "run time engine", que ejecuta la salida compilada de iverilog:

$ vvp out_and_2_in

El comando anterior genera un archivo  vcd con el nombre asignado en el apartado $dumpfile("wave_tb_and_2_in.vcd") del testbench.

Finalmente, lanzamos gtkwave pasando como argumento el archivo vcd generado.

$ gtkwave wave_tb_and_2_in.vcd


 

Seleccionamos la señales que nos interesa visualizar :


 

Ajustamos el zoom:



T.R.

 

 


sábado, 28 de septiembre de 2019

STM32F103 como JTAG - SVF player - CPLD Altera - Quartus - Parte 1

Introducción.

    En una entrada anterior, preparamos una Raspberry pi 3 como interfaz JTAG. 

    En esta ocasión prepararemos una placa de desarrollo con STM32F103 (aka BluePill).
   
Fuente: https://os.mbed.com/users/hudakz/code/STM32F103C8T6_Hello/

    Al igual que con la raspberry, podremos reproducir archivos SVF, los cuales nos permitirán, entre otros usos, la programación, de CPLD's.

    Todos los pasos detallados fueron realizados desde un Host (mi PC) con distro Debian 9.

Preparación de la placa.

   Para la realización utilizaremos el firmware DirtyJtag que nos permitirá utilizar nuestra placa como un adaptador JTAG.

   Primero descargamos el firmware:

   https://github.com/jeanthom/dirtyjtag/releases


Descargaremos dirtyjtag.bluepill.bin
 La programación de este firmware en nuestra placa, es trivial, así que solo pondré el comando con openocd para la grabación, usando un STLink V2:

usuario@debian:~ $ openocd -f ../scripts/interface/stlink-v2.cfg -f ../scripts/target/stm32f1x.cfg -c init -c "reset halt" -c "flash write_image erase /home/usuario/Descargas/dirtyjtag/dirtyjtag.bluepill.bin 0x08000000" -c "reset"


Luego de finalizado el proceso de grabación, conectamos la placa por medio de un cable mini USB a nuestra PC, ejecutamos el siguiente comando:

usuario@debian:~ $ lsusb


Item 8: Debian reconoce nuestra placa como InterBiometrics
El pinout de la placa es el siguiente:

PA0 => TDI
PA1 => TDO
PA2 => TCK
PA3 => TMS
PA4 => TRST
PA5 => SRST

Una vez conectada nuestra placa tanto al target como a la PC y reconocida por el OS, lanzamos urjtag como root (el tema de los permisos excede a esta entrada, por eso lanzamos como root).

usuario@debian:~ # jtag

Luego:


jtag> cable dirtyjtag
jtag> bsdl path /home/usuario/bsdl-altera
jtag> detect

Solo falta decirle donde está el BSDL,... como ya se explicó en la anterior entrada.

T'T.

martes, 10 de septiembre de 2019

Raspberry PI 3 JTAG - SVF player - CPLD Altera - Quartus - Parte 1

Introducción.


    Con los pasos descriptos en esta entrada, prepararemos una raspberry pi 3, para que funcione como interfaz jtag. Con ello podremos reproducir archivos SVF, los cuales nos permitirán, entre otros usos, la programación, de CPLD's.

    Todos los pasos detallados fueron realizados desde un Host (mi PC) con distro Debian 9.

Preparación de Raspberry.


     Descargaremos la imagen de Raspbian sin escritorio, ya que no será necesario, desde el siguiente enlace:

https://www.raspberrypi.org/downloads/raspbian/



     A la fecha de esta entrada descargaremos Raspbian Buster Lite.

    Luego descargaremos balenaEtcher para grabar la imagen en una tarjeta SD (Utilicé una de 4GB).

https://www.balena.io/etcher/



    Balena Etcher es muy simple de usar y no necesita mayores explicaciones, que las que el propio programa da.




    Insertamos la SD en nuestra raspberry, y dejamos que realice el proceso de inicialización. (Recordar conectar un monitor, un cable de red y un teclado para el primer arranque).

Nos logueamos con:

    user: pi
    password: raspberry

    Una vez inicada la sesión creamos el archivo "ssh" sin contenido en el directorio "/boot" (sudo nano ssh), luego reiniciamos y ya deberíamos tener acceso remoto por SSH.

Para activar el wi-fi, desde nuestra sesión SSH hacemos:

    pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Nos colocamos al final del archivo e insertamos:

network={
   ssid="My Wifi"
   psk="MyPass"
}

Posteriormente podremos asignar una IP estática (recomendado para este uso) a la conexión Wi-Fi.

Para ello editamos el archivo:

    pi@raspberrypi:~ $ sudo nano /etc/dhcpcd.conf 

y al final del archivo insertamos:

interface wlan0
static ip_address=10.0.0.240/24
static routers=10.0.0.1
static domain_name_servers=10.0.0.1 8.8.8.8 

Por supuesto cada quien asignará las IP acorde a su configuración.

Finalmente, siempre es bueno realizar:

    pi@raspberrypi:~ $ sudo apt update

    pi@raspberrypi:~ $ sudo apt upgrade

UrJtag


Primero instalamos los siguientes paquetes:

    pi@raspberrypi:~ $ sudo apt install git
    pi@raspberrypi:~ $ sudo apt install autoconf
    pi@raspberrypi:~ $ sudo apt install autopoint
    pi@raspberrypi:~ $ sudo apt install libtool
    pi@raspberrypi:~ $ sudo apt install libusb-1.0
    pi@raspberrypi:~ $ sudo apt install libreadline-dev
    pi@raspberrypi:~ $ sudo apt install python-dev

Descargamos con:

    pi@raspberrypi:~ $ git clone git://git.code.sf.net/p/urjtag/git urjtag-git

    pi@raspberrypi:~ $ wget https://ufpr.dl.sourceforge.net/project/urjtag/urjtag/2018.09/urjtag-2018.09.tar.xz

Descomprimimos:

    pi@raspberrypi:~ $ tar -xf urjtag-2018.09.tar.xz

Ingresamos:

    pi@raspberrypi:~ $ cd urjtag-2018.09

Editamos el fichero cmd_bfin.c: 

    pi@raspberrypi:~/urjtag-2018.09 $  nano src/cmd/cmd_bfin.c

Insertamos al inicio del fichero:

    #define _SYS_UCONTEXT_H

Guardamos y salimos.

Luego hacemos:

    pi@raspberrypi:~/urjtag-2018.09 $ ./configure

    pi@raspberrypi:~/urjtag-2018.09 $ make 

    (Esperamos un tiempo, no mucho mas que el que toma preparse un café)

    pi@raspberrypi:~/urjtag-2018.09 $ sudo make install

Finalmente lanzamos con:

    pi@raspberrypi:~ $ sudo jtag




Una vez lanzado el programa, inicializamos los gpio a utilizar:

jtag> cable gpio tdi=13 tdo=19 tck=26 tms=6

Los GPIO corresponden a los siguientes pines de la raspberry

GPIO13 = PIN 33
GPIO19 = PIN 35
GPIO26 = PIN 37
GPIO6 = PIN 31
GND = PIN 39

Conectamos nuestra placa target, la mía es una placa para testeo que fabriqué en torno a una CPLD Altera EPM570, obtenida de equipos dañados.







Hacemos:

jtag> detect

Y en mi caso me devuelve:


Que según el datasheet el valor devuelto es el correcto:


    No obstante para poder grabar la CPLD, urjtag necesita del archivo BSDL correspondiente. Para la CPLD de mi prototipo lo descargué del siguiente enlace:

https://www.intel.com/content/www/us/en/programmable/support/support-resources/download/board-layout-test/bsdl/max2.html



Lo colocamos en alguna carpeta con una ruta simple:

pi@raspberrypi:~/bsd $ 

Nuevamente dentro de jtag:

jtag> cable gpio tdi=13 tdo=19 tck=26 tms=6
jtag> bsdl path /home/pi/bsd
jtag> detect  



Tenemos respuesta.

T'T.