{"id":937,"date":"2021-09-22T09:27:10","date_gmt":"2021-09-22T09:27:10","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?p=937"},"modified":"2021-10-07T10:28:54","modified_gmt":"2021-10-07T10:28:54","slug":"lectura-de-la-fifo-y-su-temporizacion-problemas-asociados","status":"publish","type":"post","link":"https:\/\/dsd.webs.upv.es\/?p=937","title":{"rendered":"Lectura de la FIFO y su temporizaci\u00f3n. Problemas asociados."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La lectura de datos de la FIFO presenta confusiones debido a su temporizaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello hay que tener claro cuando ocurren las cosas. Cuando se solicita la lectura de datos y cuando esta lectura se hace efectiva.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lectura de la FIFO.<\/h2>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\"><strong>La FIFO es un elemento secuencial<\/strong>, por tanto, los instantes importantes en los elementos secuenciales vienen determinados por el flanco de reloj.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En un dise\u00f1o dado, la l\u00f3gica, genera un resultado en las salidas ante un valor de las entradas. En el caso de la l\u00f3gica secuencial las entradas son muestreadas (le\u00eddas) s\u00f3lo en un instante dado, en el flanco de reloj.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las ENTRADAS, por tanto, deben estar estables un tiempo ANTES del flanco de reloj (tiempo de setup) y un tiempo despu\u00e9s (tiempo de hold) para que puedan ser capturadas de forma adecuada cuando este flanco de reloj llegue. Una vez las entradas son capturadas la l\u00f3gica de generaci\u00f3n de las salidas puede calcular un resultado. Por tanto, las SALIDAS se generan siempre DESPU\u00c9S del flanco de reloj que captur\u00f3 las entradas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teniendo esto claro vamos a analizar el proceso de lectura de la FIFO:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0-1024x184.png\" alt=\"\" class=\"wp-image-938\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0-1024x184.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0-300x54.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0-768x138.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0-1536x276.png 1536w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/lecturaFIFO_v1_0.png 1805w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como podemos ver en la imagen anterior, si queremos realizar una lectura de un dato, activamos la se\u00f1al READ, esta se\u00f1al es capturada por el flanco de reloj y su resultado, el dato le\u00eddo, es obtenido despu\u00e9s del flanco de reloj.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay que tener en cuenta que la <strong>activaci\u00f3n de READ<\/strong> se produce en el <strong>ciclo de reloj n<\/strong>, pero los <strong>resultados le\u00eddos en DATA_OUT<\/strong> se producen en el <strong>ciclo de reloj n+1<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lectura y escritura de una memoria RAM.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><br>Analicemos que pasa con la escritura y lectura de una memoria RAM que tiene escritura s\u00edncrona y lectura s\u00edncrona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos como se realiza una escritura en la posici\u00f3n \u201ca\u201d de la memoria y una lectura en la posici\u00f3n \u201cb\u201d de la memoria:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"698\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1-1024x698.png\" alt=\"\" class=\"wp-image-939\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1-1024x698.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1-300x205.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1-768x524.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1-1536x1048.png 1536w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_RAM_v_0_1.png 1805w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Para escribir un dato \u201cx\u201d en la posici\u00f3n \u201ca\u201d de la memoria<\/strong> (marcado en rojo) tenemos que activar el wren, colocar la direcci\u00f3n \u201ca\u201d en wraddress y el dato \u201cx\u201d en data_in. Como es un sistema s\u00edncrono si esto lo hacemos en el ciclo n, el resultado estar\u00e1 guardado en memoria en el ciclo n+1.<\/li><li><strong>Para leer un dato almacenado en la posici\u00f3n \u201cb\u201d de la memoria<\/strong> (marcado en azul), tenemos que activar rden, colocar la direcci\u00f3n \u201cb\u201d en rdaddress. Como es un sistema s\u00edncrono si esto lo hacemos en el ciclo n, el resultado de lectura estar\u00e1 en data_out en el ciclo n+1.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Importante notar los tiempos del proceso, la escritura en la memoria se finaliza en el ciclo siguiente a la solicitud de escritura. La lectura de la memoria se hace efectiva en data_out en el ciclo siguiente a su solicitud.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"> Problem\u00e1tica de la escritura y lectura simultanea de la misma posici\u00f3n de memoria RAM.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a la <strong>problem\u00e1tica de la escritura y lectura simultanea de la misma posici\u00f3n de memoria<\/strong>. Esta problem\u00e1tica afectar\u00e1 a la lectura y escritura simultanea de una FIFO basada en este tipo de memoria cuando esta FIFO est\u00e9 vac\u00eda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el ejemplo de escribir un dato x en la posici\u00f3n \u201ca\u201d de la memoria RAM y de manera simultanea leer el dato almacenado en la misma posici\u00f3n \u201ca\u201d de la memoria.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"593\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0-1024x593.png\" alt=\"\" class=\"wp-image-940\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0-1024x593.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0-300x174.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0-768x445.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0-1536x889.png 1536w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0.png 1805w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si nos fijamos en la imagen anterior, el dato le\u00eddo no es el nuevo dato escrito (dato x), si no el que ten\u00edamos anteriormente en la memoria (dato c). Esto se debe a que la escritura solicitada en el ciclo n, por la naturaleza secuencial del circuito, se realiza en el ciclo n+1.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lectura y Escritura simultanea de la FIFO VAC\u00cdA . Dise\u00f1o de la etapa de salida.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si implementamos la FIFO con esta memoria RAM, cuando se lee y escribe simult\u00e1neamente estando la FIFO vac\u00eda, no podemos hacer uso de la RAM. Tened en cuenta, que el dato le\u00eddo en el ciclo n+1, en este caso particular, tiene que ser la entrada data_in en el ciclo n. Pero si ese data_in hay que escribirlo y leerlo de la RAM tardar\u00edamos dos ciclos de reloj. Para resolver esto, tenemos que hacer un \u201cbypass\u201d de la RAM en esta situaci\u00f3n particular.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El circuito de salida de la FIFO<\/strong> propuesto para resolver el problema es el siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"933\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-1024x933.png\" alt=\"\" class=\"wp-image-941\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-1024x933.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-300x273.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-768x700.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-1536x1399.png 1536w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/Circuitos_Salida_FIFO-2048x1866.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La salida de la FIFO ser\u00e1 tomada normalmente de la RAM (data_out_mem) excepto en el caso particular de una lectura y escritura simultanea con fifo vac\u00eda. La m\u00e1quina de estados detectar\u00e1 esa situaci\u00f3n y activar\u00e1 una se\u00f1al de salida select, que nos permitir\u00e1 seleccionar la salida adecuada. <strong>Esta se\u00f1al select se genera en el bloque combinacional de c\u00e1lculo de salidas del m\u00e1quina de estados.<\/strong> No debemos olvidar que la salida DATA_OUT es en el ciclo n+1, pero la solicitud de lectura en el ciclo n, por tanto, la entrada DATA_IN y la se\u00f1al select deben ser registradas para puedan tener su efecto en el ciclo n+1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De esta forma la temporizaci\u00f3n de las se\u00f1ales para el caso particular de lectura y escritura simultanea en la FIFO cuando est\u00e1 VAC\u00cdA quedar\u00e1 como se indica a continuaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"518\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia-1024x518.png\" alt=\"\" class=\"wp-image-942\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia-1024x518.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia-300x152.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia-768x389.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia-1536x778.png 1536w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_Simultanea_FIFO_vacia.png 1837w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como nota final, cabe destacar que el valor de salida de la FIFO en DATA_OUT, ser\u00e1 \u00fanicamente v\u00e1lido en el ciclo despu\u00e9s de la solicitud de lectura.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La lectura de datos de la FIFO presenta confusiones debido a su temporizaci\u00f3n. Para ello hay que tener claro cuando ocurren las cosas. Cuando se solicita la lectura de datos y cuando esta lectura se hace efectiva. Lectura de la FIFO. La FIFO es un elemento secuencial, por tanto, los instantes importantes en los elementos secuenciales vienen determinados por el flanco de reloj. En un dise\u00f1o dado, la l\u00f3gica, genera un resultado en las salidas ante un valor de las entradas. En el caso de la l\u00f3gica secuencial las entradas son muestreadas (le\u00eddas) s\u00f3lo en un instante dado, en el flanco de reloj. Las ENTRADAS, por tanto, deben estar estables un tiempo ANTES del flanco de reloj (tiempo de setup) y un tiempo despu\u00e9s (tiempo de hold) para que puedan ser capturadas de forma adecuada cuando este flanco de reloj llegue. Una vez las entradas son capturadas la l\u00f3gica de generaci\u00f3n de las salidas puede calcular un resultado. Por tanto, las SALIDAS se generan siempre DESPU\u00c9S del flanco de reloj que captur\u00f3 las entradas. Teniendo esto claro vamos a analizar el proceso de lectura de la FIFO: Como podemos ver en la imagen anterior, si queremos realizar una lectura de un dato, activamos la se\u00f1al READ, esta se\u00f1al es capturada por el flanco de reloj y su resultado, el dato le\u00eddo, es obtenido despu\u00e9s del flanco de reloj. Hay que tener en cuenta que la activaci\u00f3n de READ se produce en el ciclo de reloj n, pero los resultados le\u00eddos en DATA_OUT se producen en el ciclo de reloj n+1. Lectura y escritura de una memoria RAM. Analicemos que pasa con la escritura y lectura de una memoria RAM que tiene escritura s\u00edncrona y lectura s\u00edncrona. Veamos como se realiza una escritura en la posici\u00f3n \u201ca\u201d de la memoria y una lectura en la posici\u00f3n \u201cb\u201d de la memoria: Para escribir un dato \u201cx\u201d en la posici\u00f3n \u201ca\u201d de la memoria (marcado en rojo) tenemos que activar el wren, colocar la direcci\u00f3n \u201ca\u201d en wraddress y el dato \u201cx\u201d en data_in. Como es un sistema s\u00edncrono si esto lo hacemos en el ciclo n, el resultado estar\u00e1 guardado en memoria en el ciclo n+1. Para leer un dato almacenado en la posici\u00f3n \u201cb\u201d de la memoria (marcado en azul), tenemos que activar rden, colocar la direcci\u00f3n \u201cb\u201d en rdaddress. Como es un sistema s\u00edncrono si esto lo hacemos en el ciclo n, el resultado de lectura estar\u00e1 en data_out en el ciclo n+1. Importante notar los tiempos del proceso, la escritura en la memoria se finaliza en el ciclo siguiente a la solicitud de escritura. La lectura de la memoria se hace efectiva en data_out en el ciclo siguiente a su solicitud. Problem\u00e1tica de la escritura y lectura simultanea de la misma posici\u00f3n de memoria RAM. Vamos a la problem\u00e1tica de la escritura y lectura simultanea de la misma posici\u00f3n de memoria. Esta problem\u00e1tica afectar\u00e1 a la lectura y escritura simultanea de una FIFO basada en este tipo de memoria cuando esta FIFO est\u00e9 vac\u00eda. Veamos el ejemplo de escribir un dato x en la posici\u00f3n \u201ca\u201d de la memoria RAM y de manera simultanea leer el dato almacenado en la misma posici\u00f3n \u201ca\u201d de la memoria. Si nos fijamos en la imagen anterior, el dato le\u00eddo no es el nuevo dato escrito (dato x), si no el que ten\u00edamos anteriormente en la memoria (dato c). Esto se debe a que la escritura solicitada en el ciclo n, por la naturaleza secuencial del circuito, se realiza en el ciclo n+1. Lectura y Escritura simultanea de la FIFO VAC\u00cdA . Dise\u00f1o de la etapa de salida. Si implementamos la FIFO con esta memoria RAM, cuando se lee y escribe simult\u00e1neamente estando la FIFO vac\u00eda, no podemos hacer uso de la RAM. Tened en cuenta, que el dato le\u00eddo en el ciclo n+1, en este caso particular, tiene que ser la entrada data_in en el ciclo n. Pero si ese data_in hay que escribirlo y leerlo de la RAM tardar\u00edamos dos ciclos de reloj. Para resolver esto, tenemos que hacer un \u201cbypass\u201d de la RAM en esta situaci\u00f3n particular. El circuito de salida de la FIFO propuesto para resolver el problema es el siguiente: La salida de la FIFO ser\u00e1 tomada normalmente de la RAM (data_out_mem) excepto en el caso particular de una lectura y escritura simultanea con fifo vac\u00eda. La m\u00e1quina de estados detectar\u00e1 esa situaci\u00f3n y activar\u00e1 una se\u00f1al de salida select, que nos permitir\u00e1 seleccionar la salida adecuada. Esta se\u00f1al select se genera en el bloque combinacional de c\u00e1lculo de salidas del m\u00e1quina de estados. No debemos olvidar que la salida DATA_OUT es en el ciclo n+1, pero la solicitud de lectura en el ciclo n, por tanto, la entrada DATA_IN y la se\u00f1al select deben ser registradas para puedan tener su efecto en el ciclo n+1 De esta forma la temporizaci\u00f3n de las se\u00f1ales para el caso particular de lectura y escritura simultanea en la FIFO cuando est\u00e1 VAC\u00cdA quedar\u00e1 como se indica a continuaci\u00f3n: Como nota final, cabe destacar que el valor de salida de la FIFO en DATA_OUT, ser\u00e1 \u00fanicamente v\u00e1lido en el ciclo despu\u00e9s de la solicitud de lectura.<\/p>\n","protected":false},"author":6,"featured_media":940,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[27],"tags":[56,54,55],"class_list":["post-937","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diseno","tag-circuitos-secuenciales","tag-fifo","tag-temporizacion"],"featured_image_src":"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/09\/escritura_lectura_misma_posicion_RAM_v_1_0.png","author_info":{"display_name":"Jos\u00e9 Monz\u00f3 Ferrer","author_link":"https:\/\/dsd.webs.upv.es\/?author=6"},"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/937","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=937"}],"version-history":[{"count":1,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions"}],"predecessor-version":[{"id":943,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/937\/revisions\/943"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/media\/940"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=937"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=937"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=937"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}