Cet article est l'article du 12ème jour du ** Kochi Institute of Technology Advent Calendar 2015 **.
Je voulais vraiment écrire sur ROS, mais je ne suis pas motivé, alors je vais écrire ce que je fais maintenant.
Accédez au pont HPS-FPGA léger de Cyclone V avec Python pour lire et écrire. En conclusion, je pense qu'il peut être utilisé comme environnement de test.
La carte que j'utilise est le [** DE1-SoC **] de Terasic (http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=836). BSP utilise le bureau officiel * Linux Ubuntu *. La version Python est * 2.7.3 *
Le SoC FPGA d'Altera dispose d'un bus pratique appelé * Lightweight HPS-to-FPGA Bridge *, alors utilisez-le.
Le contenu mappé est écrit dans Carte mémoire Cyclone V HPS, tel que GPIO et UART. Il semble que vous puissiez également accéder aux registres des périphériques. Certaines ips auto-créées sont mappées entre ** 0xFF200000 ** et ** 0xFF3FFFFF **. (0x0 ~ 0x1FFFFF du côté Qsys)
Cette fois, je vais expliquer en supposant que ip est connecté de 0xFF200000 à 0xFF200010.
Pour l'instant, importez les modules requis et ouvrez / dev / mem.
import os
import mmap
fd = os.open("/dev/mem",os.O_RDWR | os.O_SYNC)
#Zone à utiliser(Byte)
reg_span = 0x200000
# Lightweight HPS-to-Décalage du pont FPGA
reg_base = 0xff200000
lw_h2f = mmap.mmap(fd ,reg_span ,mmap.MAP_SHARED,mmap.PROT_READ | mmap.PROT_WRITE,offset = reg_base)
Vous pouvez maintenant mmap le * Lightweight HPS-to-FPGA Bridge *. Après cela, accédez à l'adresse que vous souhaitez lire et écrire et lire et écrire.
lw_h2f.seek(0x0,os.SEEK_SET)
read_data1 = ord(lw_h2f.read_byte())
read_data2 = ord(lw_h2f.read_byte())
read_byte () est incrémenté arbitrairement. L'intervalle d'incrémentation était de 1 octet dans cet environnement. mmap.read_byte est lu comme une chaîne de caractères de longueur 1, donc si vous voulez le traiter comme une valeur numérique, vous devez le convertir avec ** ord () **.
lw_h2f.seek(0x0,os.SEEK_SET)
write_byte(chr(write_data1))
write_byte(chr(write_data2))
Ceci est également incrémenté sans autorisation. L'intervalle était de 1 octet. Comme pour la lecture, lors de l'écriture, elle doit être écrite sous la forme d'une chaîne de longueur 1, elle doit donc être convertie avec ** chr () **.
Je n'avais pas beaucoup écrit sur Python, mais ce n'était pas difficile. Je pensais que ce serait une fourmi comme environnement de test FPGA. Cependant, comme la vitesse effective est fatalement lente, elle n'est pas adaptée pour partager une DRAM et échanger une grande quantité de données (images, etc.). Il semble que la bonne réponse soit de traiter le périphérique comme un registre.
Recommended Posts