{"id":158,"date":"2018-12-18T21:05:11","date_gmt":"2018-12-18T21:05:11","guid":{"rendered":"http:\/\/jagumiel.xyz\/blog\/?p=158"},"modified":"2025-03-05T16:06:35","modified_gmt":"2025-03-05T16:06:35","slug":"protocolo-i2c-en-vhdl-para-fpga","status":"publish","type":"post","link":"https:\/\/jagumiel.xyz\/blog\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/","title":{"rendered":"Protocolo I2C en VHDL para FPGA: Gu\u00eda pr\u00e1ctica"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>La implementaci\u00f3n del protocolo I2C en VHDL para FPGA permite dise\u00f1ar m\u00f3dulos maestros y esclavos optimizados. Este protocolo sirve para para comunicar dos partes de un circuito, como podr\u00eda ser un controlador con otros circuitos perif\u00e9ricos. Utiliza s\u00f3lo tres cables, uno por donde el maestro env\u00eda la se\u00f1al de reloj (SCL), otro bidireccional, por donde se transfieren los datos (SDA) y por \u00faltimo una tierra com\u00fan.<\/p>\n<p>Para que la comunicaci\u00f3n funcione tiene que haber un protocolo, ya que no se puede emitir por el mismo cable a la vez. Una vez establecida la comunicaci\u00f3n, mientras un dispositivo est\u00e1 enviando informaci\u00f3n, el otro ha de estar escuchando.<\/p>\n<h2>Concepto te\u00f3rico<\/h2>\n<p>El I2C funciona como un circuito de colector abierto, esto significa que el chip puede poner su salida a baja o dejar la l\u00ednea abierta (alta impedancia), es decir, puede poner la l\u00ednea a tierra, pero no puede ponerla por s\u00ed mismo a alta. Para que las l\u00edneas de SCL y SDA puedan tener un \u201c1 l\u00f3gico\u201d ser\u00e1 necesario una fuente externa y poner resistencias de \u201cpull-up\u201d. En caso de trabajar con m\u00e1s de un dispositivo, s\u00f3lo har\u00e1 falta poner una resistencia para cada l\u00ednea (SCL y SDA), no por cada dispositivo.<\/p>\n<div id=\"attachment_29\" style=\"width: 566px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-157\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up.png\" alt=\"\" width=\"556\" height=\"267\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up.png 556w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up-300x144.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up-150x72.png 150w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 1. Funcionamiento de un circuito de colector abierto con sus resistencias \u00abpull-up\u00bb.<\/p><\/div>\n<p>El esquema se puede ver en la imagen superior. El transistor Mosfet funciona como un interruptor. Cuando est\u00e1 abierto, deja pasar V<sub>in<\/sub>, poniendo en el cable esa tensi\u00f3n, y cuando est\u00e1 cerrado, conduce la l\u00ednea a tierra, lo que se traduce en una tensi\u00f3n de 0V. De esta forma es como se generan los \u201c1\u201d y \u201c0\u201d en este bus.<\/p>\n<p>El est\u00e1ndar I2C permite tener m\u00faltiples dispositivos conectados al mismo bus, pero para que se entiendan es necesario un protocolo de comunicaci\u00f3n. Todos los dispositivos estar\u00e1n escuchando hasta que detecten un cambio particular en las l\u00edneas que indique el comienzo de transferencia. A continuaci\u00f3n, el m\u00e1ster enviar\u00e1 una direcci\u00f3n para referirse a uno de los dispositivos y comenzar la comunicaci\u00f3n con \u00e9l. Hay casos en los que un esclavo tambi\u00e9n puede iniciar una comunicaci\u00f3n con otro esclavo.<\/p>\n<div id=\"attachment_29\" style=\"width: 685px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-152\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface.png\" alt=\"Interfaz I2C\" width=\"675\" height=\"326\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface.png 675w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface-300x145.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface-150x72.png 150w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 2. Esquema de conexionado en I2C de un maestro con sus esclavos.<\/p><\/div>\n<h2>Protocolo<\/h2>\n<p>El protocolo permite dos operaciones distintas, la escritura y la lectura, empezar\u00e9 con el primero de ellos.<\/p>\n<p>Cuando el sistema est\u00e1 inactivo, las dos l\u00edneas est\u00e1n en alta impedancia, por lo que al tener conectadas las resistencias \u201cpull-up\u201d, las dos l\u00edneas est\u00e1n en \u201calta\u201d. Para indicar el comienzo de una operaci\u00f3n (condici\u00f3n de inicio), la l\u00ednea de datos tiene que ponerse a \u20180\u2019 antes que la del reloj. El reloj empezar\u00e1 a funcionar marcando el ritmo de la transmisi\u00f3n. Para terminar la transmisi\u00f3n (condici\u00f3n de parada), hay que poner el canal SCL a \u20181\u2019 antes que el SDA. Seguir\u00e1n ambos a \u20181\u2019 hasta que se vuelva a hacer la condici\u00f3n de inicio.<\/p>\n<p>En el protocolo hay que tener en cuenta que cada 8 bits hay un ACK. Lo primero que se hace es enviar la direcci\u00f3n del dispositivo (7bits) seguido de un bit de lectura\/escritura. El \u20180\u2019 indica que se desea escribir y el \u20181\u2019 que se desea leer. El esclavo responder\u00e1 con un ACK, que el maestro leer\u00e1 y lo tendr\u00e1 en consideraci\u00f3n. El ACK consiste en poner la l\u00ednea a \u20180\u2019 si todo va bien, y a \u20181\u2019 en caso contrario<\/p>\n<h3>Escritura<\/h3>\n<p>Para la escritura, despu\u00e9s del ACK, se env\u00eda la direcci\u00f3n del registro donde se desea escribir (1Byte), y se espera de nuevo al ACK por parte del esclavo. Por \u00faltimo, se env\u00eda el dato que se desea escribir (1Byte), se espera al ACK y se termina con la condici\u00f3n de parada, que consiste en SCL en alta antes que SDA. En caso de que se quiera escribir en dos o m\u00e1s registros consecutivos, se enviar\u00eda el siguiente dato despu\u00e9s del ACK y se terminar\u00eda con la condici\u00f3n de parada.<\/p>\n<div id=\"attachment_29\" style=\"width: 637px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-151\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C.png\" alt=\"Operaci\u00f3n de escritura en I2C\" width=\"627\" height=\"169\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C.png 627w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C-300x81.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C-150x40.png 150w\" sizes=\"auto, (max-width: 627px) 100vw, 627px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 3. Operaci\u00f3n de escritura en I2C.<\/p><\/div>\n<h3>Lectura<\/h3>\n<p>El caso de la lectura es un poco diferente, pero sigue siendo sencillo. Se empieza la trama como si fuera una lectura, con su condici\u00f3n de inicio, la direcci\u00f3n del dispositivo seguido del bit de escritura y despu\u00e9s del ACK se env\u00eda la direcci\u00f3n del registro que se desea leer. Se espera al ACK. Aqu\u00ed viene lo diferente. Despu\u00e9s del ACK, se vuelve a repetir la condici\u00f3n de inicio, y se env\u00eda de nuevo la direcci\u00f3n del dispositivo seguido del bit de lectura, el esclavo escribir\u00e1 el bit de ACK y el maestro se quedar\u00e1 escuchando.<\/p>\n<p>El esclavo est\u00e1 enviando el contenido del registro que se le ha solicitado con anterioridad, el maestro debe de leerlo y almacenarlo, ya que le est\u00e1n respondiendo. Si se desea seguir leyendo registros consecutivos se le env\u00eda al esclavo un ACK a \u20180\u2019, en caso de querer finalizar la comunicaci\u00f3n se le manda un NACK y se efect\u00faa la condici\u00f3n de parada.<\/p>\n<div id=\"attachment_29\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-153\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C.png\" alt=\"Operaci\u00f3n de lectura en I2C\" width=\"600\" height=\"358\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C.png 600w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C-300x179.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C-250x150.png 250w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C-150x90.png 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 4. Operaci\u00f3n de lectura en I2C.<\/p><\/div>\n<h2>Implementaci\u00f3n en hardware y montaje<\/h2>\n<h3><strong>Materiales<\/strong><\/h3>\n<p>Si queremos implementar el protocolo I2C en VHDL necesitaremos de los siguientes materiales. En el caso del hardware, he escogido un expansor de GPIO, pero puedes usar cualquier otro dispositivo, como podr\u00eda ser un sensor de temperatura\/humedad.<\/p>\n<ul>\n<li><strong>Software:<\/strong>\n<ul>\n<li>Quartus II Lite 18.0<\/li>\n<li>ModelSim<\/li>\n<li>Digiview 9 (Software del analizador l\u00f3gico)<\/li>\n<\/ul>\n<\/li>\n<li><strong>Hardware<\/strong>\n<ul>\n<li>Terasic DE-1 SoC (Placa de desarrollo)<\/li>\n<li>NXP OM13488 (Expansor de GPIO)<\/li>\n<li>Cables y dos resistencias de 10k\u03a9<\/li>\n<li>Otros recursos: Pol\u00edmetro, osciloscopio y analizador l\u00f3gico.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Desarrollo del protocolo I2C en VHDL<\/h3>\n<p>Una vez estudiado el funcionamiento, se ha conseguido implementar el protocolo I2C en VHDL. Hasta la fecha hab\u00eda usado el bus I2C con Arduino y PIC24, pero hab\u00eda usado librer\u00edas predefinidas para comunicarme con los dispositivos. En este caso he tenido que bajar de nivel y escribir en hardware todo el protocolo de comunicaci\u00f3n, teniendo en cuenta c\u00f3mo generar las se\u00f1ales, la importancia de la sincron\u00eda, el env\u00edo y recepci\u00f3n de datos y la interconexi\u00f3n de los circuitos. Y es que, desarrollar el protocolo I2C en VHDL no es algo trivial.<\/p>\n<p>Para probar el protocolo sobre un hardware real he usado una placa de pruebas que funciona como expansor de GPIO. He tenido que estudiarla, ver sus circuitos internos, mover algunos jumpers para configurarla\u2026 Ten\u00eda bastante m\u00e1s trabajo que el conectarla y esperar a que funcionara. Las pruebas que he realizado han sido tanto con un osciloscopio como con un analizador l\u00f3gico, para ver toda la trama.<\/p>\n<h3>Montaje<\/h3>\n<p>He utilizado una placa de desarrollo Terasic DE-1 con una FPGA Cyclone V de Altera\/Intel. Del puerto de GPIO de la placa he sacado una tensi\u00f3n de 3.3V para alimentar el perif\u00e9rico y he configurado otros dos puertos digitales para las se\u00f1ales de SCL y SDA. Todo est\u00e1 ordenado por colores, de forma que la alimentaci\u00f3n son los cables rojo y negro, el color verde es para la l\u00ednea SCL y el amarillo para el SDA. El valor de las resistencias de pull-up es de 10k\u03a9.<\/p>\n<div id=\"attachment_29\" style=\"width: 1290px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-154\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57.jpg\" alt=\"\" width=\"1280\" height=\"960\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57.jpg 1280w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57-300x225.jpg 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57-768x576.jpg 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57-1024x768.jpg 1024w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57-150x113.jpg 150w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 5. Conexi\u00f3n de cables y resistencias de \u00abpull-up\u00bb.<\/p><\/div>\n<p>He utilizado una placa de prototipado para poner las resistencias \u00abpull-up\u00bb en las l\u00edneas de reloj y datos. Aunque una ristra de cables vaya al lado izquierdo de la placa, se puede acceder tambi\u00e9n por el lado derecho. He comprobado con un pol\u00edmetro que internamente tienen la misma ruta, es decir, he mirado la continuidad.<\/p>\n<div id=\"attachment_155\" style=\"width: 1290px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-155\" class=\"wp-image-155 size-full\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09.jpg\" alt=\"PWM en osciloscopio por I2C. Se ha conseguido implementar I2C en VHDL para FPGA.\" width=\"1280\" height=\"960\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09.jpg 1280w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09-300x225.jpg 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09-768x576.jpg 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09-1024x768.jpg 1024w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09-150x113.jpg 150w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><p id=\"caption-attachment-155\" class=\"wp-caption-text\">Imagen 6. Se\u00f1al de salida enviada a trav\u00e9s de I2C al expansor de GPIO.<\/p><\/div>\n<p>En la imagen superior se observa c\u00f3mo he conectado el osciloscopio para ver la se\u00f1al que estoy generando por la salida del octavo pin. Lo he configurado como salida y estoy escribiendo alternativamente &#8216;0&#8217; y &#8216;1&#8217;.<\/p>\n<h3>Resultados. Protocolo I2C en VHDL funcionando<\/h3>\n<p>Tras hacer las pruebas, los datos obtenidos son satisfactorios. Puedo sacar una se\u00f1al de GPIO a trav\u00e9s del perif\u00e9rico y manipularla. Si conecto un generador de funciones y lo configuro como entrada, puedo leer esa l\u00ednea del perif\u00e9rico a trav\u00e9s de la FPGA. Y si escribo en los registros de la tarjeta expansora, tambi\u00e9n puedo leerlos en la FPGA y comprobar que la escritura se ha hecho correctamente.<\/p>\n<h3>Trama de lectura y escritura de I2C en VHDL<\/h3>\n<p>En esta primera captura accedo al dispositivo 72h, esta es su direcci\u00f3n. Entro a escribir en el registro 03h, que es el de configuraci\u00f3n. Determina que pines son de entrada y cuales de salida. Pongo los cuatro primeros bits a &#8216;0&#8217; (lectura) y los cuatro \u00faltimos a &#8216;1&#8217;, escritura 0Fh. Estas son las capturas que he obtenido (ambas son iguales, pero una est\u00e1 ampliada):<\/p>\n<div id=\"attachment_29\" style=\"width: 1036px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-149\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1.png\" alt=\"\" width=\"1026\" height=\"117\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1.png 1026w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1-300x34.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1-768x88.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1-1024x117.png 1024w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1-150x17.png 150w\" sizes=\"auto, (max-width: 1026px) 100vw, 1026px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 7. Trama de escritura y lectura generada por la FPGA.<\/p><\/div>\n<p>La segunda escritura la hago en el registro 01h, que es el de datos de escritura. Los pines que he puesto como entrada da igual que tengan un &#8216;0&#8217; o un &#8216;1&#8217;, se van a tratar igual, pero en los de escritura, si pongo un &#8216;1&#8217; saldr\u00e1 voltaje de 3.3V y si pongo un &#8216;0&#8217; no habra tensi\u00f3n. Alterando el valor de este registro puedo generar una se\u00f1al GPIO.<\/p>\n<h3>Trama de lectura de I2C en VHDL<\/h3>\n<p>La \u00faltima parte de la trama se corresponde a una lectura. Leo uno de los registros internos de la memoria, concretamente el 01h. Veo que me devuelve el dato con el valor que le he asignado. Se termina con el env\u00edo de un NACK y la condici\u00f3n de parada.<\/p>\n<div id=\"attachment_29\" style=\"width: 1030px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29\" class=\"alignnone size-full wp-image-150\" src=\"http:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2.png\" alt=\"\" width=\"1020\" height=\"132\" srcset=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2.png 1020w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2-300x39.png 300w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2-768x99.png 768w, https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2-150x19.png 150w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/a><p id=\"caption-attachment-29\" class=\"wp-caption-text\">Imagen 8. Trama de lectura de uno de los registros del expansor GPIO.<\/p><\/div>\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\" target=\"_blank\" rel=\"noopener\">Repositorio de adquisici\u00f3n de datos<\/a><br \/>\n<a href=\"https:\/\/github.com\/jagumiel\/Data-Acquisition\/tree\/master\/VHDL\/I2C\/pruebaI2C_RW\" target=\"_blank\" rel=\"noopener\">Protocolo I2C en VHDL para FPGA<\/a><\/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: 12%;\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-158 gallery-columns-8 gallery-size-thumbnail'><dl class='gallery-item'>\n\t\t\t<dt class='gallery-icon landscape'>\n\t\t\t\t<a href='https:\/\/jagumiel.xyz\/blog\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/resistencias_pull-up\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/resistencias_pull-up-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/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\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/i2c-interface\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/I2C-Interface-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"Interfaz I2C\" \/><\/a>\n\t\t\t<\/dt><\/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\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/escritura_i2c\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/escritura_I2C-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"Operaci\u00f3n de escritura en I2C\" \/><\/a>\n\t\t\t<\/dt><\/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\/lectura_i2c\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/lectura_I2C-150x150.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"Operaci\u00f3n de lectura en I2C\" \/><\/a>\n\t\t\t<\/dt><\/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\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/photo_2018-12-16_16-33-57\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-33-57-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"Expansor de GPIO por I2C\" aria-describedby=\"gallery-1-154\" \/><\/a>\n\t\t\t<\/dt>\n\t\t\t\t<dd class='wp-caption-text gallery-caption' id='gallery-1-154'>\n\t\t\t\tExpansor de GPIO por I2C\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\/photo_2018-12-16_16-34-09\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/photo_2018-12-16_16-34-09-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail\" alt=\"PWM en osciloscopio por I2C.\" \/><\/a>\n\t\t\t<\/dt><\/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\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/captura1\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"117\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura1-150x117.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/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\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/captura2\/'><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"132\" src=\"https:\/\/jagumiel.xyz\/blog\/wp-content\/uploads\/2018\/12\/Captura2-150x132.png\" class=\"attachment-thumbnail size-thumbnail\" alt=\"\" \/><\/a>\n\t\t\t<\/dt><\/dl><br style=\"clear: both\" \/>\n\t\t<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Aprende a implementar el protocolo I2C en VHDL para FPGA con esta gu\u00eda. Dise\u00f1a, simula y sintetiza m\u00f3dulos maestros y esclavos en hardware programable.<\/p>\n<p class=\"continue-reading-button\"> <a class=\"continue-reading-link\" href=\"https:\/\/jagumiel.xyz\/blog\/2018\/12\/18\/protocolo-i2c-en-vhdl-para-fpga\/\">Continue reading<i class=\"crycon-right-dir\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":154,"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":[7,23,5,22],"tags":[26,27,28,24,14,29,30,25],"class_list":["post-158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-adquisicion-de-datos","category-fpga","category-hardware","category-vhdl","tag-adquisicion-de-datos","tag-altera","tag-cyclone-v","tag-fpga","tag-hardware","tag-i2c","tag-protocolos","tag-vhdl"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/158","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=158"}],"version-history":[{"count":15,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/158\/revisions"}],"predecessor-version":[{"id":596,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/posts\/158\/revisions\/596"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media\/154"}],"wp:attachment":[{"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/media?parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/categories?post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jagumiel.xyz\/blog\/wp-json\/wp\/v2\/tags?post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}