{"id":166,"date":"2019-01-25T18:22:34","date_gmt":"2019-01-25T18:22:34","guid":{"rendered":"http:\/\/jagumiel.xyz\/blog\/?p=166"},"modified":"2025-03-05T20:09:35","modified_gmt":"2025-03-05T20:09:35","slug":"soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga","status":"publish","type":"post","link":"https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/","title":{"rendered":"SoC-FPGA: CPU y FPGA integrados en un solo chip"},"content":{"rendered":"<h2>Introducci\u00f3n a la arquitectura SoC-FPGA<\/h2>\n<p>Hoy en d\u00eda las FPGAs no vienen solas, si no que en ocasiones van acompa\u00f1adas de procesadores o microcontroladores, creando en su conjunto un SoC (System on a Chip). En el caso de la Cyclone V de Altera-Intel, la FPGA viene acompa\u00f1ada de un procesador ARM Cortex-A9, al que nos referiremos por HPS (Hard-Processor System), a esto lo llamamos SoC-FPGA.<\/p>\n<p>Esto quiz\u00e1s sea harina de otro costal, pero Altera tambi\u00e9n da la posibilidad de instanciar a Nios II, que es un softcore, es decir, es un procesador que se genera a trav\u00e9s de las puertas l\u00f3gicas dentro de la propia FPGA.<\/p>\n<h3>Beneficios de la arquitectura SoC-FPGA<\/h3>\n<p>En el caso concreto que se est\u00e1 analizando, lo que trae consigo el SoC-FPGA es la integraci\u00f3n de dos paradigmas dentro de un mismo chip, con el consecuente ahorro de energ\u00eda y de tama\u00f1o. En la placa de desarrollo tenemos la FPGA con una CPU y un conjunto de perif\u00e9ricos conectados. Algunos de esos dispositivos estar\u00e1n conectados a la FPGA, otros ir\u00e1n conectados a la CPU, y tenemos total libertad para decidir qu\u00e9 queremos hacer y c\u00f3mo.<\/p>\n<div id=\"attachment_167\" style=\"width: 710px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-167\" class=\"wp-image-167 size-full\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram.jpg\" alt=\"Diagrama de bloques de la arquitectura SoC-FPGA en la familia Cyclone V.\" width=\"700\" height=\"590\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram.jpg 700w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram-300x253.jpg 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram-150x126.jpg 150w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><p id=\"caption-attachment-167\" class=\"wp-caption-text\">Imagen 1. Arquitectura SoC Cyclone V.<\/p><\/div>\n<p>En funci\u00f3n de la finalidad vendr\u00e1 mejor usar una arquitectura u otra. As\u00ed pues, se puede usar \u00fanicamente la FPGA, o \u00fanicamente el ARM con una distribuci\u00f3n de Linux o una aplicaci\u00f3n \u201cBare-Metal\u201d, o llev\u00e1ndolo al siguiente nivel, podemos mezclar ambos mundos y quedarnos con lo mejor de cada parte. La pregunta ahora es, \u00bfc\u00f3mo hacerlo?<br \/>\nBueno, hemos dicho que hay perif\u00e9ricos que son propios de la FPGA o del ARM, pero para hacer una intercomunicaci\u00f3n existen puentes. En este ejemplo b\u00e1sico vamos a desarrollar un sistema que permita ejecutar una aplicaci\u00f3n desde Linux y acceder a recursos asociados a la FPGA.<\/p>\n<h2>Materiales necesarios<\/h2>\n<p><strong>Hardware:<\/strong><\/p>\n<ul>\n<li>Placa de desarrollo: Terasic DE1-SoC<\/li>\n<li>Tarjeta micro-SD<\/li>\n<li>Cable mini-USB<\/li>\n<li>Cable de red: RJ45<\/li>\n<\/ul>\n<p><strong>Software:<\/strong><\/p>\n<ul>\n<li>Quartus Prime 18.1<\/li>\n<li>Intel SoC FPGA Embedded Development Suite (Incluye Quartus si no est\u00e1 instalado)<\/li>\n<li>Win32DiskImager<\/li>\n<li>Putty<\/li>\n<\/ul>\n<h2>Desarrollo<\/h2>\n<p>Lo ideal es hacerse con todos los materiales e instalar el software necesario de antemano. Entre las descargas y las instalaciones puede llevar un buen rato. Todo el software usado es gratuito, pero su c\u00f3digo no es libre.<\/p>\n<h3>Preparar la micro-SD con la imagen<\/h3>\n<p>Por lo que he estado leyendo antes de leer el proyecto, no todas las im\u00e1genes compatibles con la placa de desarrollo son v\u00e1lidas para la finalidad de este proyecto. De hecho, he tenido que usar otra distinta a la que ten\u00eda con anterioridad. Desde la web de Terasic, accediendo al apartado de recursos disponibles para nuestra placa de desarrollo, se pueden encontrar diferentes versiones de Linux. Se recomienda usar la versi\u00f3n \u201cConsole Only\u201d, es decir, sin escritorio, ya que es posible que en las otras no funcione.<br \/>\n<a href=\"http:\/\/download.terasic.com\/downloads\/cd-rom\/de1-soc\/linux_BSP\/DE1_SoC_SD.zip\">Descarga de la imagen de Angstrom Linux para Terasic DE1-SoC<\/a><br \/>\nUna vez descargada la imagen la descomprimimos, ya que viene en un fichero zip. Insertamos la tarjeta micro-SD en nuestro PC y abrimos Win32DiskImager. Tan s\u00f3lo hay que seleccionar la ruta de la imagen y la unidad de la tarjeta, es decir, el origen y el destino, y le damos a escribir. En menos de 5 minutos tendremos nuestra tarjeta lista para funcionar en la placa.<br \/>\nPara pasos posteriores, se va a realizar una comunicaci\u00f3n entre el PC (Host) y la placa, as\u00ed que la vamos a dejar ya configurada. Lo que hacemos es insertar la tarjeta micro-SD en su ranura y conectar un cable mini-USB a la UART de la placa y al puerto USB del PC. Lo que queremos es establecer una comunicaci\u00f3n serie para acceder a la consola de comandos de Linux.<\/p>\n<h3>Levantar la red<\/h3>\n<p>Nos har\u00e1 falta un programa como Putty, Hyperterminal o similar. Tenemos que mirar en el administrador de dispositivos qu\u00e9 puerto de comunicaciones est\u00e1 usando. En este caso es el COM5, pero en otro PC, podr\u00eda estar usando otro diferente. En Putty hay que conectarse a este puerto de comunicaci\u00f3n serie a una velocidad de 115200 baudios. Nada m\u00e1s conectarnos, aparecer\u00e1 una terminal de Linux donde podremos iniciar sesi\u00f3n. Por defecto el usuario es root y no tiene contrase\u00f1a.<\/p>\n<div id=\"attachment_168\" style=\"width: 761px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-168\" class=\"size-full wp-image-168\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie.png\" alt=\"\" width=\"751\" height=\"437\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie.png 751w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie-300x175.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie-150x87.png 150w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" \/><\/a><p id=\"caption-attachment-168\" class=\"wp-caption-text\">Imagen 2. Ubicando el puerto COM y configur\u00e1ndolo en PuTTY.<\/p><\/div>\n<p>Conectamos la placa de desarrollo a un PC usando un cable de red. En el PC tenemos que tener libre un puerto RJ45. Le asignamos una direcci\u00f3n IP del mismo rango que la tarjeta de red del PC. Para eso se usa el siguiente comando: ifconfig [Interfaz] [IP]. En mi caso particular lo introduje de esta forma:<br \/>\n<code>ifconfig eth0 192.168.10.33<\/code><br \/>\nYa podemos acceder a la consola a trav\u00e9s de SSH o Telnet. Para realizar la conexi\u00f3n, tambi\u00e9n se podr\u00eda conectar a un switch o router en caso de no disponer de un puerto en el PC.<\/p>\n<h3>Construir el sistema SoC-FPGA<\/h3>\n<p>En el CD de Terasic, que tambi\u00e9n podemos obtener su contenido a trav\u00e9s de la web, hay una herramienta que se llama System Builder. Es una forma muy sencilla de seleccionar los componentes de la placa de desarrollo que se quieren utilizar y que cree de forma r\u00e1pida una plantilla para empezar a trabajar. La aplicaci\u00f3n nos crea un proyecto de Quartus con algunas l\u00edneas de c\u00f3digo ya escritas, pero la aplicaci\u00f3n no sabe el dise\u00f1o que vamos a hacer, as\u00ed que hay l\u00edneas que nos sobrar\u00e1n y tendremos que eliminar.<\/p>\n<div id=\"attachment_169\" style=\"width: 811px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-169\" class=\"size-full wp-image-169\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder.png\" alt=\"\" width=\"801\" height=\"546\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder.png 801w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-300x204.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-768x524.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-150x102.png 150w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/a><p id=\"caption-attachment-169\" class=\"wp-caption-text\">Imagen 3. Configurando el sistema en el System Builder.<\/p><\/div>\n<p>Para continuar con el dise\u00f1o del sistema pasamos a la utilidad de Quartus \u201cPlatform Designer\u201d, anteriormente conocido como \u201cQsys\u201d. En este caso queremos tener un clock, con un HPS y acceso a PIO, que se usar\u00e1 esa direcci\u00f3n para los leds.<\/p>\n<div id=\"attachment_170\" style=\"width: 839px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-170\" class=\"size-full wp-image-170\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system.png\" alt=\"\" width=\"829\" height=\"316\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system.png 829w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-300x114.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-768x293.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-150x57.png 150w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/a><p id=\"caption-attachment-170\" class=\"wp-caption-text\">Imagen 4. Dise\u00f1ando la arquitectura del sistema en Platform Designer (anteriormente Qys).<\/p><\/div>\n<h3>Configurar el HPS del sistema SoC-FPGA<\/h3>\n<p>La parte complicada viene a la hora de configurar el HPS. En principio nos podemos guiar por el GHRD (Golden Hardware Reference Design) que aporta el fabricante, pero a la hora de establecer los par\u00e1metros de las memorias y sus tiempos, la cosa es m\u00e1s compleja.<br \/>\nUna vez que tengamos el dise\u00f1o en el Platform Designer, se puede guardar y exportar el c\u00f3digo. Como la generaci\u00f3n en el System Builder la ha hecho en Verilog, seguiremos usando ese lenguaje. Adem\u00e1s, tambi\u00e9n podemos obtener una plantilla, s\u00f3lo hay que darle a Generate-&gt; Show Instantiation Template. De este modo no tendremos que escribir todo el c\u00f3digo a mano. Al igual que antes, habr\u00e1 l\u00edneas que no nos sean necesarias y las podamos borrar.<\/p>\n<div id=\"attachment_171\" style=\"width: 598px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-171\" class=\"size-full wp-image-171\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla.png\" alt=\"\" width=\"588\" height=\"493\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla.png 588w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla-300x252.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla-150x126.png 150w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/a><p id=\"caption-attachment-171\" class=\"wp-caption-text\">Imagen 5. Plantilla de c\u00f3digo para la instanciaci\u00f3n. Est\u00e1 incompleta, pero ahorra tiempo.<\/p><\/div>\n<p>Por ahorrar tiempo, tanto el c\u00f3digo como el fichero de del Platform Designer (.qsys) estar\u00e1 disponible para la descarga a trav\u00e9s de GitHub. De modo que, si alguien quiere hacer el proyecto, est\u00e1n todas las configuraciones hechas y s\u00f3lo tendr\u00e1 que cambiar el dispositivo para el cual se programa.<br \/>\nAhora lo que hay que hacer es \u201cconectar los cables\u201d. Si nos fijamos en la imagen de arriba, en la plantilla de c\u00f3digo, pone algo as\u00ed como \u201c(&lt;connected-to-\u2026&gt;)\u201d. Pues tenemos que cambiarlo, ah\u00ed estamos instanciando al sistema que hemos creado, y tenemos que unirle los cables que hemos definido en el m\u00f3dulo. Quedar\u00eda algo del siguiente estilo, los nombres que aparecen arriba en m\u00f3dulo, los sustituimos abajo en la instanciaci\u00f3n.<\/p>\n<div id=\"attachment_172\" style=\"width: 877px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-172\" class=\"size-full wp-image-172\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo.png\" alt=\"\" width=\"867\" height=\"419\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo.png 867w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-300x145.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-768x371.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-150x72.png 150w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><\/a><p id=\"caption-attachment-172\" class=\"wp-caption-text\">Imagen 6. Parte del c\u00f3digo. Us\u00e9 la plantilla y la edit\u00e9.<\/p><\/div>\n<h3>Compilaci\u00f3n<\/h3>\n<p>En primer lugar, hemos hecho cambios, as\u00ed que vamos a comprobar solamente la sintaxis. Para ello le damos a \u201cStart analysis and elaboration\u201d. Si hay errores los corregimos, y en caso de que todo est\u00e9 correcto, es hora de lanzar un par de scripts.<br \/>\nLos scripts nos van a ahorrar tiempo, ya que en vez de tener que introducir las direcciones de los pines a mano, lo va a hacer Quartus por nosotros. Hay que ejecutar los dos que aparecen en la imagen. \u00a1Ojo, que s\u00f3lo a\u00f1ade los pines correspondientes al HPS!<\/p>\n<div id=\"attachment_173\" style=\"width: 590px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-173\" class=\"size-full wp-image-173\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts.png\" alt=\"\" width=\"580\" height=\"477\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts.png 580w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts-300x247.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts-150x123.png 150w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><p id=\"caption-attachment-173\" class=\"wp-caption-text\">Imagen 7. Scripts Tcl que hay que ejecutar.<\/p><\/div>\n<p>Antes de compilar vamos a cambiar el comportamiento por defecto de los pines. Los ponemos como entrada tri-estado.<\/p>\n<div id=\"attachment_174\" style=\"width: 1657px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-174\" class=\"size-full wp-image-174\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin.png\" alt=\"\" width=\"1647\" height=\"743\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin.png 1647w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-300x135.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-768x346.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-1024x462.png 1024w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-150x68.png 150w\" sizes=\"auto, (max-width: 1647px) 100vw, 1647px\" \/><\/a><p id=\"caption-attachment-174\" class=\"wp-caption-text\">Imagen 8. Pasos a dar para cambiar el estado de los pines no usados.<\/p><\/div>\n<p>Ahora ya podemos compilar todo el proyecto, pero tambi\u00e9n podemos limpiar todos los pines que no se usen del \u201cPin Planner\u201d. Hay que mirar si la asignaci\u00f3n est\u00e1 bien hecha, y si no introducirla a mano. Tras la compilaci\u00f3n se generar\u00e1 un fichero con extensi\u00f3n .sof.<\/p>\n<h3>Generando los ficheros para Linuxol<\/h3>\n<p>Vamos a compilar el fichero sopcinfo. Este fichero contiene toda la informaci\u00f3n sobre los componentes que forman el sistema que hemos creado con el Platform Designer. El objetivo ahora es traducir este archivo en una cabecera, es decir, un fichero con extensi\u00f3n .h.<br \/>\nHay que escribir el script \u201cgenerate.sh\u201d. Podemos encontrar un ejemplo en el CD de Terasic que hemos mencionado con anterioridad, pero habr\u00e1 que abrirlo y editarlo para cambiar el nombre del archivo .sopcinfo del que queramos obtener sus cabeceras.<br \/>\nPara ello abrimos el Intel FPGA Embedded Command Shell. B\u00e1sicamente es un int\u00e9rprete de comandos basado en Linux.<\/p>\n<div id=\"attachment_175\" style=\"width: 668px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-175\" class=\"size-full wp-image-175\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers.png\" alt=\"\" width=\"658\" height=\"202\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers.png 658w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers-300x92.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers-150x46.png 150w\" sizes=\"auto, (max-width: 658px) 100vw, 658px\" \/><\/a><p id=\"caption-attachment-175\" class=\"wp-caption-text\">Imagen 9. Llamada a las variables de entorno y generaci\u00f3n de cabeceras.<\/p><\/div>\n<h3>Resoluci\u00f3n de problemas con los paths<\/h3>\n<p>Aqu\u00ed se observa un error bastante habitual. Yo no ten\u00eda las variables de entorno para la compilaci\u00f3n guardadas en Windows, y no ten\u00eda privilegios en el PC en el que me encontraba para modificarlas. Una alternativa es mediante el comando de \u201cexport PATH\u201d que se ve en la imagen. En definitiva, que hay dos alternativas, o a\u00f1adimos la ruta \u201cC:\\intelFPGA_lite\\18.1\\quartus\\sopc_builder\\bin\\\u201d (o donde tengamos instalado el EDS) a las variables de entorno de Windows, o le decimos en la consola d\u00f3nde se encuentran las herramientas para compilar.<br \/>\nTras ejecutar el script tenemos como salida las cabeceras necesarias.<\/p>\n<h3>Escribiendo el c\u00f3digo del programa. Hello LED!<\/h3>\n<p>A continuaci\u00f3n, escribimos el programa en C. Va a ser una luz que va a ir saltando de led en led consecutivamente cada 250ms. Es decir, vamos a observar como una luz se va desplazando hacia la izquierda. El c\u00f3digo tambi\u00e9n estar\u00e1 disponible para su descarga.<br \/>\nUna vez hecho esto, hay que generar un fichero de tipo Makefile. La plantilla tambi\u00e9n la podemos encontrar en el CD o en la web. En versiones anteriores era m\u00e1s sencilla, ahora han cambiado y hay que decirle la plataforma para la que se est\u00e1 trabajando. En nuestro caso, Cyclone V.<\/p>\n<div id=\"attachment_176\" style=\"width: 991px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-176\" class=\"size-full wp-image-176\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C.png\" alt=\"\" width=\"981\" height=\"500\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C.png 981w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-300x153.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-768x391.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-150x76.png 150w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/a><p id=\"caption-attachment-176\" class=\"wp-caption-text\">Imagen 10. Compilaci\u00f3n en C y env\u00edo a la placa a trav\u00e9s de SSH desde consola.<\/p><\/div>\n<p>El programa ha compilado y tiene el nombre de \u201cled\u201d, as\u00ed que lo que hacemos es enviarlo a la tarjeta a trav\u00e9s de SSH. Recordemos que anteriormente hemos configurado la tarjeta para que est\u00e9 conectada en red.<\/p>\n<h3>Configurando el arranque<\/h3>\n<p>Tras la compilaci\u00f3n en Quartus, hemos dicho que se obtiene un fichero .sof. Este contiene la informaci\u00f3n necesaria para programar e inicializar la FPGA desde Quartus. En nuestro caso queremos inicializar la FPGA desde el arranque, es decir, desde un estado de apagado. Para eso necesitamos convertir el archivo sof (SRAM Object File) en RBF (Raw Binary File).<\/p>\n<p>Lo primero que haremos ser\u00e1 apagar la placa de desarrollo y extraer la tarjeta micro-SD, ya que habr\u00e1 que copiar el archivo rbf resultante y hacer que lo cargue en el arranque.<\/p>\n<p>En el CD podemos encontrar un script de Windows con el nombre de \u201csof_to_rbf.bat\u201d, lo abrimos con un editor de texto y lo modificamos para que se correspondan los nombres de nuestros ficheros, de modo que se pueda hacer la llamada de forma correcta. Es f\u00e1cil, s\u00f3lo hay que cambiar el nombre del archivo .sof que tiene que leer y decirle el nombre con el que queremos que lo genere. Despu\u00e9s de esto, lo guardamos y lo ejecutamos. Si todo va bien, nos crear\u00e1 el fichero .rbf y habremos terminado este paso.<\/p>\n<p>Casi estamos terminando, ahora insertamos la tarjeta de memoria en nuestro PC y le copiamos el archivo rbf generado. Observamos que hay un archivo llamado \u201cu-boot.src\u201d, este es el que se encarga de decir qu\u00e9 es lo que se va a arrancar al inicio, as\u00ed que hay que editarlo y decirle que queremos arrancar nuestro rbf, lo hacemos con un editor de texto.<\/p>\n<h3>Arranque y ejecuci\u00f3n<\/h3>\n<p>Volvemos a insertar la tarjeta de memoria en la placa y nos disponemos a arrancar. La configuraci\u00f3n del MSEL est\u00e1 en \u201c010100\u201d. Si estamos con la terminal abierta podremos ver qu\u00e9 es lo que est\u00e1 haciendo desde el arranque. En mi caso, he sacado esta captura que muestra c\u00f3mo efectivamente est\u00e1 cargando el rbf que le he dicho:<\/p>\n<div id=\"attachment_177\" style=\"width: 675px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-177\" class=\"size-full wp-image-177\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot.png\" alt=\"\" width=\"665\" height=\"421\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot.png 665w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-300x190.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-150x95.png 150w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-318x201.png 318w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/a><p id=\"caption-attachment-177\" class=\"wp-caption-text\">Imagen 11. El sistema ha cargado el rbf al inicio.<\/p><\/div>\n<p>Al igual que antes, aparecer\u00e1 el int\u00e9rprete de comandos. Iniciamos sesi\u00f3n y estaremos ya en nuestro directorio principal. Ah\u00ed es donde ten\u00edamos ya copiado el ejecutable \u201cled\u201d. Pues ahora lo abrimos y comprobamos el resultado. Vemos que los leds se mueven tal y c\u00f3mo se especific\u00f3 en el programa, por lo tanto, estamos accediendo desde Linux a recursos propios de la FPGA. Concluimos que el puente funciona correctamente, y que este ejemplo puede ser la base para desarrollar sistemas de mayor envergadura y complejidad.<\/p>\n<h3>Funcionamiento<\/h3>\n<p>Para terminar, dejo aqu\u00ed un v\u00eddeo en el que se ve como funciona. Se ha cargado la imagen con el rbf y estamos ante el int\u00e9rprete de comandos de Linux. Lo que hago es ejecutar el programa y ver c\u00f3mo activa los leds.<\/p>\n<div style=\"width: 640px;\" class=\"wp-video\"><!--[if lt IE 9]><script>document.createElement('video');<\/script><![endif]-->\n<video class=\"wp-video-shortcode\" id=\"video-166-1\" width=\"640\" height=\"360\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/hps_fpga.mp4?_=1\" \/><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/hps_fpga.mp4\">http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/hps_fpga.mp4<\/a><\/video><\/div>\n<h2>C\u00f3digo Fuente<\/h2>\n<p>En los siguientes enlaces se puede encontrar el c\u00f3digo generado en VHDL y el repositorio de adquisici\u00f3n de datos.<\/p>\n<p><a href=\"https:\/\/github.com\/jagumiel\/Data-Acquisition\/tree\/master\/VHDL\/HPS-FPGA-SoC\" target=\"_blank\" rel=\"noopener\">Repositorio de mis proyectos basados en SoC FPGA. El readme.md explica en qu\u00e9 consiste cada uno.<\/a><br \/>\n<a href=\"https:\/\/github.com\/jagumiel\/Data-Acquisition\/tree\/master\/VHDL\/HPS-FPGA-SoC\/demo_led\" target=\"_blank\" rel=\"noopener\">C\u00f3digo y ficheros generados para esta entrada. Demo de ejemplo con los leds.<\/a><\/p>\n<h2>Posibles problemas<\/h2>\n<p>Con este no me ha pasado, pero he hecho m\u00e1s proyectos basado en lo mismo y al principio me volv\u00ed un poco loco, hasta que me di cuenta del problema y su soluci\u00f3n. Cuando segu\u00eda el proceso y ejecutaba el programa en Linux, el sistema se quedaba colgado y ten\u00eda que apagar y encender.<\/p>\n<p>D\u00e1ndole vueltas mir\u00e9 la asignaci\u00f3n de pines en Quartus, y al parecer, aunque ejecutaba el script Tcl, no asignaba correctamente todos los pines. Tuve que cambiar las asignaciones de los perif\u00e9ricos y del reloj. Para eso lo \u00fanico que hay que hacer es fijarse en los pines que vienen en la gu\u00eda del usuario y compararlos con los que tenemos en el proyecto.<\/p>\n<p>Despu\u00e9s de esto, volv\u00ed a compilar, convert\u00ed el archivo .sof en .rbf, lo pas\u00e9 a la tarjeta indic\u00e1ndoselo en el script de arranque \u201cu-boot.src\u201d y todo funcionaba.<\/p>\n<h2>Trabajo futuro<\/h2>\n<p>En la entrada <a href=\"https:\/\/jagumiel.xyz\/blog\/2019\/03\/11\/real-time-linux-en-soc-fpga\/\">Real Time Linux en SoC-FPGA. A\u00f1ade Preempt-RT<\/a>, explico como compilar un Kernel preemptivo de Linux RT para este tipo de sistemas. Esto nos permitir\u00e1 ejecutar aplicaciones que necesiten trabajar en tiempo real.<\/p>\n\n\t\t<style type=\"text\/css\">\n\t\t\t#gallery-1 {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-item {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 16%;\n\t\t\t}\n\t\t\t#gallery-1 img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#gallery-1 .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t\/* see gallery_shortcode() in wp-includes\/media.php *\/\n\t\t<\/style>\n\t\t<div id='gallery-1' class='gallery galleryid-166 gallery-columns-6 gallery-size-small'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/01-terasic-de1-soc-diagram\/'><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"590\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram.jpg\" class=\"attachment-small size-small\" alt=\"Esquema de la arquitectura SoC del Altera Cyclone V.\" aria-describedby=\"gallery-1-167\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram.jpg 700w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram-300x253.jpg 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/01-terasic-de1-soc-diagram-150x126.jpg 150w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-167'>\n\t\t\t\tArquitectura SoC Cyclone V\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/02-comunicacion_serie\/'><img loading=\"lazy\" decoding=\"async\" width=\"751\" height=\"437\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-168\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie.png 751w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie-300x175.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/02-comunicacion_serie-150x87.png 150w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-168'>\n\t\t\t\tImagen 2. Ubicando el puerto COM y configur\u00e1ndolo en PuTTY.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/03-system_builder\/'><img loading=\"lazy\" decoding=\"async\" width=\"801\" height=\"546\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-169\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder.png 801w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-300x204.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-768x524.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/03-System_Builder-150x102.png 150w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-169'>\n\t\t\t\tImagen 3. Configurando el sistema en el System Builder.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/04-hps_system\/'><img loading=\"lazy\" decoding=\"async\" width=\"829\" height=\"316\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-170\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system.png 829w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-300x114.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-768x293.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/04-hps_system-150x57.png 150w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-170'>\n\t\t\t\tImagen 4. Dise\u00f1ando la arquitectura del sistema en Platform Designer (anteriormente Qys).\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/05-plantilla\/'><img loading=\"lazy\" decoding=\"async\" width=\"588\" height=\"493\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-171\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla.png 588w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla-300x252.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/05-Plantilla-150x126.png 150w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-171'>\n\t\t\t\tImagen 5. Plantilla de c\u00f3digo para la instanciaci\u00f3n. Est\u00e1 incompleta, pero ahorra tiempo.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/06-codigo\/'><img loading=\"lazy\" decoding=\"async\" width=\"867\" height=\"419\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-172\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo.png 867w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-300x145.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-768x371.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/06-Codigo-150x72.png 150w\" sizes=\"auto, (max-width: 867px) 100vw, 867px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-172'>\n\t\t\t\tImagen 6. Parte del c\u00f3digo. Us\u00e9 la plantilla y la edit\u00e9.\n\t\t\t\t<\/dd><\/dl><br style=\"clear: both\" \/><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/07-tcl_scripts\/'><img loading=\"lazy\" decoding=\"async\" width=\"580\" height=\"477\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-173\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts.png 580w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts-300x247.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/07-tcl_scripts-150x123.png 150w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-173'>\n\t\t\t\tImagen 7. Scripts Tcl que hay que ejecutar.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/08-unused_pin\/'><img loading=\"lazy\" decoding=\"async\" width=\"1647\" height=\"743\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-174\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin.png 1647w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-300x135.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-768x346.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-1024x462.png 1024w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/08-unused_pin-150x68.png 150w\" sizes=\"auto, (max-width: 1647px) 100vw, 1647px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-174'>\n\t\t\t\tImagen 8. Pasos a dar para cambiar el estado de los pines no usados.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/09-headers\/'><img loading=\"lazy\" decoding=\"async\" width=\"658\" height=\"202\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-175\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers.png 658w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers-300x92.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/09-Headers-150x46.png 150w\" sizes=\"auto, (max-width: 658px) 100vw, 658px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-175'>\n\t\t\t\tImagen 9. Llamada a las variables de entorno y generaci\u00f3n de cabeceras.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/10-compilacion_c\/'><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"500\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-176\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C.png 981w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-300x153.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-768x391.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/10-compilacion_C-150x76.png 150w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-176'>\n\t\t\t\tImagen 10. Compilaci\u00f3n en C y env\u00edo a la placa a trav\u00e9s de SSH desde consola.\n\t\t\t\t<\/dd><\/dl><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/11-boot\/'><img loading=\"lazy\" decoding=\"async\" width=\"665\" height=\"421\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot.png\" class=\"attachment-small size-small\" alt=\"\" aria-describedby=\"gallery-1-177\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot.png 665w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-300x190.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-150x95.png 150w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2019\/01\/11-boot-318x201.png 318w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-177'>\n\t\t\t\tImagen 11. El sistema ha cargado el rbf al inicio.\n\t\t\t\t<\/dd><\/dl>\n\t\t\t<br style='clear: both' \/>\n\t\t<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Explora c\u00f3mo integrar CPU, microcontrolador y FPGA en un solo chip con SoC-FPGA. Aprende a comunicar HPS y FPGA para un funcionamiento conjunto eficiente.<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/jagumiel.xyz\/blog\/2019\/01\/25\/soc-fpga-la-union-de-cpu-%c2%b5c-y-fpga\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[23,5,22],"tags":[27,28,24,14,32,33,36,35,34,31],"class_list":["post-166","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fpga","category-hardware","category-vhdl","tag-altera","tag-cyclone-v","tag-fpga","tag-hardware","tag-hps","tag-intel","tag-platform-designer","tag-qsys","tag-quartus","tag-soc"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/comments?post=166"}],"version-history":[{"count":18,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/166\/revisions"}],"predecessor-version":[{"id":761,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/166\/revisions\/761"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media\/167"}],"wp:attachment":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media?parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/categories?post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/tags?post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}