{"id":1412,"date":"2026-05-08T21:42:53","date_gmt":"2026-05-08T13:42:53","guid":{"rendered":"http:\/\/www.hanhhsir.cn\/?p=1412"},"modified":"2026-05-08T21:44:24","modified_gmt":"2026-05-08T13:44:24","slug":"%e5%9f%ba%e4%ba%8eahb%e7%9a%84%e5%9b%9b%e9%80%9a%e9%81%93dma%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1-dmac_fifo-v","status":"publish","type":"post","link":"http:\/\/www.hanhhsir.cn\/index.php\/2026\/05\/08\/%e5%9f%ba%e4%ba%8eahb%e7%9a%84%e5%9b%9b%e9%80%9a%e9%81%93dma%e6%8e%a7%e5%88%b6%e5%99%a8%e8%ae%be%e8%ae%a1-dmac_fifo-v\/","title":{"rendered":"\u57fa\u4e8eAHB\u7684\u56db\u901a\u9053DMA\u63a7\u5236\u5668\u8bbe\u8ba1-dmac_fifo.v"},"content":{"rendered":"<p><strong>dmac_fifo.v = \u529e\u516c\u5ba4\u91cc\u7684\u300c\u5355\u4e2a\u4e2d\u8f6c\u8d27\u67b6\u300d<\/strong><br \/>\n<strong>\u2022 \u7528\u6765\u4e34\u65f6\u653e\u5feb\u9012\uff0c\u9632\u6b62\u8fd0\u8f93\u592a\u5feb\u3001\u8001\u5e08\u6765\u4e0d\u53ca\u6536<\/strong><br \/>\n<strong>\u2022 \u6709\u653e\u8d27\u3001\u53d6\u8d27\u3001\u5224\u6ee1\u3001\u5224\u7a7a\u529f\u80fd<\/strong><br \/>\n<strong>\u2022 \u662fDMA\u6700\u6838\u5fc3\u7684\u7f13\u51b2\u6a21\u5757<\/strong><\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ \u6a21\u5757\uff1admac_fifo<\/strong><br \/>\n<strong>\/\/ \u529f\u80fd\uff1a\u540c\u6b65FIFO\u7f13\u5b58<\/strong><br \/>\n<strong>\/\/ \u573a\u666f\uff1a\u3010\u8001\u5e08\u529e\u516c\u5ba4\u91cc\u7684\u5355\u4e2a\u4e2d\u8f6c\u8d27\u67b6\u3011<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nmodule dmac_fifo(<br \/>\ninput clk, \/\/ \u65f6\u949f\uff1a\u5de5\u4f5c\u8282\u62cd\uff08\u6bcf\u4e00\u62cd\u52a8\u4e00\u4e0b\uff09<br \/>\ninput rst, \/\/ \u590d\u4f4d\uff1a\u6e05\u7a7a\u6574\u4e2a\u8d27\u67b6<br \/>\ninput clear, \/\/ \u624b\u52a8\u6e05\u7a7a\uff1a\u628a\u8d27\u67b6\u4e0a\u5feb\u9012\u5168\u6254\u6389<br \/>\ninput wr, \/\/ \u5199\u8bf7\u6c42\uff1a\u5f80\u8d27\u67b6\u653e\u5feb\u9012<br \/>\ninput rd, \/\/ \u8bfb\u8bf7\u6c42\uff1a\u4ece\u8d27\u67b6\u62ff\u5feb\u9012<br \/>\ninput [31:0]wdata, \/\/ \u8981\u653e\u8fdb\u53bb\u7684\u5feb\u9012\uff08\u6570\u636e\uff09<\/p>\n<p>output reg [31:0]rdata, \/\/ \u4ece\u8d27\u67b6\u62ff\u51fa\u6765\u7684\u5feb\u9012<br \/>\noutput full, \/\/ \u8d27\u67b6\u6ee1\u4e86\uff08\u4e0d\u80fd\u518d\u653e\uff09<br \/>\noutput empty \/\/ \u8d27\u67b6\u7a7a\u4e86\uff08\u6ca1\u5feb\u9012\u53ef\u62ff\uff09<br \/>\n);<\/p>\n<p>parameter n=7; \/\/ \u8d27\u67b6\u6df1\u5ea6\uff1a\u4e00\u5171\u80fd\u653e8\u4e2a\u5feb\u9012\uff080~7\uff09<\/p>\n<p>reg [31:0]mem [0:n]; \/\/ \u8d27\u67b6\u672c\u4f53\uff1a8\u4e2a\u683c\u5b50\uff0c\u6bcf\u4e2a\u653e1\u4e2a\u5feb\u9012<br \/>\nreg [9:0]wr_ptr; \/\/ \u653e\u8d27\u6307\u9488\uff1a\u6307\u5411\u4e0b\u4e00\u4e2a\u653e\u5feb\u9012\u7684\u4f4d\u7f6e<br \/>\nreg [9:0]rd_ptr; \/\/ \u53d6\u8d27\u6307\u9488\uff1a\u6307\u5411\u4e0b\u4e00\u4e2a\u62ff\u5feb\u9012\u7684\u4f4d\u7f6e<br \/>\nreg full_internal; \/\/ \u5185\u90e8\u6ee1\u6807\u5fd7<br \/>\nreg empty_internal; \/\/ \u5185\u90e8\u7a7a\u6807\u5fd7<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 1. \u653e\u8d27\u6307\u9488\uff08\u5199\u6307\u9488\uff09\u63a7\u5236<\/strong><br \/>\n<strong>\/\/ \u529f\u80fd\uff1a\u6bcf\u653e\u4e00\u4e2a\u5feb\u9012\uff0c\u6307\u9488\u6307\u5411\u4e0b\u4e00\u4e2a\u7a7a\u4f4d\u7f6e<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk or negedge rst)<br \/>\nif (!rst)<br \/>\nwr_ptr &lt;= 0; \/\/ \u590d\u4f4d\u2192\u653e\u56de0\u53f7\u4f4d\u7f6e<br \/>\nelse if (clear)<br \/>\nwr_ptr &lt;= 0; \/\/ \u6e05\u7a7a\u2192\u653e\u56de0\u53f7\u4f4d\u7f6e<br \/>\nelse if (wr) \/\/ \u6709\u6548\u653e\u8d27<br \/>\nwr_ptr &lt;= wr_ptr + 1; \/\/ \u6307\u9488+1\uff0c\u6307\u5411\u4e0b\u4e00\u683c<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 2. \u53d6\u8d27\u6307\u9488\uff08\u8bfb\u6307\u9488\uff09\u63a7\u5236<\/strong><br \/>\n<strong>\/\/ \u529f\u80fd\uff1a\u6bcf\u62ff\u4e00\u4e2a\u5feb\u9012\uff0c\u6307\u9488\u6307\u5411\u4e0b\u4e00\u4e2a\u6709\u8d27\u4f4d\u7f6e<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk or negedge rst)<br \/>\nif (!rst)<br \/>\nrd_ptr &lt;= 0;<br \/>\nelse if (clear)<br \/>\nrd_ptr &lt;= 0;<br \/>\nelse if (rd) \/\/ \u6709\u6548\u53d6\u8d27<br \/>\nrd_ptr &lt;= rd_ptr + 1; \/\/ \u6307\u9488+1<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 3. \u5f80\u8d27\u67b6\u653e\u5feb\u9012\uff08\u5199\u5185\u5b58\uff09<\/strong><br \/>\n<strong>\/\/ \u529f\u80fd\uff1awr\u6709\u6548\u65f6\uff0c\u628a\u5feb\u9012\u653e\u8fdb\u5bf9\u5e94\u683c\u5b50<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk)<br \/>\nif (wr)<br \/>\nmem[wr_ptr] &lt;= wdata;<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 4. \u4ece\u8d27\u67b6\u62ff\u5feb\u9012\uff08\u8bfb\u5185\u5b58\uff09<\/strong><br \/>\n<strong>\/\/ \u529f\u80fd\uff1ard\u6709\u6548\u65f6\uff0c\u628a\u5bf9\u5e94\u683c\u5b50\u5feb\u9012\u53d6\u51fa\u6765<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk or negedge rst)<br \/>\nif (!rst)<br \/>\nrdata &lt;= 0;<br \/>\nelse if (rd)<br \/>\nrdata &lt;= mem[rd_ptr];<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 5. \u5224\u65ad\u8d27\u67b6\u662f\u5426\u6ee1\u4e86\uff08full\uff09<\/strong><br \/>\n<strong>\/\/ \u903b\u8f91\uff1a\u653e\u8d27\u6307\u9488\u5feb\u8ffd\u4e0a\u53d6\u8d27\u6307\u9488 \u2192 \u6ee1<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk or negedge rst)<br \/>\nif (!rst)<br \/>\nfull_internal &lt;= 0;<br \/>\n\/\/ \u653e\u8d27\u3001\u4e0d\u53d6\u8d27 \u2192 \u5feb\u6ee1\u4e86<br \/>\nelse if (wr &amp;&amp; (wr_ptr+1 == rd_ptr) &amp;&amp; (~rd) || wr_ptr == n &amp;&amp; rd_ptr == 0)<br \/>\nfull_internal &lt;= 1;<br \/>\n\/\/ \u53d6\u8d27\u3001\u4e0d\u653e\u8d27 \u2192 \u4e0d\u6ee1<br \/>\nelse if (rd &amp;&amp; (~wr))<br \/>\nfull_internal &lt;= 0;<\/p>\n<p>\/\/ \u6700\u7ec8\u6ee1\u4fe1\u53f7<br \/>\nassign full = full_internal || (wr &amp;&amp; (wr_ptr+1 == rd_ptr) &amp;&amp; (~rd));<\/p>\n<p><strong>\/\/ ==============================<\/strong><br \/>\n<strong>\/\/ 6. \u5224\u65ad\u8d27\u67b6\u662f\u5426\u7a7a\u4e86\uff08empty\uff09<\/strong><br \/>\n<strong>\/\/ \u903b\u8f91\uff1a\u53d6\u8d27\u6307\u9488\u8ffd\u4e0a\u653e\u8d27\u6307\u9488 \u2192 \u7a7a<\/strong><br \/>\n<strong>\/\/ ==============================<\/strong><br \/>\nalways @(posedge clk or negedge rst)<br \/>\nif (!rst)<br \/>\nempty_internal &lt;= 1; \/\/ \u590d\u4f4d\u9ed8\u8ba4\u7a7a<br \/>\n\/\/ \u53d6\u8d27\u3001\u4e0d\u653e\u8d27 \u2192 \u7a7a<br \/>\nelse if (rd &amp;&amp; (rd_ptr+1 == wr_ptr) &amp;&amp; (~wr))<br \/>\nempty_internal &lt;= 1;<br \/>\n\/\/ \u653e\u8d27\u3001\u4e0d\u53d6\u8d27 \u2192 \u4e0d\u7a7a<br \/>\nelse if (wr &amp;&amp; (~rd))<br \/>\nempty_internal &lt;= 0;<\/p>\n<p>\/\/ \u6700\u7ec8\u7a7a\u4fe1\u53f7<br \/>\nassign empty = empty_internal || (rd &amp;&amp; (rd_ptr+1 == wr_ptr) &amp;&amp; (~wr));<\/p>\n<p>endmodule<\/p>\n<p><strong>\u573a\u666f\u5316\u603b\u7ed3\uff1a<\/strong><\/p>\n<p><strong>dmac_fifo \u5c31\u662f\u8001\u5e08\u529e\u516c\u5ba4\u91cc\u7684\u4e2d\u8f6c\u8d27\u67b6\u3002\u65e0\u4eba\u673a\u628a\u5feb\u9012\u4ece\u4e3b\u5e72\u9053\u8fd0\u56de\u6765\uff0c\u5148\u653e\u5230\u8fd9\u4e2a\u8d27\u67b6\u4e0a\u6682\u5b58\uff0c\u907f\u514d\u4e00\u4e0b\u5b50\u5806\u5230\u8001\u5e08\u684c\u4e0a\u3002\u5b83\u4f1a\u81ea\u52a8\u8bb0\u5f55\u653e\u8d27\u3001\u53d6\u8d27\u4f4d\u7f6e\uff0c\u5224\u65ad\u8d27\u67b6\u662f\u5426\u6ee1\u3001\u662f\u5426\u7a7a\uff0c\u4fdd\u8bc1\u5feb\u9012\u4e0d\u4e71\u3001\u4e0d\u4e22\u3001\u4e0d\u91cd\u590d\u62ff\u53d6\uff0c\u662fDMA\u5b9e\u73b0\u9ad8\u901f\u642c\u8fd0\u7684\u5173\u952e\u7f13\u51b2\u6a21\u5757\u3002<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>dmac_fifo.v = \u529e\u516c\u5ba4\u91cc\u7684\u300c\u5355\u4e2a\u4e2d\u8f6c\u8d27\u67b6\u300d \u2022 \u7528\u6765\u4e34\u65f6\u653e\u5feb\u9012\uff0c\u9632\u6b62\u8fd0\u8f93\u592a\u5feb\u3001\u8001\u5e08\u6765\u4e0d\u53ca\u6536 \u2022 \u6709\u653e\u8d27\u3001\u53d6\u8d27\u3001\u5224\u6ee1\u3001\u5224\u7a7a\u529f\u80fd \u2022 \u662fDMA\u6700\u6838\u5fc3\u7684\u7f13\u51b2\u6a21\u5757 \/\/ ============================== \/\/ \u6a21\u5757\uff1admac_fifo \/\/ \u529f\u80fd\uff1a\u540c\u6b65FIFO\u7f13\u5b58 \/\/ \u573a\u666f\uff1a\u3010\u8001\u5e08\u529e\u516c\u5ba4\u91cc\u7684\u5355\u4e2a\u4e2d\u8f6c\u8d27\u67b6\u3011 \/\/ ============================== module dmac_fifo( input clk, \/\/ \u65f6\u949f\uff1a\u5de5\u4f5c\u8282\u62cd\uff08\u6bcf\u4e00\u62cd\u52a8\u4e00\u4e0b\uff09 input rst, \/\/ \u590d\u4f4d\uff1a\u6e05\u7a7a\u6574\u4e2a\u8d27\u67b6 input clear, \/\/ \u624b\u52a8\u6e05\u7a7a\uff1a\u628a\u8d27\u67b6\u4e0a\u5feb\u9012\u5168\u6254\u6389 input wr, \/\/ \u5199\u8bf7\u6c42\uff1a\u5f80\u8d27\u67b6\u653e\u5feb\u9012 input rd, \/\/ \u8bfb\u8bf7\u6c42\uff1a\u4ece\u8d27\u67b6\u62ff\u5feb\u9012 input [31:0]wdata, \/\/ \u8981\u653e\u8fdb\u53bb\u7684\u5feb\u9012\uff08\u6570\u636e\uff09 output reg [31:0]rdata, \/\/ \u4ece\u8d27\u67b6\u62ff\u51fa\u6765\u7684\u5feb\u9012 output full, \/\/ \u8d27\u67b6\u6ee1\u4e86\uff08\u4e0d\u80fd\u518d\u653e\uff09 output empty \/\/ \u8d27\u67b6\u7a7a\u4e86\uff08\u6ca1\u5feb\u9012\u53ef\u62ff\uff09 ); parameter n=7; \/\/ \u8d27\u67b6\u6df1\u5ea6\uff1a\u4e00\u5171\u80fd\u653e8\u4e2a\u5feb\u9012\uff080~7\uff09 reg [31:0]mem [0:n]; \/\/ \u8d27\u67b6\u672c\u4f53\uff1a8\u4e2a\u683c\u5b50\uff0c\u6bcf\u4e2a\u653e1\u4e2a\u5feb\u9012 reg [9:0]wr_ptr; \/\/ \u653e\u8d27\u6307\u9488\uff1a\u6307\u5411\u4e0b\u4e00\u4e2a\u653e\u5feb\u9012\u7684\u4f4d\u7f6e reg [9:0]rd_ptr; \/\/ \u53d6\u8d27\u6307\u9488\uff1a\u6307\u5411\u4e0b\u4e00\u4e2a\u62ff\u5feb\u9012\u7684\u4f4d\u7f6e reg full_internal; \/\/ \u5185\u90e8\u6ee1\u6807\u5fd7 reg empty_internal; \/\/ \u5185\u90e8\u7a7a\u6807\u5fd7 \/\/ ============================== \/\/ 1. \u653e\u8d27\u6307\u9488\uff08\u5199\u6307\u9488\uff09\u63a7\u5236 \/\/ \u529f\u80fd\uff1a\u6bcf\u653e\u4e00\u4e2a\u5feb\u9012\uff0c\u6307\u9488\u6307\u5411\u4e0b\u4e00\u4e2a\u7a7a\u4f4d\u7f6e \/\/ ============================== always @(posedge clk or negedge rst) if (!rst) wr_ptr &lt;= 0; \/\/ \u590d\u4f4d\u2192\u653e\u56de0\u53f7\u4f4d\u7f6e else if (clear) wr_ptr &lt;= 0; \/\/ \u6e05\u7a7a\u2192\u653e\u56de0\u53f7\u4f4d\u7f6e else if (wr) \/\/ \u6709\u6548\u653e\u8d27 wr_ptr &lt;= wr_ptr + 1; \/\/ \u6307\u9488+1\uff0c\u6307\u5411\u4e0b\u4e00\u683c \/\/ ============================== \/\/ 2. \u53d6\u8d27\u6307\u9488\uff08\u8bfb\u6307\u9488\uff09\u63a7\u5236 \/\/ \u529f\u80fd\uff1a\u6bcf\u62ff\u4e00\u4e2a\u5feb\u9012\uff0c\u6307\u9488\u6307\u5411\u4e0b\u4e00\u4e2a\u6709\u8d27\u4f4d\u7f6e \/\/ ============================== always @(posedge clk or negedge rst) if (!rst) rd_ptr &lt;= 0; else if (clear) rd_ptr &lt;= 0; else if (rd) \/\/ \u6709\u6548\u53d6\u8d27 rd_ptr &lt;= rd_ptr + 1; \/\/ \u6307\u9488+1 \/\/ ============================== \/\/ 3. \u5f80\u8d27\u67b6\u653e\u5feb\u9012\uff08\u5199\u5185\u5b58\uff09 \/\/ \u529f\u80fd\uff1awr\u6709\u6548\u65f6\uff0c\u628a\u5feb\u9012\u653e\u8fdb\u5bf9\u5e94\u683c\u5b50 \/\/ ============================== always @(posedge clk) if (wr) mem[wr_ptr] &lt;= wdata; \/\/ ============================== \/\/ 4. \u4ece\u8d27\u67b6\u62ff\u5feb\u9012\uff08\u8bfb\u5185\u5b58\uff09 \/\/ \u529f\u80fd\uff1ard\u6709\u6548\u65f6\uff0c\u628a\u5bf9\u5e94\u683c\u5b50\u5feb\u9012\u53d6\u51fa\u6765 \/\/ ============================== always @(posedge clk or negedge rst) if (!rst) rdata &lt;= 0; else if (rd) rdata &lt;= mem[rd_ptr]; \/\/ ============================== \/\/ 5. \u5224\u65ad\u8d27\u67b6\u662f\u5426\u6ee1\u4e86\uff08full\uff09 \/\/ \u903b\u8f91\uff1a\u653e\u8d27\u6307\u9488\u5feb\u8ffd\u4e0a\u53d6\u8d27\u6307\u9488 \u2192 \u6ee1 \/\/ ============================== always @(posedge clk or negedge rst) if (!rst) full_internal &lt;= 0; \/\/ \u653e\u8d27\u3001\u4e0d\u53d6\u8d27 \u2192 \u5feb\u6ee1\u4e86 else if (wr &amp;&amp; (wr_ptr+1 == rd_ptr) &amp;&amp; (~rd) || wr_ptr == n &amp;&amp; rd_ptr == 0) full_internal &lt;= 1; \/\/ \u53d6\u8d27\u3001\u4e0d\u653e\u8d27 \u2192 \u4e0d\u6ee1 else if (rd &amp;&amp; (~wr)) full_internal &#038;lt&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1412","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1412"}],"version-history":[{"count":1,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1412\/revisions"}],"predecessor-version":[{"id":1413,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1412\/revisions\/1413"}],"wp:attachment":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1412"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}