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

2020/01/28

Para estudiar The Zynq MPSoC Book

La lectura de este libro ha sido resultado de una serie de afortunados errores.

Tengo algo de interés en PYNQ y en ZYNQ debido a tener un a Parallella, ví el título, no sé qué zynq, pynq, machine learning y no estaba tan caro, lo comencé a leer y mencionó que estaría bueno leer antes The Zynq Book lo estudié y volví a esto. De haber leido primero TZB sin tener ya en papel este no lo hubiese leido pues TZB no me pareció nada maravilloso y segundas partes suelen ser malas.

Ese sí hubiese sido un error, The Zynq MPSoC Book parece haber sido escrito tras asimilar las críticas al primero y aunque tiene bastante de humo marketinero, la proporción es menor y los contenidos no sé muy bien si son muy superiores y más claros o la lectura de TZB me dejó en mejores condiciones.

La parte marketing incluso es útil, aprendés cosas como que un cuadróptero tiene dos hélices girando para un lado y dos para el otro y eso le permite rotar, ja!

La diferencia entre un Zynq y un Zynq MPSoC es enorme:

  • Dos cores de 32 -> cuatro cores de 64 para aplicaciones genéricas (APU).
  • FPGA Artix-7 -> FPGA Kintex-7
    • 35k-106k -> 157k-555k Flip Flops
    • 17k-53k ->  78k-277k LUTs
    • 28k-85k -> 125k-444k Logic Cells
    • 60-140 -> 265-755 36Kb Block RAM
    • 2M-5Mb -> 9M-26Mb Block RAM
    • 80-220 -> 400-2000 DSPs
  • Dos cores RealTime (RPU).
  • Graphics Processing Unit (GPU).
  • Video Codec Unit (VCU).
  • Configuration Security Unit (CSU) (*)
  • Platform Management Unit (PMU)(*) 
Desde RPU para abajo, es terreno de MPSoC.


CSU y PMU tienen cada una tres MicroBlazes en silicio ejecutándose en modo votación.

CSU se encarga del boot seguro de los procesadores.



Las descripciones y explicaciones relacionadas a como se comunican y arrancan todos estos componentes es extremadamente educativa, me ha ayudado a avanzar en la comprensión de cómo funcionan en general las computadoras.

Se explica SDx, aparentemente en los últimos cinco años la cosa ha evolucionado. La idea es que vos escribís tu programa en C/C++ y SDx analiza el código y busca oportunidades de pasar secciones a la FPGA y su interfaz.

Lo que me había quedado de TZB es que este proceso estaba a cargo tuyo.


Con respecto a la GPU y VCU se menciona que existen, pero luego nada, no recuerdo ninguna mención, lo cual es una pena pues son un tercio de la diferencia con Zynq pelado. Igual podríamos decir que como es algo común, no especial como CSU y PMU, a los cuales se los explica muy bien.


Con respecto a ML, no respeta la proporción del título, es muy superficial, se citan ejemplos externos.

A diferencia de TZB no hay una práctica propuesta, pero uno estos días veré de instanciar los ejemplos de PYNQ-Z1 a PYNQ-Z2.




Se baja gratis de https://www.zynq-mpsoc-book.com/


Conclusiones


Vale la pena leerlo y si tenés tiempo antes leer y practicar TZB.

2019/12/29

Para estudiar The Zynq Book


Es un libro muy atado al producto... claro, se llama The Zynq Book, alguien en los comentarios de algún sitio que reclama por ello, pero ¿qué esperabas? Dice "con la colaboración de Xilinx" en la tapa.

Se puede obtener gratis, probablemente en http://www.zynqbook.com/download-book.php.



Tiene el problema de un fuerte sabor a marketing, muchas veces dice lo flexible, óptimo y adaptable que es Zynq. Luego hay un montón de información que es de algún modo genérica. Si tuviera la mitad de lo genérico y el cuádruple de lo de Zynq como para mantener la cantidad de páginas, hubiese sido excelente. La realidad es que a mi no me quedaron claras cosas como si el componente ethernet se puede acceder directamente desde la PL.

Lo bueno es que no explica nada de VHDL/Verilog/C/Assembly, supone que ya sabés.

