{"id":1071,"date":"2025-12-09T13:57:25","date_gmt":"2025-12-09T04:57:25","guid":{"rendered":"https:\/\/rtlearner.com\/?p=1071"},"modified":"2025-12-12T10:12:33","modified_gmt":"2025-12-12T01:12:33","slug":"rtl-async-fifo-design","status":"publish","type":"post","link":"https:\/\/rtlearner.com\/en\/rtl-async-fifo-design\/","title":{"rendered":"[RTL] Asynchronous FIFO \uc124\uacc4\ud558\uae30"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\uc9c0\ub09c RTL CDC \uae00\uc744 \ud1b5\ud574 \uc6b0\ub9ac\ub294 \ub2e8\uc77c \ube44\ud2b8(1-bit) \uc2e0\ud638\ub97c \ub3d9\uae30\ud654\ud558\ub294 2-FF Synchronizer\uc640 Multi-bit \uc2e0\ud638\uc758 \uc704\ud5d8\uc131\uc5d0 \ub300\ud574 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c CDC \uc774\ub860\uc758 &#8216;\ub05d\ud310\uc655&#8217;\uc774\uc790, SoC \ubc0f FPGA \uc124\uacc4\uc5d0\uc11c \uac00\uc7a5 \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \ube14\ub85d \uc911 \ud558\ub098\uc778 Asynchronous FIFO\ub97c \uc9c1\uc811 \uc124\uacc4\ud574 \ubcfc \ucc28\ub840\uc785\ub2c8\ub2e4. \uc11c\ub85c \ub2e4\ub978 clock domain \uc0ac\uc774\uc5d0\uc11c \ub300\ub7c9\uc758 \ub370\uc774\ud130\ub97c \uc548\uc804\ud558\uac8c \ub118\uae30\uae30 \uc704\ud574 \ubc18\ub4dc\uc2dc \uac70\uccd0\uc57c \ud560 \uad00\ubb38\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc21c\ud788 \ucf54\ub4dc\ub97c \ubcf5\uc0ac\ud574\uc11c \uc4f0\ub294 \uac83\uc744 \ub118\uc5b4, <strong>&#8220;\ub3c4\ub300\uccb4 \uc65c \ud3ec\uc778\ud130\ub97c \uadf8\ub808\uc774 \ucf54\ub4dc(Gray Code)\ub85c \ubcc0\ud658\ud574\uc57c \ud558\ub294\uc9c0&#8221;<\/strong>, <strong>&#8220;Full\/Empty \ud50c\ub798\uadf8\ub294 \uc5b4\ub5a4 \uae30\uc900\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc9c0\ub294\uc9c0&#8221;<\/strong> \uadf8 \ub0b4\ubd80 \uc6d0\ub9ac\ub97c \ud30c\ud5e4\uccd0 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-contents-title{font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-content-wrap .kb-table-of-content-list{font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}@media all and (max-width: 767px){.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-contents-title{font-size:var(--global-kb-font-size-md, 1.25rem);}.kb-table-of-content-nav.kb-table-of-content-id1071_93ee5d-e6 .kb-table-of-content-wrap .kb-table-of-content-list{font-size:var(--global-kb-font-size-sm, 0.9rem);}}<\/style>\n\n<style>.kadence-column1071_c8d820-b5 > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column1071_c8d820-b5 > .kt-inside-inner-col,.kadence-column1071_c8d820-b5 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column1071_c8d820-b5 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column1071_c8d820-b5 > .kt-inside-inner-col{flex-direction:column;}.kadence-column1071_c8d820-b5 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column1071_c8d820-b5 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column1071_c8d820-b5{position:relative;}@media all and (max-width: 1024px){.kadence-column1071_c8d820-b5 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column1071_c8d820-b5 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column1071_c8d820-b5\"><div class=\"kt-inside-inner-col\">\n<p class=\"wp-block-paragraph\"><strong>\uad00\ub828 \uae00<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/verilog-cdc-metastability\/\">[RTL] \ube44\ub3d9\uae30 \uc2e0\ud638 \ucc98\ub9ac: CDC\uc640 Metastability<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/rtl-fan-in-fan-out\/\">[RTL] Fan-in\uacfc Fan-out: timing issue\uc758 \uc228\uaca8\uc9c4 \uc8fc\ubc94\uacfc \ud574\uacb0\ucc45<\/a><\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. Asynchronous FIFO\uc758 RTL \uc124\uacc4 \ub09c\uc81c<\/h2>\n\n\n<style>.kb-image1071_137fbb-83.kb-image-is-ratio-size, .kb-image1071_137fbb-83 .kb-image-is-ratio-size{max-width:430px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image1071_137fbb-83.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image1071_137fbb-83 .kb-image-is-ratio-size{align-self:unset;}.kb-image1071_137fbb-83 figure{max-width:430px;}.kb-image1071_137fbb-83 .image-is-svg, .kb-image1071_137fbb-83 .image-is-svg img{width:100%;}.kb-image1071_137fbb-83 .kb-image-has-overlay:after{opacity:0.3;}@media all and (max-width: 767px){.kb-image1071_137fbb-83.kb-image-is-ratio-size, .kb-image1071_137fbb-83 .kb-image-is-ratio-size{max-width:280px;width:100%;}.kb-image1071_137fbb-83 figure{max-width:280px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image1071_137fbb-83\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dna\/um9MV\/dJMcaiIxwhm\/AAAAAAAAAAAAAAAAAAAAAEc1ogJtdpbPjB2kEhRNdfaYhI1AWL4v_0jd8MXHsX4L\/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;expires=1767193199&amp;allow_ip=&amp;allow_referer=&amp;signature=7T5oCDC9UinTzWC7wOb%2F68VpEzQ%3D\" alt=\"\" class=\"kb-img\"\/><figcaption>Async FIFO<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">FIFO(First-In-First-Out)\uc758 \uc6d0\ub9ac\ub294 \uac04\ub2e8\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Write Pointer (wptr):<\/strong> \ub370\uc774\ud130\ub97c \uc4f8 \uc8fc\uc18c. \ub370\uc774\ud130\uac00 \ub4e4\uc5b4\uc624\uba74 1 \uc99d\uac00\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>Read Pointer (rptr):<\/strong> \ub370\uc774\ud130\ub97c \uc77d\uc744 \uc8fc\uc18c. \ub370\uc774\ud130\uac00 \ub098\uac00\uba74 1 \uc99d\uac00\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>Empty:<\/strong> <code>wptr == rptr<\/code><\/li>\n\n\n\n<li><strong>Full:<\/strong> <code>wptr<\/code>\uac00 \ud55c \ubc14\ud034\ub97c \ub3cc\uc544 <code>rptr<\/code>\ub97c \ub530\ub77c\uc7a1\uc558\uc744 \ub54c.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ub3d9\uae30\uc2dd(Synchronous) FIFO<\/strong>\uc5d0\uc11c\ub294 \ub450 \ud3ec\uc778\ud130\uac00 \uac19\uc740 \ud074\ub7ed\uc744 \uc0ac\uc6a9\ud558\ubbc0\ub85c \ube44\uad50\uac00 \uc27d\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc <strong>\ube44\ub3d9\uae30\uc2dd(Asynchronous) FIFO<\/strong>\uc5d0\uc11c\ub294 <code>Write Clock<\/code> \ub3c4\uba54\uc778\uacfc <code>Read Clock<\/code> \ub3c4\uba54\uc778\uc774 \uc11c\ub85c \ub2e4\ub985\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\ub300\ubc29\uc758 \ud3ec\uc778\ud130\ub97c \ub0b4 \ub3c4\uba54\uc778\uc73c\ub85c \uac00\uc838\uc640\uc11c \ube44\uad50\ud574\uc57c \ud558\ub294\ub370, \uc5ec\uae30\uc11c \ub450 \uac00\uc9c0 \uce58\uba85\uc801\uc778 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Metastability:<\/strong> \uc0c1\ub300\ubc29 \ud3ec\uc778\ud130\ub97c \uc0d8\ud50c\ub9c1\ud558\ub294 \uc21c\uac04 \uac12\uc774 \ubcc0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>Data Incoherency (Multi-bit Skew):<\/strong> \ud3ec\uc778\ud130\ub294 \uc5ec\ub7ec \ube44\ud2b8(Multi-bit)\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \uc774\uc9c4\uc218 <code>0111<\/code>\uc5d0\uc11c <code>1000<\/code>\uc73c\ub85c \ubcc0\ud560 \ub54c, 4\uac1c\uc758 \ube44\ud2b8\uac00 \ub3d9\uc2dc\uc5d0 \ubcc0\ud569\ub2c8\ub2e4. \ubc30\uc120 \uc9c0\uc5f0(Skew)\uc73c\ub85c \uc778\ud574 \uc218\uc2e0 \uce21\uc5d0\uc11c\ub294 \ucc30\ub098\uc758 \uc21c\uac04 <code>1111<\/code>\uc774\ub098 <code>0000<\/code> \uac19\uc740 \uc5c9\ub6b1\ud55c \uac12\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \uc5f4\uc1e0\uac00 \ubc14\ub85c \uadf8\ub808\uc774 \ucf54\ub4dc(Gray Code)\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. \ud574\uacb0\uc0ac: \uadf8\ub808\uc774 \ucf54\ub4dc (Gray Code)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub808\uc774 \ucf54\ub4dc\ub294 \uc778\uc811\ud55c \uc218\ub85c \ubcc0\ud560 \ub54c <strong>\uc624\uc9c1 \ud558\ub098\uc758 \ube44\ud2b8\ub9cc \ubcc0\ud558\ub294<\/strong> \ud2b9\uc131\uc744 \uac00\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Binary:<\/strong> <code>0111 (7)<\/code> -&gt; <code>1000 (8)<\/code> (4\ube44\ud2b8 \ubcc0\ud654 -&gt; \uc704\ud5d8!)<\/li>\n\n\n\n<li><strong>Gray:<\/strong> <code>0100 (7)<\/code> -&gt; <code>1100 (8)<\/code> (1\ube44\ud2b8 \ubcc0\ud654 -&gt; \uc548\uc804!)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9cc\uc57d Gray code\ub97c \uc0ac\uc6a9\ud558\uba74, Metastability\uc774\ub098 skew\uac00 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \uc218\uc2e0 \uce21\uc5d0\uc11c\ub294 <strong>&#8220;\uac12\uc774 \ubcc0\ud558\uae30 \uc804(7)&#8221;<\/strong> \ud639\uc740 <strong>&#8220;\uac12\uc774 \ubcc0\ud55c \ud6c4(8)&#8221;<\/strong> \ub458 \uc911 \ud558\ub098\ub85c\ub9cc \uc778\uc2dd\ub429\ub2c8\ub2e4. \uc911\uac04 \ub2e8\uacc4\uc758 \uc5c9\ub6b1\ud55c \uac12\uc774 \uc0dd\uae38 \uc218 \uc5c6\uc73c\ubbc0\ub85c \ud3ec\uc778\ud130\uac00 \ud280\ub294 \uac83\uc744 \ub9c9\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c Asynchronous FIFO \uc124\uacc4\uc758 \ub300\uc6d0\uce59\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>&#8220;\ub0b4 \ub3c4\uba54\uc778\uc758 \ud3ec\uc778\ud130\ub97c \uadf8\ub808\uc774 \ucf54\ub4dc\ub85c \ubcc0\ud658\ud558\uc5ec \uc0c1\ub300\ubc29\uc5d0\uac8c \ub118\uaca8\uc900\ub2e4.&#8221;<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">3. Full \/ Empty \uc0dd\uc131\uc758 \ube44\ubc00: \ubcf4\uc218\uc801 \uc124\uacc4 (Pessimistic Design)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CDC \uc124\uacc4\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uac1c\ub150\uc740 <strong>\ubcf4\uc218\uc801(Pessimistic) \uc124\uacc4<\/strong>\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\ub300\ubc29\uc758 \ud3ec\uc778\ud130\uac00 2-FF Synchronizer\ub97c \uac70\uccd0 \ub118\uc5b4\uc624\ub294 \ub3d9\uc548 \ucd5c\uc18c 2~3 clock\uc758 \uc9c0\uc5f0(Latency)\uc774 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc989, \ub0b4\uac00 \uc9c0\uae08 \ubcf4\uace0 \uc788\ub294 \uc0c1\ub300\ubc29\uc758 \ud3ec\uc778\ud130\ub294 &#8220;\ud604\uc7ac \uac12\uc774 \uc544\ub2c8\ub77c \uc544\uc8fc \uc870\uae08 \uc804\uc758 \uacfc\uac70 \uac12&#8221;\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">(1) Empty Generation (Read Domain)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Empty<\/code>\ub294 Read \ub3c4\uba54\uc778\uc5d0\uc11c \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\uc870\uac74: <code>rptr == synchronized_wptr<\/code><\/li>\n\n\n\n<li>Write Pointer\ub294 \uacc4\uc18d \uc99d\uac00\ud558\uace0 \uc788\ub294\ub370, \ub3d9\uae30\ud654 \uc9c0\uc5f0 \ub54c\ubb38\uc5d0 Read \ub3c4\uba54\uc778\uc5d0\uc11c\ub294 \uc544\uc9c1 \uc99d\uac00\ud558\uc9c0 \uc54a\uc740 \uac83\ucc98\ub7fc \ubcf4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uacb0\uacfc:<\/strong> \uc2e4\uc81c\ub85c\ub294 \ub370\uc774\ud130\uac00 1~2\uac1c \ub4e4\uc5b4\uc640\uc11c Empty\uac00 \ud480\ub838\ub294\ub370\ub3c4, \uc5ec\uc804\ud788 Empty\ub77c\uace0 \ud310\ub2e8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uad1c\ucc2e\uc740\uac00?<\/strong> \ub124! \ub370\uc774\ud130\uac00 \uc788\ub294\ub370 \uc5c6\ub2e4\uace0 \ud310\ub2e8\ud574\uc11c \uc77d\uae30\ub97c \uba48\ucd94\ub294 \uac83\uc740 \uc131\ub2a5(Throughput) \uc800\ud558\uc77c \ubfd0, \uae30\ub2a5 \uace0\uc7a5(Underflow)\uc740 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \uc548\uc804\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">(2) Full Generation (Write Domain)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Full<\/code>\uc740 Write \ub3c4\uba54\uc778\uc5d0\uc11c \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n\n\n\n<li>Gray Code\uc5d0\uc11c\uc758 Full \uc870\uac74\uc740 \uc870\uae08 \ubcf5\uc7a1\ud569\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li>MSB\uac00 \ub2ec\ub77c\uc57c \ud568 (\ud55c \ubc14\ud034 \ucc28\uc774)<\/li>\n\n\n\n<li>2nd MSB\ub3c4 \ub2ec\ub77c\uc57c \ud568 (Gray Code\uc758 \ub300\uce6d\uc131 \ub54c\ubb38)<\/li>\n\n\n\n<li>\ub098\uba38\uc9c0 \ube44\ud2b8\ub294 \uac19\uc544\uc57c \ud568<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Read Pointer\uac00 \uacc4\uc18d \ub370\uc774\ud130\ub97c \uc77d\uc5b4\uc11c \uacf5\uac04\uc744 \ube44\uc6b0\uace0 \uc788\ub294\ub370, \ub3d9\uae30\ud654 \uc9c0\uc5f0 \ub54c\ubb38\uc5d0 Write \ub3c4\uba54\uc778\uc5d0\uc11c\ub294 \uc544\uc9c1 \uaf49 \ucc3c\ub2e4\uace0 \ubcf4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uacb0\uacfc:<\/strong> \uc2e4\uc81c\ub85c\ub294 \uacf5\uac04\uc774 \uc0dd\uacbc\ub294\ub370 Full\uc774\ub77c\uace0 \ud310\ub2e8\ud574\uc11c \uc4f0\uae30\ub97c \uba48\ucda5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uad1c\ucc2e\uc740\uac00?<\/strong> \ub124! \ub36e\uc5b4\uc4f0\uae30(Overflow)\ub97c \ubc29\uc9c0\ud558\ub294 \uac83\uc774 \ubaa9\uc801\uc774\ubbc0\ub85c, \uc77c\ucc0d Full\uc744 \ub744\uc6b0\ub294 \uac83\uc740 \uc548\uc804\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Verilog \uad6c\ud604 (Full Source Code)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc804\uc5d0\uc11c \ubc14\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 5\uac1c\uc758 \uc804\uccb4 \ubaa8\ub4c8 \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">(1) Asynchronous FIFO Top Module<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>module async_fifo #(\n    parameter DSIZE = 8,  \/\/ Data Size\n    parameter ASIZE = 4   \/\/ Address Size (Depth = 2^4 = 16)\n)(\n    input  wire             wclk, winc, wrst_n,\n    input  wire             rclk, rinc, rrst_n,\n    input  wire &#91;DSIZE-1:0&#93; wdata,\n    output wire &#91;DSIZE-1:0&#93; rdata,\n    output wire             wfull,\n    output wire             rempty\n);\n\n    wire &#91;ASIZE-1:0&#93; waddr, raddr;\n    wire &#91;ASIZE:0&#93;   wptr, rptr, wq2_rptr, rq2_wptr;\n\n    \/\/ 1. Dual Port RAM\n    fifomem #(DSIZE, ASIZE) u_mem (\n        .wdata(wdata), .waddr(waddr), .wclk(wclk), .wclken(winc &amp; ~wfull),\n        .rdata(rdata), .raddr(raddr), .rclk(rclk), .rclken(rinc &amp; ~rempty)\n    );\n\n    \/\/ 2. Synchronizers (2-FF)\n    sync_r2w u_sync_r2w (.wclk(wclk), .wrst_n(wrst_n), .rptr(rptr), .wq2_rptr(wq2_rptr));\n    sync_w2r u_sync_w2r (.rclk(rclk), .rrst_n(rrst_n), .wptr(wptr), .rq2_wptr(rq2_wptr));\n\n    \/\/ 3. Write Control Logic (Binary -> Gray, Full Logic)\n    wptr_full #(ASIZE) u_wptr_full (\n        .wclk(wclk), .wrst_n(wrst_n), .winc(winc),\n        .wq2_rptr(wq2_rptr),\n        .wfull(wfull), .waddr(waddr), .wptr(wptr)\n    );\n\n    \/\/ 4. Read Control Logic (Binary -> Gray, Empty Logic)\n    rptr_empty #(ASIZE) u_rptr_empty (\n        .rclk(rclk), .rrst_n(rrst_n), .rinc(rinc),\n        .rq2_wptr(rq2_wptr),\n        .rempty(rempty), .raddr(raddr), .rptr(rptr)\n    );\n\nendmodule<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> async_fifo #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> DSIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8<\/span><span style=\"color: #D8DEE9FF\">,  <\/span><span style=\"color: #616E88\">\/\/ Data Size<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #616E88\">\/\/ Address Size (Depth = 2^4 = 16)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             wclk, winc, wrst_n,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             rclk, rinc, rrst_n,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;DSIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; wdata,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;DSIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; rdata,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             wfull,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             rempty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; waddr, raddr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   wptr, rptr, wq2_rptr, rq2_wptr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 1. Dual Port RAM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">fifomem<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">DSIZE, ASIZE<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_mem<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .wdata<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wdata<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .waddr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">waddr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .wclk<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wclk<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .wclken<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">winc &amp; ~wfull<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .rdata<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rdata<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .raddr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">raddr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .rclk<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rclk<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .rclken<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rinc &amp; ~rempty<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2. Synchronizers (2-FF)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">sync_r2w<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_sync_r2w<\/span><span style=\"color: #D8DEE9FF\"> (.wclk(wclk), .wrst_n(wrst_n), .rptr(rptr), .wq2_rptr(wq2_rptr))<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">sync_w2r<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_sync_w2r<\/span><span style=\"color: #D8DEE9FF\"> (.rclk(rclk), .rrst_n(rrst_n), .wptr(wptr), .rq2_wptr(rq2_wptr))<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 3. Write Control Logic (Binary -&gt; Gray, Full Logic)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wptr_full<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">ASIZE<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_wptr_full<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .wclk<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wclk<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .wrst_n<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wrst_n<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .winc<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">winc<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .wq2_rptr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wq2_rptr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .wfull<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wfull<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .waddr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">waddr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .wptr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">wptr<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 4. Read Control Logic (Binary -&gt; Gray, Empty Logic)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">rptr_empty<\/span><span style=\"color: #D8DEE9FF\"> #<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">ASIZE<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">u_rptr_empty<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .rclk<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rclk<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .rrst_n<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rrst_n<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .rinc<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rinc<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .rq2_wptr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rq2_wptr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        .rempty<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rempty<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .raddr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">raddr<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">, .rptr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rptr<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">(2) FIFO Memory (Dual Port RAM)<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>module fifomem #(\n    parameter DSIZE = 8, \/\/ Data Width\n    parameter ASIZE = 4  \/\/ Address Width\n)(\n    input  wire             wclk, wclken,\n    input  wire &#91;ASIZE-1:0&#93; waddr,\n    input  wire &#91;DSIZE-1:0&#93; wdata,\n    input  wire             rclk, rclken,\n    input  wire &#91;ASIZE-1:0&#93; raddr,\n    output wire &#91;DSIZE-1:0&#93; rdata\n);\n    \/\/ 2^ASIZE depth memory array\n    reg &#91;DSIZE-1:0&#93; mem &#91;0:(1&lt;&lt;ASIZE)-1&#93;;\n\n    \/\/ Write Logic\n    always @(posedge wclk) begin\n        if (wclken) mem&#91;waddr&#93; &lt;= wdata;\n    end\n\n    \/\/ Read Logic (No Reset needed for memory cells usually)\n    assign rdata = mem&#91;raddr&#93;;\n\nendmodule<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> fifomem #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> DSIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">8<\/span><span style=\"color: #D8DEE9FF\">, <\/span><span style=\"color: #616E88\">\/\/ Data Width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\">\/\/ Address Width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             wclk, wclken,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; waddr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;DSIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; wdata,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             rclk, rclken,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; raddr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;DSIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; rdata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2^ASIZE depth memory array<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\"> &#91;DSIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; mem &#91;<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">:(<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #81A1C1\">&lt;&lt;<\/span><span style=\"color: #D8DEE9FF\">ASIZE)<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Write Logic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> wclk) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (wclken) mem&#91;waddr&#93; <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wdata;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Read Logic (No Reset needed for memory cells usually)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> rdata <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> mem&#91;raddr&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">(3) Synchronizers (2-FF)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc548\uc804\ud55c \ud3ec\uc778\ud130 \uc804\ub2ec\uc744 \uc704\ud55c 2-stage Flip-Flop\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Read Pointer to Write Domain Synchronizer\nmodule sync_r2w #(\n    parameter ASIZE = 4\n)(\n    input  wire             wclk, wrst_n,\n    input  wire &#91;ASIZE:0&#93;   rptr,\n    output reg  &#91;ASIZE:0&#93;   wq2_rptr\n);\n    reg &#91;ASIZE:0&#93; wq1_rptr;\n\n    always @(posedge wclk or negedge wrst_n) begin\n        if (!wrst_n) begin\n            wq1_rptr &lt;= 0;\n            wq2_rptr &lt;= 0;\n        end else begin\n            wq1_rptr &lt;= rptr;\n            wq2_rptr &lt;= wq1_rptr;\n        end\n    end\nendmodule\n\n\/\/ Write Pointer to Read Domain Synchronizer\nmodule sync_w2r #(\n    parameter ASIZE = 4\n)(\n    input  wire             rclk, rrst_n,\n    input  wire &#91;ASIZE:0&#93;   wptr,\n    output reg  &#91;ASIZE:0&#93;   rq2_wptr\n);\n    reg &#91;ASIZE:0&#93; rq1_wptr;\n\n    always @(posedge rclk or negedge rrst_n) begin\n        if (!rrst_n) begin\n            rq1_wptr &lt;= 0;\n            rq2_wptr &lt;= 0;\n        end else begin\n            rq1_wptr &lt;= wptr;\n            rq2_wptr &lt;= rq1_wptr;\n        end\n    end\nendmodule<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/\/ Read Pointer to Write Domain Synchronizer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> sync_r2w #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             wclk, wrst_n,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   rptr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   wq2_rptr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; wq1_rptr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> wclk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> wrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">wrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wq1_rptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wq2_rptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wq1_rptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> rptr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wq2_rptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wq1_rptr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\">\/\/ Write Pointer to Read Domain Synchronizer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> sync_w2r #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             rclk, rrst_n,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   wptr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   rq2_wptr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; rq1_wptr;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> rclk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> rrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">rrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rq1_wptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rq2_wptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rq1_wptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wptr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rq2_wptr <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> rq1_wptr;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">(4) Read Control Logic (Empty Generation)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Binary to Gray \ubcc0\ud658\uacfc Empty \ud50c\ub798\uadf8 \uc0dd\uc131 \ub85c\uc9c1\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>module rptr_empty #(\n    parameter ASIZE = 4\n)(\n    input  wire             rclk, rrst_n, rinc,\n    input  wire &#91;ASIZE:0&#93;   rq2_wptr, \/\/ Synced Write Pointer (Gray)\n    output reg              rempty,\n    output wire &#91;ASIZE-1:0&#93; raddr,\n    output reg  &#91;ASIZE:0&#93;   rptr      \/\/ Read Pointer (Gray)\n);\n    reg  &#91;ASIZE:0&#93; rbin;\n    wire &#91;ASIZE:0&#93; rbin_next, rgray_next;\n\n    \/\/ 1. Binary Counter Update\n    \/\/ Empty\uac00 \uc544\ub2d0 \ub54c\ub9cc rinc\ub97c \ubc1b\uc544\ub4e4\uc784\n    assign rbin_next = rbin + (rinc &amp; ~rempty);\n    assign raddr     = rbin&#91;ASIZE-1:0&#93;;\n\n    \/\/ 2. Binary to Gray Conversion\n    assign rgray_next = (rbin_next >> 1) ^ rbin_next;\n\n    \/\/ 3. Empty Flag Generation\n    \/\/ \uc870\uac74: Read Pointer(Gray) == Synced Write Pointer(Gray)\n    wire rempty_val = (rgray_next == rq2_wptr);\n\n    always @(posedge rclk or negedge rrst_n) begin\n        if (!rrst_n) begin\n            rbin   &lt;= 0;\n            rptr   &lt;= 0;\n            rempty &lt;= 1; \/\/ Reset \uc0c1\ud0dc\uc5d0\uc11c\ub294 Empty\uc5ec\uc57c \ud568\n        end else begin\n            rbin   &lt;= rbin_next;\n            rptr   &lt;= rgray_next;\n            rempty &lt;= rempty_val;\n        end\n    end\nendmodule<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> rptr_empty #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             rclk, rrst_n, rinc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   rq2_wptr, <\/span><span style=\"color: #616E88\">\/\/ Synced Write Pointer (Gray)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">              rempty,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; raddr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   rptr      <\/span><span style=\"color: #616E88\">\/\/ Read Pointer (Gray)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; rbin;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; rbin_next, rgray_next;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 1. Binary Counter Update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Empty\uac00 \uc544\ub2d0 \ub54c\ub9cc rinc\ub97c \ubc1b\uc544\ub4e4\uc784<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> rbin_next <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> rbin <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> (rinc <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">~<\/span><span style=\"color: #D8DEE9FF\">rempty);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> raddr     <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> rbin&#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2. Binary to Gray Conversion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> rgray_next <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> (rbin_next <\/span><span style=\"color: #81A1C1\">&gt;&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">) ^ rbin_next;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 3. Empty Flag Generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ \uc870\uac74: Read Pointer(Gray) == Synced Write Pointer(Gray)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> rempty_val <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> (rgray_next <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> rq2_wptr);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> rclk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> rrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">rrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rbin   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rptr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rempty <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #616E88\">\/\/ Reset \uc0c1\ud0dc\uc5d0\uc11c\ub294 Empty\uc5ec\uc57c \ud568<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rbin   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> rbin_next;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rptr   <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> rgray_next;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            rempty <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> rempty_val;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">(5) Write Control Logic (Full Generation)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Binary to Gray \ubcc0\ud658\uacfc Full \ud50c\ub798\uadf8 \uc0dd\uc131 \ub85c\uc9c1\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>module wptr_full #(\n    parameter ASIZE = 4\n)(\n    input  wire             wclk, wrst_n, winc,\n    input  wire &#91;ASIZE:0&#93;   wq2_rptr, \/\/ Synced Read Pointer (Gray)\n    output reg              wfull,\n    output wire &#91;ASIZE-1:0&#93; waddr,\n    output reg  &#91;ASIZE:0&#93;   wptr      \/\/ Write Pointer (Gray)\n);\n\n    reg  &#91;ASIZE:0&#93; wbin;\n    wire &#91;ASIZE:0&#93; wbin_next, wgray_next;\n\n    \/\/ 1. Binary Counter Update\n    \/\/ Full\uc774 \uc544\ub2d0 \ub54c\ub9cc winc\ub97c \ubc1b\uc544\ub4e4\uc784\n    assign wbin_next = wbin + (winc &amp; ~wfull);\n    assign waddr     = wbin&#91;ASIZE-1:0&#93;;\n\n    \/\/ 2. Binary to Gray Conversion\n    assign wgray_next = (wbin_next >> 1) ^ wbin_next;\n\n    \/\/ 3. Full Flag Generation\n    \/\/ \uc870\uac74 (Gray Code): MSB\uc640 2nd MSB\ub294 \ub2e4\ub974\uace0, \ub098\uba38\uc9c0\ub294 \uac19\uc544\uc57c \ud568\n    wire wfull_val = (wgray_next == {~wq2_rptr&#91;ASIZE:ASIZE-1&#93;, wq2_rptr&#91;ASIZE-2:0&#93;});\n\n    always @(posedge wclk or negedge wrst_n) begin\n        if (!wrst_n) begin\n            wbin  &lt;= 0;\n            wptr  &lt;= 0;\n            wfull &lt;= 0;\n        end else begin\n            wbin  &lt;= wbin_next;\n            wptr  &lt;= wgray_next;\n            wfull &lt;= wfull_val;\n        end\n    end\nendmodule<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">module<\/span><span style=\"color: #D8DEE9FF\"> wptr_full #(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">parameter<\/span><span style=\"color: #D8DEE9FF\"> ASIZE <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">)(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\">             wclk, wrst_n, winc,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">input<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   wq2_rptr, <\/span><span style=\"color: #616E88\">\/\/ Synced Read Pointer (Gray)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">              wfull,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; waddr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">output<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;   wptr      <\/span><span style=\"color: #616E88\">\/\/ Write Pointer (Gray)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">reg<\/span><span style=\"color: #D8DEE9FF\">  &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; wbin;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> &#91;ASIZE:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93; wbin_next, wgray_next;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 1. Binary Counter Update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Full\uc774 \uc544\ub2d0 \ub54c\ub9cc winc\ub97c \ubc1b\uc544\ub4e4\uc784<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> wbin_next <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> wbin <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> (winc <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">~<\/span><span style=\"color: #D8DEE9FF\">wfull);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> waddr     <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> wbin&#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 2. Binary to Gray Conversion<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">assign<\/span><span style=\"color: #D8DEE9FF\"> wgray_next <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> (wbin_next <\/span><span style=\"color: #81A1C1\">&gt;&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">) ^ wbin_next;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ 3. Full Flag Generation<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ \uc870\uac74 (Gray Code): MSB\uc640 2nd MSB\ub294 \ub2e4\ub974\uace0, \ub098\uba38\uc9c0\ub294 \uac19\uc544\uc57c \ud568<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">wire<\/span><span style=\"color: #D8DEE9FF\"> wfull_val <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> (wgray_next <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> {<\/span><span style=\"color: #81A1C1\">~<\/span><span style=\"color: #D8DEE9FF\">wq2_rptr&#91;ASIZE:ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">&#93;, wq2_rptr&#91;ASIZE<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">2<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">&#93;});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">always<\/span><span style=\"color: #D8DEE9FF\"> @(<\/span><span style=\"color: #81A1C1\">posedge<\/span><span style=\"color: #D8DEE9FF\"> wclk <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">negedge<\/span><span style=\"color: #D8DEE9FF\"> wrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9FF\">wrst_n) <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wbin  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wptr  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wfull <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wbin  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wbin_next;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wptr  <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wgray_next;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            wfull <\/span><span style=\"color: #81A1C1\">&lt;=<\/span><span style=\"color: #D8DEE9FF\"> wfull_val;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">end<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">endmodule<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">5. \uacb0\ub860 \ubc0f \uc694\uc57d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Asynchronous FIFO\ub294 \uac89\ubcf4\uae30\uc5d4 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \ud1b5\ucc98\ub7fc \ubcf4\uc774\uc9c0\ub9cc, \uadf8 \ub0b4\ubd80\uc5d0\ub294 <strong>CDC \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud55c \uce58\ubc00\ud55c \uc804\ub7b5<\/strong>\uc774 \uc228\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Gray Code \uc0ac\uc6a9:<\/strong> Multi-bit \ud3ec\uc778\ud130\uac00 \ub3c4\uba54\uc778\uc744 \ub118\uc5b4\uac08 \ub54c \uac12\uc774 \uae68\uc9c0\ub294 \uac83(Glitch)\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ubcf4\uc218\uc801 \uc124\uacc4:<\/strong> \ub3d9\uae30\ud654 \uc9c0\uc5f0\uc73c\ub85c \uc778\ud574 Full\/Empty\uac00 \uc870\uae08 \uc77c\ucc0d \ub728\ub294 \uac83\uc740 \ud5c8\uc6a9\ud558\uc9c0\ub9cc, \ub2a6\uac8c \ub728\ub294 \uac83\uc740 \uc808\ub300 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. (Safety First)<\/li>\n\n\n\n<li><strong>2<sup>n<\/sup> Depth:<\/strong> Gray Code\uc758 \ub300\uce6d\uc131\uc744 \ud65c\uc6a9\ud558\uc5ec Full\/Empty \ub85c\uc9c1\uc744 \uac04\ub2e8\ud788 \ud558\uae30 \uc704\ud574 FIFO\uc758 \uae4a\uc774\ub294 \ubcf4\ud1b5 2\uc758 \uc2b9\uc218(16, 32, 1024 \ub4f1)\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n\n\n<style>.kadence-column1071_230f34-de > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column1071_230f34-de > .kt-inside-inner-col,.kadence-column1071_230f34-de > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column1071_230f34-de > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column1071_230f34-de > .kt-inside-inner-col{flex-direction:column;}.kadence-column1071_230f34-de > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column1071_230f34-de > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column1071_230f34-de{position:relative;}@media all and (max-width: 1024px){.kadence-column1071_230f34-de > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column1071_230f34-de > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column1071_230f34-de\"><div class=\"kt-inside-inner-col\">\n<p class=\"wp-block-paragraph\"><strong>\uad00\ub828 \uae00<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/verilog-cdc-metastability\/\">[RTL] \ube44\ub3d9\uae30 \uc2e0\ud638 \ucc98\ub9ac: CDC\uc640 Metastability<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/rtl-fan-in-fan-out\/\">[RTL] Fan-in\uacfc Fan-out: timing issue\uc758 \uc228\uaca8\uc9c4 \uc8fc\ubc94\uacfc \ud574\uacb0\ucc45<\/a><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc38\uace0: <a href=\"https:\/\/vlsiverify.com\/verilog\/verilog-codes\/asynchronous-fifo\/\" target=\"_blank\" rel=\"noopener\">VLSI verify<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last RTL CDC article, we learned about synchronizing single-bit signals\u2026<\/p>","protected":false},"author":1,"featured_media":1072,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2],"tags":[110,40,107],"class_list":["post-1071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rtl-engineer","tag-cdc","tag-verilog","tag-rtl"],"_links":{"self":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/1071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/comments?post=1071"}],"version-history":[{"count":2,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/1071\/revisions"}],"predecessor-version":[{"id":1119,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/1071\/revisions\/1119"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media\/1072"}],"wp:attachment":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media?parent=1071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/categories?post=1071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/tags?post=1071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 6a18bd42d36f73dde5c33e51. Config Timestamp: 2026-05-28 22:10:07 UTC, Cached Timestamp: 2026-06-02 18:15:44 UTC, Optimization Time: 50.95ms -->