Hello World sur la Zybo.

Permet de tester le printf() sur l'UART.
Pour le visualiser, il faut démarrer sur la carte SD et se connecter avec la
commande:
$ pyserial-miniterm /dev/ttyUSB1 115200


Permet de synthétiser le schéma représenté sur le document hw/design_0.pdf:

1) Software + GPIO:
- La LED_0 est allumée.
- Un appui sur le bouton BTN_0 est vu par le Zynq sur le GPIO configuré en
  entrée: EMIO[1].
- Dans le main(), dans une boucle infinie, la valeur lue sur le GPIO EMIO[1] est
  inversée puis appliquée sur GPIO configuré en sortie: EMIO[0].
- EMIO[0] est connecté à la LED_0 qui s'éteint.

2) Hardware:
- La LED_1 est éteinte.
- Un appui sur le bouton BTN_1 est connecté à une flip-flop et recopié sur la
  LED_1 à chaque front montant de l'horloge.
- L'horloge est fournie par le Zynq.


3 modes de fonctionnement:

1) Via une carte SD:
  - faire "make sdcard" et copier le fichier sdcard/boot.bin sur la carte SD
  - placer le jumper sur la board pour sélectionner le démarrage sur la carte SD
  - démarrer la board
  - se connecter à l'UART avec "pyserial-miniterm /dev/ttyUSB1 115200"
  - reset de la board pour voir le printf("Hello World").

2) Via openOCD:
  (note: printf() ne fonctionne pas car openOCD utilise la liaison série pour
   communiquer avec la board)
  - placer le jumper sur la board pour sélectionner le démarrage sur le JTAG
  - démarrer la board
  - faire "make openocd"
  - lancer gdb dans un autre terminal avec la commande:
    $ gdb-multiarch -ex "set architecture armv7" \
                    -ex "target extended-remote localhost:3333" \
                    --command="gdbinit.gdb"
  - dans gdb, faire "continue" pour sortir du breakpoint au niveau du main()

3) Via QEMU (logiciel seulement):
  (note: printf() ne fonctionne pas car le FSBL s'arrête avant d'avoir configuré
   l'UART ; il est possible de re-configurer les registres a-posteriori)
  - faire "make qemu"
  - lancer gdb dans un autre terminal avec la commande:
    $ gdb-multiarch -ex "target remote localhost:1234" --command="gdbinit.gdb"
  - dans gdb, attendre le timeout du FSBL qui n'arrive pas à démarrer les
    périphériques.


Testé avec:
- Vivado v2019.2 (64-bit)
- arm-none-eabi-gcc (15:8-2019-q3-1+b1) 8.3.1 20190703 (release)
- GNU ld (2.35.2-2+14+b2) 2.35.2
- Xilinx Bootgen v2019.2
- QEMU emulator version 5.2.0
- Open On-Chip Debugger 0.11.0-rc2
- GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
- python3-serial 3.5~b0-1


TODO:
- Faire fonctionner l'UART à la fois via la carte SD et via QEMU.