Lo malo es que hay varios lugares donde se dan explicaciones de conceptos donde hubiese estado bueno un ejemplito en VHDL/Verilog.

Intel tiene algo parecido, con nombres como Arria, Stratix y Cyclone.

En apariencia, este tipo de SoC facilita esta evolución: de programar una CPU y diseñar hardware por separado a diseñar un sistema y con la ayuda de la herramienta implementar algunas partes en hardware y otras en software.

La idea es que lo simple y paralelizable va al hardware, lo complicado se queda en la CPU.


La verdad es que sea usando este tipo de SoC o los componentes separados no hace diferencia desde el punto de vista de la programación, incluso estoy seguro que el libro dice que lo que hagas en C/C++/SystemC sólo se va a ejecutar en un softcore, no es que generás código y la herramienta elige si ponerlo en los cores ARM. O al menos así era en 2014, tengo el "libro siguiente", motivo por el cual leí este pese a la mala crítica, quizás haya cambiado.

Me quedo con la idea de que el objetivo es hacer aceleradores para ser utilizados desde las CPU ARM, pero simplificando el diseño en la PL.


Zynq te permite desarrollar cosas que yo al menos no podría pues no tengo el conocimiento para interconectar una fpga con una cpu. Algo parecido a pasar de un micro + memoria(ram/rom) + uart a un microcontrolador que ya tiene todo adentro y sólo hay que configurar o ni eso.

De todos modos yo no puedo hacer nada con un zynq, necesito una Parallella, PYNQ o equivalente donde todo el hardware ya esté resuelto.

Los "ok" son relativos, para alguien que tiene experiencia de cada tema quizás estén de sobra, pero para mi siempre es un buen repaso.

  • 1 Intro ok
  • 2 Detalles hardware ok
  • 3 Detalles software, aplica a cualquier otro FPGA, ok
  • 4 Criterios de elección, ok
  • 5 Humo, completamente en vano
  • 6 Zedboard, ok para quien la tiene
  • 7 En vano
  • 8 Ejercicio
  • 9 Arquitectura de harware, modo superficial y adaptados a la arquitectura, ok
  • 10 Más detalles hardware, lo anterior aplicado a zynq, ok
  • 11 Más detalles software, aplica a cualquier otro FPGA, ok
  • 12 Ejercicio
  • 13 - 15 HLS, aplicable a cualquier FPGA, ok
  • 16 Ejercicio
  • 17 Ejercicio
  • 18 IP ok
  • 19 AXI ok
  • 20 Ejercicio
  • 21 Sistemas operativos ok
  • 22 - 24 Linux ok


Se complementa con unos tutoriales que están en http://www.zynqbook.com/download-tuts.html

Lo que me he propuesto es adaptar a mis placas PYNQ-Z2 ahora y algún día Parallella la experiencia desarrollada en los ejemplos prácticos.

Ejercicios

 

Te recomiendo que saltées esta parte y vayas directo a las conclusiones, a menos que estés siguiendo los tutoriales y te trabes, quizás algo te ayude.

Tambien si tenés una Zed o Zybo. En caso de otras placas, quizás quizás te sirva mirar por arriba lo que hice.


Estos son los pasos tomados de The_Zynq_Book_Tutorials_Aug_15.pdf, utilizando primero Vivado 2015.4, luego pasé a 2018.2 debido a que no vé la placa PYNQ.

Los dos primeros ejercicios consisten en pegarle unos IPs al Zynq y ejecutar un programa baremetal para prender los leds, luego leer los push buttons generando interrupciones y finalmente incorporar un timer, todo esto con AXI.

El tercero es de optimización, es un tanto avanzado para los básicos como yo, lo entiendo pero me dificultaría aplicarlo, pese a haber transitado el uso de PIPELINE en Forzando Brutalmente MD5.

El cuarto es crear tus propios IP, para usarlos en el quinto.


Todo versionado en github pero mal versionado pues está sin el .gitingore y además moví los ejercicios uno a tres así que no deben andar ni a palos, es más por backup que por proceso de desarrollo.



Exercise 1, First Designs on Zynq


