2020/11/08

PYNQ con acelerador y serial

Si venís leyendo como generé el hardware y software para tener que la CPU del zynq-7020 de la PYNQ tuviera una terminal serial primero y luego un acelerador criptográfico de juguete luego y más si leiste la intro, no te sorprenderá que ahora quiera mezclar la cosas.

En este paso lo que haré será dejar el sistema, llamemoslo "legítimo" funcionando. Esto es, desde la PC me comunico por serial con la PYNQ que hace el cifrado y me lo devuelve. Vendría a ser un acelerador criptográfico remoto.

 

Para darle más sabor, en lugar de hacer todo a la vez, voy a agregar primero el puerto serial y luego el acelerador, pero en lugar de ir haciendo proyectos separados, los voy a ir modificando asi vemos como cambiar un proyecto. Es más, en la primera versión ya va hacer el cifrado, pero por software.


Creo el proyecto y lo pongo una uartlite, eso está suficientemente explicado o al menos relatado en las entradas anteriores pero me gusta escribir, la repetición forma parte del aprendizaje.



El serial


  • File -> Project -> New
  • IP INTEGRATOR -> Create Block Design
  • Add IP -> ZYNQ -> Run Block Automation
  • Add IP -> Uartlite -> Run Connection Automation -> S_AXI
  • axi_uartlite_0 -> UART -> expand
  • rx -> botón derecho -> make external (tomar nota del nombre del pin)
  • tx -> botón derecho -> make external (tomar nota del nombre del pin)
  • Sources -> + -> Add or create constraints -> pynq-z2_v1.0.xdc
  • Usar los nombres anotados en el xdc

 
##Arduino Digital I/O 
 
set_property -dict { PACKAGE_PIN T14   IOSTANDARD LVCMOS33 } [get_ports { tx_0 }]; #IO_L5P_T0_34 Sch=ar[0]
set_property -dict { PACKAGE_PIN U12   IOSTANDARD LVCMOS33 } [get_ports { rx_0 }]; #IO_L2N_T0_34 Sch=ar[1]


  • File -> Save Block Design
  • Tools -> Validate
  • Sources -> Design Sources -> remote accelerator -> botón derecho -> Create HDL Wrapper
  • PROGRAM AND DEBUG -> Generate Bitstream
  • File -> Export -> Export Hardware -> include bitstream
  • File -> Launch SDK
  • File -> New -> Application Project
  • Templates -> Empty Application
  • Project Explorer -> remote_accelerator -> src -> new -> file -> main.c

A main.c le pegamos el código de lo hecho en una terminal serial y le agregamos la aceleración por software, o sea, data ^= 3;

 

Aceleración por software
Aceleración por software

 


Si te preguntás de dónde sale XPAR_UARTLITE_0_BASEADDR, es de  

/remote_accelerator_bsp/ps7_cortexa9_0/include/xparameters.h

y debe coincidir con axi_uartlite_0 de system.hdf


Volvés un momento a Vivado

  • PROGRAM AND DEBUG
    • Open Hardware Manager
      • Open Target
      • Auto Connect
    • Program Device

 

Regresás a SDK 

  • Project Explorer -> botón derecho -> Run As -> Launch on Hardware (GDB)

 

Abrís una terminal a un adaptador USB-UART/TTL que esté correctamente conectado a los puertos Arduino de la PYNQ, tipeas "abcd " y te va respondiendo:

 

Aceleración por software
Aceleración por software


Lista una parte, es un buen momento para cerrar todo y versionar.

 

El acelerador

 

Ahora tendría que abrir el diseño del bloque (Open Block Design) para agregar el acelerador, pero es parte de otro proyecto, no se vé desde acá, antes hay que descubrir como traspasarlo.


Settings -> IP -> Repository -> buscar la carpeta "IP Repo"

 

Repositorio de usuario agregado
Repositorio de usuario agregado

Luego arrastrás accelerator_xor al Diagrama, "Run Connection Automation", es casi vergonzoso lo fácil que resulta.



Diagrama completo
Diagrama completo

  • File -> Save Block Design
  • Tools -> Validate Design
  • PROGRAM AND DEBUG -> Generate Bitstream
  • File -> Export Hardware -> include bitstream
  • File -> Launch SDK


Si miramos el system.hdf, veremos ahora dos direcciones para nuestros dispositivos:

 

Los dos dispositivos
Los dos dispositivos


El código final
El código final


La interacción con el acelerador:

 

Interacción con acelerador
Interacción con acelerador



 a  b  c  d     caracter entrada
61 62 63 64     código ascii entrada

05 05 05 05     exor

64 67 66 61
     código ascii salida
 d  g  f  a
     caracter salida


 0  1  2  3
     caracter entrada
30 31 32 33
     código ascii entrada

05 05 05 05     exor

35 34 37 36
     código ascii salida
 5  4  7  6    
caracter salida

 

 Y las cuentas comprobadas:

 

La cuentas
La cuentas

 

 

Notarás que aunque de alguna manera está haciendo cifrado por bloques, como puse 0x05050505 como key es como si hiciera cifrado por caracteres.

No hay comentarios:

Publicar un comentario