Exercise 1A Creating a First IP Integrator Design


Registro los pasos tipo machete para futura referencia, te conviene seguir el tutorial, va todo igual salvo que hay que elegir la placa PYNQ.



Agregar la PYNQ a Vivado, con ayuda de https://pynq.readthedocs.io/en/v2.5/overlay_design_methodology/board_settings.html

dice que

<Xilinx installation directory>\Vivado\<version>\data\boards

y ahi hay dos carpetas, va en boards_files

Acá está la descripción para Vivado y acá el XDC


  • Create New Project
  • Elegir el board

Exercise 1B Creating a Zynq System in Vivado (2018.2)


  • Create Block Design (IP INTEGRATOR -> ...)
  • Add IP -> ZYNQ7 Processing System (Diagram -> ...)
  • Run Block Automation -> Apply Board Preset
  • Add IP -> GPIO (Diagram -> Add IP -> AXI GPIO)
  • Run Connection Automation -> S_AXI
  • Run Connection Automation - leds_4bits
  • File -> Save Block Design
  • Toos -> Validate Design
  • Windows -> sources
  • botón derecho -> Create HDL Wrapper
  • Generate Bitstream
  • Open Implemented Design
  • File -> Export -> Export Hardware -> include bitstream
  • File -> Launch SDK

Exercise 1C Creating a Software Application in the SDK

en particular en Import se usa lo de

The_Zynq_Book_Tutorial_Sources_Aug_15.zip,

la diferencia entre zybo y zed es el ancho de los leds, como PYNQ es 4 igual que Zybo, usé Zybo


kdiff3  zybo/first_zynq_design/LED_test_tut_1C.c zedboard/first_zynq_design/LED_test_tut_1C.c siempre ayuda para estos casos.

  • File -> New -> Application Project
  • Next -> Empty Application
  • Project Explorer -> el proyecto -> src -> Import -> ....
  • Xilinx Tools -> Program FPGA
  • Project Explorer -> el proyecto -> Run As -> Launch on Hardware

¡Anda!, ¡¡¡no lo puedo creer!!!




Exercise 2, Next Steps in Zynq SoC Design

2A-C Expanding the Basic IP Integrator Design

Podría continuar sobre el ejercicio 1 o empezar de cero, mejor para fijar los conocimientos. Las instrucciones ya están adaptadas a Vivado 2018.2


Es todo igual pero hay que agregar un AXI-GPIO extra y conectarle los botones.

Luego

  • Doble click axi_gpio_0 -> IP Configuration -> enable interrupt
  • Doble click processing_system_7 -> Page Navigator -> Interrupts -> 
    • Check Fabric Interrupts
    • Check Pl-PS Interrupt Ports -> IRQ_F2P[15:0]
  • Block Design -> Diagram -> connect
    • axi_gpio_0/ip2intc_irpt
    • processing_system_7/IRQ_F2P[0:0]
  • File -> Save Block Design
  • Tools -> Validate Block Design
y volvemos al caminito normal

  • Project Manager -> Sources -> right click on design -> Create HDL wrapper
  • Generate bitstream
  • (paciencia)
  • Open Implemented Design
  • File -> Export Hardware -> include bitstream
  • File -> Launch SDK
  • File -> New -> Application Project -> empty application
  • import...
  • Program FPGA
  • Y vuelve a andar, increible


Exercise2D Adding a Further Interrupt Source


Nada nuevo, sólo agregar un axi timer con la novedad de que hay que conectarlo a mano usando el IP concat, al pasar al SDK eliminar el proyecto e importar lo nuevo, interrupt_counter_tut_2D.c. Como me olvidé de versionar y taggear hasta el paso anterior, en mi código quedó con esta última versión.


Exercise 3 Designing With Vivado HLS


Exercise 3A Creating Projects in Vivado HLS

Van los pasos macheteados

  • Copiar sources/hls a tu workspace
  • Create New Project, con Project Location -> lo anterior
  • Add Files (Design Files) -> matrix_mult.cpp, matrix_mult.h
    • Top Function -> matrix_mult
  • Add Files (Testbench Files) -> matrix_mult_test.cpp
  • Solution Configuration
    • Clock Period -> 5
    • Boards -> elegí board
  • Close HLS
  • Open HLS Command Prompt
  • cd hasta tut3A
  • Otra vez kdiff3 al rescate, pues dice que ejecutes run_hls_zed.tcl o run_hls_zybo.tcl. La diferencia es part. De algún modo te enteras que es xc7z020clg400-1, con lo cual creás un run_hls_pynq.tcl 
  • vivado_hls -f run_hls_pynq.tcl
  • vivado_hls -p matrix_multlplier

Exercise 3B Design Optimisation in Vivado HLS

Lo que se hace es probar distintas soluciones de optimización hasta que alguna sea factible por timing.

  • Run C Simulation
  • C Synthesis
  • C/RTL Co-simulation -> VHDL
  • Project -> New Solution
    • Acá hay un problema con Part, no ve los boards, tuve que ponerle vía Part el correcto, xc7z020clg400-1
  • Select matrix_mult.cpp
  • Directives -> punto de inserción -> Insert Directive -> PIPELINE / ARRAY RESHAPE
  • C Synthesis 
    • Va a ir fallando según "punto de inserción" y la directiva que se use
  • Project -> Compare Reports -> Seleccionar los últimos y comparar...

Exercise 3C Interface Synthesis

  • cd tut3C
  • copiar run_hls_pynq.tcl de tut3A
  • vivado_hls -f run_hls_pynq.tcl
  • vivado_hls -p matrix_mult_prj
  • mirar el summary de la interface

Exercise 4 IP Creation

Exercise 4A Creating IP in HDL

  • Create New Project
    • no olvides poner VHDL como lenguaje que yo siempre me olvidé, esta vez sí hace diferencia
  • Tools -> Create and Package New IP
    • Create a new AXI4 peripheral 
    • Create Peripheral -> Edit IP
    •  se abrirá otra instancia
  •  Open led_controller_v1_0_S00_AXI.vhd
    • Agregar los ports de Zybo por el ancho de 4 bits
    • File -> Save
  • Open led_controller_v1_0.vhd
    • algo parecido

  • Package IP - led_controller
    • Customization Parameters
      • Merge changes from Customization Parameters Wizard
    • Ports and Interfaces -> check está ok
    • Review and Package -> edit packaging settings
    • Automatic behaviour, enable all (but Include source project archive in 2018.2)
    • Re-Package IP

  • Volver al proyecto original 
  • IP Integrator -> Create Block Design
    • Diagram -> Add IP -> led_controller
    • LEDs_out -> Right click -> Make external (ahi pone out_0)

Tip salvador para 2018.2, le pone al pin el nombre LEDs_out_0, hay que cambiarlo por LEDs_out
    • Add IP -> zynq7 processing system
    • Run Block Automation
    • Run Connection Automation
    • Tools -> Validate
  • Project Manager -> Sources -> Design Sources -> led_test_system -> Create HLD Wrapper 


  • Add Sources -> Constraints -> Create -> XDC -> pynq-z2_v1.0.xdc
  • Y acá hay que buscar en el XDC que bajamos en algún momento los nombres de los pines correspondientes a los leds:


set_property PACKAGE_PIN R14   [get_ports { LEDs_out[0] }]
set_property IOSTANDARD LVCMOS33  [get_ports { LEDs_out[0] }]

set_property PACKAGE_PIN P14   [get_ports { LEDs_out[1] }]
set_property IOSTANDARD LVCMOS33 [get_ports { LEDs_out[1] }]

set_property PACKAGE_PIN N16   [get_ports { LEDs_out[2] }]
set_property IOSTANDARD LVCMOS33 [get_ports { LEDs_out[2] }]

set_property PACKAGE_PIN M14   [get_ports { LEDs_out[3] }]
set_property IOSTANDARD LVCMOS33 [get_ports { LEDs_out[3] }]


  • Generate Bitstream
  • Open Implemented Design
  • File -> Export -> Export Hardware -> Include Bitstream
  • File -> Launch SDK

  • Luego en el SDK
  • File -> New -> Application Project
  • Empty Application
  • Xilinx Tool -> Repositories -> New
  • ip_repo -> led_controller (lo creado antes)
  • system.mss -> modify this BSP's Settings -> drivers -> led_controller
  • Project Explorer -> src -> import -> file system -> zybo -> led_controller
Aqui falla por undefined referencie to Xil_Out32, se corrige agregando a led_controller_test_tut_4A.c

#include "xil_io.h"

Sigamos
  • Xilinx -> Program FPGA
  • SDK Teminal -> Connect 
    • /dev/ttyUSB1 (o lo que haya)
  • Project Explorer -> Right Click -> Rus As -> Launch on Hardware(GDB)

Listo...

Exercise 4B Creating IP in MathWorks HDL Coder

Este implica usar MatLab, todo bien pero me aleja demasiado de mis propósitos, quizás algún día si me sobra tiempo lo haga. O eso es lo que había pensado hasta que ví que en la última parte hace falta lo generado por esta, así que a bajar el Matlab DEMO por 30 días.



  • Copiá la carpeta hdl_coder_lms a donde te guste
  • Dice que configures HDL Toolpath, no sé por qué con ISE, le puse directo Vivado:


hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', '/Xilinx/Vivado/2018.2/bin/vivado')

No dijo que estuviera mal, pero tampoco todo lo que el tutorial

  • Cambía al directorio de trabajo donde copiaste hdl_coder_lms
  • abrí lms.slx 
  • El mirar adentro es opcional
  • No pude hallar "HDL Code -> HDL workflow Advisor", pero si que yendo a Get Add-ons, buscar "hdl code", get trial  y un sales representative te contactará. 
Nuevamente se abre un nuevo mundo enorme y muy interesante de exploración que me alejan de mi propósito que es lograr un cierto dominio sobre Zynq y Vivado, lo siento Matlab, hasta aquí llegué.




Exercise 4C Creating IP in Vivado HLS

 

Este ejercicio al igual que el 3 me queda un poco grande
  • Abrir Vivado HLS
  • Create New Project
    • Add Files -> nco.cpp
    • Top Function ->nco
    • Add Test Files -> nco_tb.cpp
    • Part Selection -> usar part ya que no hay board
  • Ver *.cpp
  • Cambiar outfile a algo que te sirva
  • Run simulation
    • mirá el output
  • Seleccioná nco.cpp
  • Directive
    • Insertar todas las mencionadas
  • Run C Synthesis
  • Export RTL
Y en teoría esto sirve para el próximo

Exercise 5 Adventures with IP Integrator

Estos ejercicios integran lo anterior y dependen de generar un IP con Matlab que tal como relato arriba no pude lograr por motivos no técnicos.

Conclusiones


Pese a el problemita con Matlab, los ejercicios salvan al libro, si no sabés nada, tendrías que leer el libro, si sabés algo salteando los capítulos no ok y si sabés bastante quizás los ejercicios no te alcancen.

Los ejercicios en realidad son guías, si usas las versiones correctas y las placas consideradas sólo practicás recetas, quizás te cierre algún aprendizaje de la lectura del libro.



2019/04/11

Python Productivity for Zynq tutorial@SPL2019

SPL2019 es una conferencia de lógica programable, de la cual me enteré en la lista de embebidos.

Me hubiese gustado asistir pero tiene poco y nada que ver con mi trabajo, así que no tengo punto de negociación para ausentarme tantos días.

Además tengo una alta ignoracia en el tema y aunque seguro que iba a aprender mucho si asistía, al no ponerlo rápidamente en práctica pronto se me iba a disipar.

Pero, habían varios workshops, uno de los cuales aposté estuviera al alcance de mis limitadas facultades.

  • WS1 (Xilinx, English):
    FPGA-based Accelerated Cloud Computing with AWS EC2 F1 and SDAccel 
  • WS2 (Xilinx, English):
    PYNQ: Python Productivity for Zynq
  • WS3 (UAM, Spanish):
    FPGA SoC design from a higher level of abstraction: SDSoC and HLS 
  • WS4 (Satellogic, Spanish):
    Testbenchs in Python: COCOTB

Lo dictó un señor, Parimal Patel que la tiene muy clara y explica muy bien, además de participar del proyecto activamente.

La placa utilizada para las prácticas fue la PYNQ-Z2 que obviamente, es rosa.


Se parece a la Parallella de la que tanto vengo hablando en que tiene un Zynq 70x0, pero un poquito más power, un 7020 en lugar de un 7010. Además no tiene el chip característico de la Parallella, que son los 16 cores del chip Epiphany. Extra tiene... mejor pongo una tabla comparativa:


 

PYNQ-Z2 Parallella
 Características     

Zynq 7020 7010
RAM [MB] 512 1024
Flash [MB] 16 (*)
SDCard si si
Ethernet 1Gb si si
USB 2.0 host si si
Audio si hdmi?
HDMI out si si
HDMI in si no
Epiphany no si
Power [v] 7-12 5 (**)
Raspberry Pi si

Arduino shield si
Porcupine (***)
si
PMOD 2 1 (***)
JTAG ? si (***)
Raspberry Pi Camera
si
Switches, botones y leds 2+4+4
Status proyecto Vivo Muerto


(*) No me queda claro por la documentación, tiene entre 32 y 128 Mb dice, pero no sé si se adhieren a que Mb es Mbit.
(**) La Parallella es excepcionalmente fastidiosa con la alimentación.
(***) Lo que tiene la Parallella es el Porcupine, que provee además de un PMOD, un JTAG y la interfaz para la cámara de la Raspberry Pi, "240 backside pins and a peak bandwidth of 50 Gbps". Entiendo que las interfaces de la PYNQ son todas lentas, o sea si quisiera sacar video en tiempo real o sería por ethernet o USB.



Volviendo a la PYNQ-Z2, como se puede ver, tiene los conectores de Arduino y Raspberry, lo que sumando a los PMOD+Grove o Arduino+Grove, permite adosarle una cantidad infernal de accesorios con gran sencillez.

Tambien es la más barata (u$s120) de las otras placas soportadas oficialmente por PYNQ. Nos chismorreó Patel que en unos tres meses (agosto 2019) sale una ZCU no tan cara como la ZCU104 u$s800 (y ni te digo la ZCU111 u$s8000), pero no sé si más que esta.



¿Y cómo funciona esto?




Yo entiendo que entendí, pero por la dudas no voy a entrar en mucho detalles por si me he confundido no esparcir errores. Intentaré ser breve y preciso y para la información posta RTFM. Si alguien que sabe encuentra algún error, me avisa por favor.

Tenemos los overlays, que proveen en la PL una serie de componentes comunes. Por ejemplo el overlay "base.bit" tiene los conectores para PMOD, Arduino Shield, Raspberry Pi y video HDMI.

Lo que tienen en común es que usan IOP (Input Output Processors), en este caso son MicroBlazes para parametrizar en tiempo de pre-ejecución que hay en los pines en lugar de que estén hardcodeado en el bitstream. Luego, durante la ejecución lo implementan.

Los IOPs son "soft processors", se implementan en la PL si hacen falta, en contraste con los cores ARM que están al costadito y que siempre están.



Dicho de otra manera, entre los buses SPI, UART o GPIO y el componente externo en sí, en lugar de ya estar configurado, tiene una capa que se adapta programáticamente. Entiendo que esto sólo debe funcionar con interfaces de baja velocidad, pues el IOP no deja de ser una CPU y siempre va a ser más lenta que un circuito combinacional y unos pocos flip-flops.

El modo de trabajar es en cierto modo como usar un Arduino con Firmata, usado por Processing o algo parecido, Scratch. El micro Arduino en un caso, el MicroBlaze en este, no hace procesamiento, sólo el pasaje de señales de los pines físicos al procesador "real", en el caso de Firmata la PC donde tenés Processing, en este los cores de la Zynq 7020.

Concretamente, si leo un termómetro en PMODA y quiero mostrar en un OLED en PMODB, el valor pasa por el core ARM, mientras que con VHDL se podría pasar directamente, pero perdiendo la flexibilidad y implicando mayor conocimiento por parte de quien implemente.

Está claro que esto está orientado a la gente que sabe programar y tiene una idea no muy profunda de hardware, que el lo que dice el proyecto, ningún engaño.

Un ejercicio que hicimos con Facundo, que fué el que dictó en SASE 2017 el workshop de EDU-CIAA-NXP multicore y me tocó de compañerito es este:


from pynq.overlays.base import BaseOverlay
from pynq.lib.pmod import Pmod_OLED
from pynq.lib.pmod import Grove
from pynq.lib.pmod import PMOD_GROVE_G4

from time import sleep

base = BaseOverlay(“base.bit”)

oled = Pmod_OLED(base.PMODA)
oled.clear()

temp = Grove_TMP(base.PMODB, PMOD_GROVE_G4)

while 1:
    temperature = temp.read()
    oled.write(temperature)
    sleep(1)






Ojo, puede ser que en el dibujito estén invertidos PMODA y PMODB y sin duda en oled.write() había algo más, probablemente un format() cerquita de temperature.

Por otro lado, en contraposición y recuperando la independiencia del FPGA, está otro overlay, "logictools.bit" que implementa varios "generadores". El procesamiento está en la FPGA, pero el core ARM le dice que va a hacer mediante una magia que no me atrevo a describir y que entiendo modifica las LUTs sueltas, no reenviando el bitstream completo. En cierto modo es como si vía Firmata se le enviara un programa a un módulo wifi ESP8266 para que lo ejecute independientemente.






No lo practicamos, así que cuento así nomas los generadores:

Boolean generator


es para armar circuitos combinacionales. Se le provee una o más funciones lógicas tipo

LD2 = PB3 ^ PB0

y mágicamente LD2 será una salida función de las entradas PB0 y PB3

Pattern generator


es para armar patrones, se le provee con un json parecido a esto:

up_counter = {
  ‘signal’ : [
    [‘stimulus’,
        {‘name’: ‘bit0’, ‘pin’:’D0’, ‘wave’: ‘lh’ * 8 },
        {‘name’: ‘bit1’, ‘pin’:’D1’, ‘wave’: ‘l.h.’ * 4 },
        {‘name’: ‘bit2’, ‘pin’:’D2’, ‘wave’: ‘l...h...’ * 2},
        etc
    ]
  ]
}


FSM generator


Se determinan unas entradas, unas salidas y la tabla de transiciones y... ocurre.

Trace analyzer


Se utiliza para capturar las entradas y salidas. En los ejemplos vistos se usa para ver lo que hacen los generadores.


En el caso de PYNQ hay una capa extra, que es Jupyter que permite que la interfaz sea web, usando un concepto llamado "notebooks", cuando sepa más, si lo llega a ocurrir, contaré.



Seguro que se debe poder usar desde una terminal pero no lo puedo afirmar hasta que le eche mano otra vez a una placa y haga las pruebas pertinentes o lo lea accidentalmente en la sección "Running from the command line".



La idea es que uno hace o consigue un overlay, implementa o consigue los c-drivers, implementa o consigue los wrappers, arma un cuaderno y tiene así un proyecto.

Si uno no agrega nada nuevo, usando uno de los overlays base.bit o logictools.bit puede hacer un montón de cosas sin bajarse de IPython.

 

¿Por qué me interesa?



Esta placa me interesa particularmente por el HDMI in, pues se puede tomar la salida de la computadora, pasarla por la placa, hacerle algún proceso y volcarla en la pantalla, para aprender a hacer cosas como:
  • Prender leds de colores detrás del monitor dependiendo de la imagen que haya, se lo llama ....
  • Agregar cosas a la imagen, como pueden ser letras.
  • Botón de pausa, pero perdiendo los frames mientras dure ésta.
  • Sacar fotos a la imagen.
  • Grabar el video.


Tambien, a mi backlog de proyectos inalcanzables le agrego el port de PYNQ a la Parallella, que sorprendentemente se llamará... ¡ParaPYNQ! y sin ninguna sorpresa me llevará mucho tiempo iniciar, si es que lo hago. Patel está al tanto de mi propósito y me ha ofrecido apoyo, así que... tengo que hacerlo.

Dos sitios con mucha info y código:

http://www.pynq.io/

https://github.com/xilinx/pynq