{"id":1390,"date":"2026-05-08T13:37:41","date_gmt":"2026-05-08T05:37:41","guid":{"rendered":"http:\/\/www.hanhhsir.cn\/?p=1390"},"modified":"2026-05-08T21:36:20","modified_gmt":"2026-05-08T13:36:20","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-ahb%e6%80%bb%e7%ba%bf%e6%8e%a7%e5%88%b6%e5%99%a8","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-ahb%e6%80%bb%e7%ba%bf%e6%8e%a7%e5%88%b6%e5%99%a8\/","title":{"rendered":"\u57fa\u4e8eAHB\u7684\u56db\u901a\u9053DMA\u63a7\u5236\u5668\u8bbe\u8ba1-dmac_ahb_ctrl.v"},"content":{"rendered":"<p><span style=\"font-family: 'times new roman', times, serif;\"><strong>\u8001\u5e08=CPU\uff0cDMA=\u5168\u80fd\u52a9\u7406\uff0c\u65e0\u4eba\u673a=\u8fd0\u8f93\u5de5\u5177\uff0cAHB=\u4e3b\u5e72\u9053\uff0cAHB\u63a7\u5236\u5668=\u9053\u8def\u7ba1\u7406\u5458\uff0cFIFO=\u529e\u516c\u5ba4\u4e2d\u8f6c\u8d27\u67b6<\/strong><\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u672c\u6a21\u5757\uff1aDMA\u7684AHB\u4e3b\u63a7\u5236\u5668 \u2014\u2014 \u3010\u9053\u8def\u7ba1\u7406\u5458\u3011<\/span><\/strong><br \/>\n<strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u4f5c\u7528\uff1a\u6309\u7167AHB\u4e3b\u5e72\u9053\u89c4\u5219\uff0c\u5e2eDMA\u52a9\u7406\u6536\u53d1\u5feb\u9012\uff08\u6570\u636e\uff09<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">`timescale 1ns \/ 10ps<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-family: 'times new roman', times, serif;\">module dmac_ahb_ctrl(<\/span><br \/>\n<strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u7cfb\u7edf\u65f6\u949f\u4e0e\u590d\u4f4d \u2014\u2014 \u9053\u8def\u8282\u62cd\u3001\u7cfb\u7edf\u91cd\u542f<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input clk, \/\/ \u65f6\u949f\uff1a\u9053\u8def\u6bcf\u4e00\u62cd\u8d70\u4e00\u6b65<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input rst, \/\/ \u590d\u4f4d\uff1a\u6e05\u7a7a\u4efb\u52a1\uff0c\u91cd\u65b0\u5f00\u59cb<\/span><\/p>\n<p style=\"padding-left: 40px;\"><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u6765\u81eaDMA\u52a9\u7406\u7684\u547d\u4ee4 \u2014\u2014 \u52a9\u7406\u8ba9\u9053\u8def\u7ba1\u7406\u5458\u5e72\u6d3b<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input wr, \/\/ \u5199\u8bf7\u6c42\uff1a\u9001\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input rd, \/\/ \u8bfb\u8bf7\u6c42\uff1a\u53d6\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input [31:0]addr, \/\/ \u5730\u5740\uff1a\u5feb\u9012\u70b9\/\u76ee\u7684\u5730\u5730\u5740<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input [31:0]wdata, \/\/ \u5199\u6570\u636e\uff1a\u8981\u9001\u51fa\u53bb\u7684\u5feb\u9012<\/span><\/p>\n<p style=\"padding-left: 40px;\"><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u9001\u56de\u7ed9DMA\u52a9\u7406\u7684\u7ed3\u679c \u2014\u2014 \u544a\u8bc9\u52a9\u7406\u53d6\u5230\u5feb\u9012\u4e86<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output [31:0]rdata, \/\/ \u8bfb\u5230\u7684\u6570\u636e\uff1a\u53d6\u56de\u6765\u7684\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output rd_en, \/\/ \u8bfb\u6709\u6548\uff1a\u5feb\u9012\u5df2\u5230\u624b\uff0c\u53ef\u4ee5\u62ff\u8d70<\/span><\/p>\n<p style=\"padding-left: 40px;\"><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ AHB \u4e3b\u5e72\u9053\u5916\u90e8\u4fe1\u53f7 \u2014\u2014 \u9053\u8def\u89c4\u5219\u4fe1\u53f7<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output hsel, \/\/ \u9009\u4e2d\u4ece\u8bbe\u5907\uff1a\u627e\u5230\u76ee\u6807\u5feb\u9012\u70b9<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output [1:0]htrans, \/\/ \u4f20\u8f93\u7c7b\u578b\uff1a\u5f00\u59cb\u4e00\u6b21\u65b0\u8fd0\u8f93<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output [2:0]hsize, \/\/ \u6570\u636e\u4f4d\u5bbd\uff1a\u4e00\u6b21\u8fd0\u591a\u5927\u5305\u88f9\uff0832\u4f4d\uff09<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output hwrite, \/\/ \u8bfb\u5199\u65b9\u5411\uff1a1=\u9001\u5feb\u9012\uff0c0=\u53d6\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output [31:0]haddr, \/\/ AHB\u603b\u7ebf\u4e0a\u7684\u5730\u5740\uff1a\u62a5\u4f4d\u7f6e<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">output reg [31:0]hwdata, \/\/ AHB\u5199\u6570\u636e\uff1a\u653e\u5230\u4e3b\u5e72\u9053\u4e0a\u7684\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input hreadyin, \/\/ \u4ece\u8bbe\u5907\u5c31\u7eea\uff1a\u5bf9\u65b9\u51c6\u5907\u597d\u4e86\uff0c\u53ef\u4ee5\u4ea4\u63a5<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input hresp, \/\/ \u54cd\u5e94\uff1a\u8fd0\u8f93\u662f\u5426\u51fa\u9519<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">input [31:0]hrdata \/\/ \u8bfb\u56de\u6570\u636e\uff1a\u4ece\u4e3b\u5e72\u9053\u62ff\u5230\u7684\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">);<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u9053\u8def\u7ba1\u7406\u5458\u76843\u79cd\u5de5\u4f5c\u72b6\u6001<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">parameter IDLE = 3&#8217;b001; \/\/ \u7a7a\u95f2\uff1a\u6ca1\u4e8b\u5e72\uff0c\u5f85\u547d<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">parameter S0 = 3&#8217;b010; \/\/ \u5730\u5740\u9636\u6bb5\uff1a\u62a5\u5730\u5740\u3001\u62a5\u4efb\u52a1<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">parameter S1 = 3&#8217;b100; \/\/ \u6570\u636e\u9636\u6bb5\uff1a\u771f\u6b63\u642c\u5feb\u9012<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u5185\u90e8\u5bc4\u5b58\u5668\uff1a\u7528\u6765\u6682\u5b58\u5730\u5740\u3001\u6570\u636e\u3001\u5ef6\u65f6\u6253\u62cd\uff08\u4fdd\u8bc1\u6d41\u6c34\u7ebf\u5bf9\u9f50\uff09<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg [31:0] addr_d; \/\/ \u6682\u5b58\u76ee\u6807\u5730\u5740<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg [31:0] data_1d; \/\/ \u6682\u5b58\u8981\u9001\u7684\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg wr_d ; \/\/ \u5199\u8bf7\u6c42\u5ef6\u65f61\u62cd<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg wr_2d; \/\/ \u5199\u8bf7\u6c42\u5ef6\u65f62\u62cd<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg rd_d ; \/\/ \u8bfb\u8bf7\u6c42\u5ef6\u65f61\u62cd<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg rd_2d; \/\/ \u8bfb\u8bf7\u6c42\u5ef6\u65f62\u62cd<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg [2:0] c_state; \/\/ \u5f53\u524d\u72b6\u6001<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">reg [2:0] n_state; \/\/ \u4e0b\u4e00\u4e2a\u72b6\u6001<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u72b6\u6001\u673a\u7b2c\u4e00\u6bb5\uff1a\u65f6\u5e8f\u66f4\u65b0 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u6bcf\u6765\u4e00\u4e2a\u65f6\u949f\u8282\u62cd\uff0c\u66f4\u65b0\u5f53\u524d\u72b6\u6001<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always @(posedge clk or negedge rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if(!rst)<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c_state &lt;= IDLE; \/\/ \u590d\u4f4d\u2192\u7a7a\u95f2<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c_state &lt;= n_state; \/\/ \u5426\u5219\u8d70\u5230\u4e0b\u4e00\u6b65<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u72b6\u6001\u673a\u7b2c\u4e8c\u6bb5\uff1a\u7ec4\u5408\u903b\u8f91\u5224\u65ad\u4e0b\u4e00\u6b65 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u9053\u8def\u7ba1\u7406\u5458\u6839\u636e\u5f53\u524d\u72b6\u6001\uff0c\u51b3\u5b9a\u4e0b\u4e00\u6b65\u505a\u4ec0\u4e48<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always @(*) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 case (c_state)<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 IDLE : begin<strong> \/\/ \u7a7a\u95f2<\/strong><\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(wr||rd) \/\/ \u52a9\u7406\u6d3e\u4efb\u52a1\uff1a\u9001\/\u53d6\u5feb\u9012<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0n_state = S0; \/\/ \u2192 \u8fdb\u5165\u5730\u5740\u5468\u671f<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0else<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0n_state = IDLE; \/\/ \u6ca1\u4efb\u52a1\uff0c\u7ee7\u7eed\u4f11\u606f<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0S0 : begin <strong>\/\/ \u5730\u5740\u5468\u671f\uff1a\u62a5\u5b8c\u5730\u5740\u7acb\u523b\u8fdb\u6570\u636e\u5468\u671f<\/strong><\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n_state = S1;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0S1 :begin<strong> \/\/ \u6570\u636e\u5468\u671f\uff1a\u7b49\u5bf9\u65b9\u5c31\u7eea<\/strong><\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if(hreadyin==1&#8217;b1 &amp;&amp; (wr||rd)) \/\/ \u5bf9\u65b9\u5c31\u7eea+\u8fd8\u6709\u4efb\u52a1<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n_state = S0; \/\/ \u8fde\u7eed\u8fd0\u8f93<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else if(hreadyin==1&#8217;b1) \/\/ \u5bf9\u65b9\u5c31\u7eea+\u6ca1\u4efb\u52a1<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n_state = IDLE; \/\/ \u7ed3\u675f\uff0c\u56de\u5bb6<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n_state = S1; \/\/ \u7ee7\u7eed\u7b49\u5f85<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0default: n_state = IDLE ;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 endcase<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u8bf7\u6c42\u4fe1\u53f7\u5ef6\u65f6\u6253\u62cd\uff08AHB\u6d41\u6c34\u7ebf\u5fc5\u987b\uff09 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u8ba9\u8bf7\u6c42\u4fe1\u53f7\u5ef6\u65f61~2\u62cd\uff0c\u548c\u5730\u5740\u3001\u6570\u636e\u5bf9\u9f50\uff0c\u4e0d\u8dd1\u98de<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always@(posedge clk or negedge rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (!rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0wr_d &lt;= 1&#8217;b0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0wr_2d &lt;= 1&#8217;b0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rd_d &lt;= 1&#8217;b0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rd_2d&lt;= 1&#8217;b0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end else begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0wr_d &lt;= wr;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rd_d &lt;= rd;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0wr_2d &lt;=wr_d;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rd_2d&lt;= rd_d;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p style=\"text-align: left;\"><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u9501\u5b58\u5730\u5740\uff1a\u8bb0\u4f4f\u8981\u53bb\u54ea\u4e2a\u5feb\u9012\u70b9 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always@(posedge clk or negedge rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if(!rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 addr_d&lt;=32&#8217;h0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end else if(wr || rd) begin \/\/ \u6709\u4efb\u52a1\u65f6\uff0c\u628a\u5730\u5740\u8bb0\u4e0b\u6765<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ddr_d&lt;=addr;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 end<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u9501\u5b58\u8981\u9001\u7684\u5feb\u9012 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always@(posedge clk or negedge rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(!rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data_1d&lt;=32&#8217;h0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end else if(wr) begin \/\/ \u9001\u5feb\u9012\u65f6\uff0c\u5148\u628a\u5feb\u9012\u5b58\u597d<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data_1d&lt;=wdata;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u4ea7\u751fAHB\u63a7\u5236\u4fe1\u53f7 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u9009\u4e2d\u8bbe\u5907\uff1a\u627e\u5230\u5feb\u9012\u70b9<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign hsel = (c_state==S0)||(c_state==S1 &amp;&amp;(wr_d || rd_d)) ;<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u4f20\u8f93\u7c7b\u578b\uff1aNONSEQ\uff08\u5f00\u59cb\u4e00\u6b21\u65b0\u8fd0\u8f93\uff09<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign htrans = ( hsel == 1&#8217;b1 )? 2&#8217;h2:2&#8217;h0;<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u6570\u636e\u4f4d\u5bbd\uff1a32\u4f4d\uff08\u6807\u51c6\u5feb\u9012\u5927\u5c0f\uff09<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign hsize = ( hsel == 1&#8217;b1 )? 3&#8217;h2:3&#8217;h0;<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u8bfb\u5199\u65b9\u5411\uff1a\u9001\u5feb\u9012=1\uff0c\u53d6\u5feb\u9012=0<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign hwrite =wr_d ;<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u8f93\u51fa\u5730\u5740\u5230\u4e3b\u5e72\u9053<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign haddr = ( hsel == 1&#8217;b1 )?addr_d:32&#8217;h0;<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u5f80\u4e3b\u5e72\u9053\u653e\u8981\u9001\u7684\u5feb\u9012 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">always@(posedge clk or negedge rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(!rst) begin<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 hwdata&lt;=32&#8217;h0;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0end else if(hsel) begin \/\/ \u9009\u4e2d\u76ee\u6807\u540e\uff0c\u628a\u5feb\u9012\u653e\u8def\u4e0a<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 hwdata&lt;=data_1d;<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0end<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">end<\/span><\/p>\n<p><strong><span style=\"font-family: 'times new roman', times, serif;\">\/\/ ====================== \u8bfb\u6709\u6548\u4fe1\u53f7\uff1a\u5feb\u9012\u53d6\u5230\u4e86\uff01 ======================<\/span><\/strong><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u6761\u4ef6\uff1a\u6570\u636e\u5468\u671f + \u5bf9\u65b9\u5c31\u7eea + \u662f\u53d6\u5feb\u9012\u4efb\u52a1<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign rd_en = c_state == S1 &amp;&amp; hreadyin==1&#8217;b1&amp;&amp; (rd_2d);<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">\/\/ \u628a\u53d6\u5230\u7684\u5feb\u9012\u4ea4\u7ed9DMA\u52a9\u7406<\/span><br \/>\n<span style=\"font-family: 'times new roman', times, serif;\">assign rdata = (rd_en == 1&#8217;b1 ) ? hrdata : 32&#8217;h0;<\/span><\/p>\n<p><span style=\"font-family: 'times new roman', times, serif;\">endmodule<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8001\u5e08=CPU\uff0cDMA=\u5168\u80fd\u52a9\u7406\uff0c\u65e0\u4eba\u673a=\u8fd0\u8f93\u5de5\u5177\uff0cAHB=\u4e3b\u5e72\u9053\uff0cAHB\u63a7\u5236\u5668=\u9053\u8def\u7ba1\u7406\u5458\uff0cFIFO=\u529e\u516c\u5ba4\u4e2d\u8f6c\u8d27\u67b6 \/\/ \u672c\u6a21\u5757\uff1aDMA\u7684AHB\u4e3b\u63a7\u5236\u5668 \u2014\u2014 \u3010\u9053\u8def\u7ba1\u7406\u5458\u3011 \/\/ \u4f5c\u7528\uff1a\u6309\u7167AHB\u4e3b\u5e72\u9053\u89c4\u5219\uff0c\u5e2eDMA\u52a9\u7406\u6536\u53d1\u5feb\u9012\uff08\u6570\u636e\uff09 `timescale 1ns \/ 10ps module dmac_ahb_ctrl( \/\/ \u7cfb\u7edf\u65f6\u949f\u4e0e\u590d\u4f4d \u2014\u2014 \u9053\u8def\u8282\u62cd\u3001\u7cfb\u7edf\u91cd\u542f input clk, \/\/ \u65f6\u949f\uff1a\u9053\u8def\u6bcf\u4e00\u62cd\u8d70\u4e00\u6b65 input rst, \/\/ \u590d\u4f4d\uff1a\u6e05\u7a7a\u4efb\u52a1\uff0c\u91cd\u65b0\u5f00\u59cb \/\/ \u6765\u81eaDMA\u52a9\u7406\u7684\u547d\u4ee4 \u2014\u2014 \u52a9\u7406\u8ba9\u9053\u8def\u7ba1\u7406\u5458\u5e72\u6d3b input wr, \/\/ \u5199\u8bf7\u6c42\uff1a\u9001\u5feb\u9012 input rd, \/\/ \u8bfb\u8bf7\u6c42\uff1a\u53d6\u5feb\u9012 input [31:0]addr, \/\/ \u5730\u5740\uff1a\u5feb\u9012\u70b9\/\u76ee\u7684\u5730\u5730\u5740 input [31:0]wdata, \/\/ \u5199\u6570\u636e\uff1a\u8981\u9001\u51fa\u53bb\u7684\u5feb\u9012 \/\/ \u9001\u56de\u7ed9DMA\u52a9\u7406\u7684\u7ed3\u679c \u2014\u2014 \u544a\u8bc9\u52a9\u7406\u53d6\u5230\u5feb\u9012\u4e86 output [31:0]rdata, \/\/ \u8bfb\u5230\u7684\u6570\u636e\uff1a\u53d6\u56de\u6765\u7684\u5feb\u9012 output rd_en, \/\/ \u8bfb\u6709\u6548\uff1a\u5feb\u9012\u5df2\u5230\u624b\uff0c\u53ef\u4ee5\u62ff\u8d70 \/\/ AHB \u4e3b\u5e72\u9053\u5916\u90e8\u4fe1\u53f7 \u2014\u2014 \u9053\u8def\u89c4\u5219\u4fe1\u53f7 output hsel, \/\/ \u9009\u4e2d\u4ece\u8bbe\u5907\uff1a\u627e\u5230\u76ee\u6807\u5feb\u9012\u70b9 output [1:0]htrans, \/\/ \u4f20\u8f93\u7c7b\u578b\uff1a\u5f00\u59cb\u4e00\u6b21\u65b0\u8fd0\u8f93 output [2:0]hsize, \/\/ \u6570\u636e\u4f4d\u5bbd\uff1a\u4e00\u6b21\u8fd0\u591a\u5927\u5305\u88f9\uff0832\u4f4d\uff09 output hwrite, \/\/ \u8bfb\u5199\u65b9\u5411\uff1a1=\u9001\u5feb\u9012\uff0c0=\u53d6\u5feb\u9012 output [31:0]haddr, \/\/ AHB\u603b\u7ebf\u4e0a\u7684\u5730\u5740\uff1a\u62a5\u4f4d\u7f6e output reg [31:0]hwdata, \/\/ AHB\u5199\u6570\u636e\uff1a\u653e\u5230\u4e3b\u5e72\u9053\u4e0a\u7684\u5feb\u9012 input hreadyin, \/\/ \u4ece\u8bbe\u5907\u5c31\u7eea\uff1a\u5bf9\u65b9\u51c6\u5907\u597d\u4e86\uff0c\u53ef\u4ee5\u4ea4\u63a5 input hresp, \/\/ \u54cd\u5e94\uff1a\u8fd0\u8f93\u662f\u5426\u51fa\u9519 input [31:0]hrdata \/\/ \u8bfb\u56de\u6570\u636e\uff1a\u4ece\u4e3b\u5e72\u9053\u62ff\u5230\u7684\u5feb\u9012 ); \/\/ \u9053\u8def\u7ba1\u7406\u5458\u76843\u79cd\u5de5\u4f5c\u72b6\u6001 parameter IDLE = 3&#8217;b001; \/\/ \u7a7a\u95f2\uff1a\u6ca1\u4e8b\u5e72\uff0c\u5f85\u547d parameter S0 = 3&#8217;b010; \/\/ \u5730\u5740\u9636\u6bb5\uff1a\u62a5\u5730\u5740\u3001\u62a5\u4efb\u52a1 parameter S1 = 3&#8217;b100; \/\/ \u6570\u636e\u9636\u6bb5\uff1a\u771f\u6b63\u642c\u5feb\u9012 \/\/ \u5185\u90e8\u5bc4\u5b58\u5668\uff1a\u7528\u6765\u6682\u5b58\u5730\u5740\u3001\u6570\u636e\u3001\u5ef6\u65f6\u6253\u62cd\uff08\u4fdd\u8bc1\u6d41\u6c34\u7ebf\u5bf9\u9f50\uff09 reg [31:0] addr_d; \/\/ \u6682\u5b58\u76ee\u6807\u5730\u5740 reg [31:0] data_1d; \/\/ \u6682\u5b58\u8981\u9001\u7684\u5feb\u9012 reg wr_d ; \/\/ \u5199\u8bf7\u6c42\u5ef6\u65f61\u62cd reg wr_2d; \/\/ \u5199\u8bf7\u6c42\u5ef6\u65f62\u62cd reg rd_d ; \/\/ \u8bfb\u8bf7\u6c42\u5ef6\u65f61\u62cd reg rd_2d; \/\/ \u8bfb\u8bf7\u6c42\u5ef6\u65f62\u62cd reg [2:0] c_state; \/\/ \u5f53\u524d\u72b6\u6001 reg [2:0] n_state; \/\/ \u4e0b\u4e00\u4e2a\u72b6\u6001 \/\/ ====================== \u72b6\u6001\u673a\u7b2c\u4e00\u6bb5\uff1a\u65f6\u5e8f\u66f4\u65b0 ====================== \/\/ \u6bcf\u6765\u4e00\u4e2a\u65f6\u949f\u8282\u62cd\uff0c\u66f4\u65b0\u5f53\u524d\u72b6\u6001 always @(posedge clk or negedge rst) begin \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if(!rst) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c_state &lt;= IDLE; \/\/ \u590d\u4f4d\u2192\u7a7a\u95f2 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 c_state &lt;= n_state; \/\/ \u5426\u5219\u8d70\u5230\u4e0b\u4e00\u6b65 end \/\/ ====================== \u72b6\u6001\u673a\u7b2c\u4e8c\u6bb5\uff1a\u7ec4\u5408\u903b\u8f91\u5224\u65ad\u4e0b\u4e00\u6b65 ====================== \/\/ \u9053\u8def\u7ba1\u7406\u5458\u6839\u636e\u5f53\u524d\u72b6\u6001\uff0c\u51b3\u5b9a\u4e0b\u4e00\u6b65\u505a\u4ec0\u4e48 always @(*) begin \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 case (c_state) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 IDLE : begin \/\/ \u7a7a\u95f2 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(wr||rd) \/\/ \u52a9\u7406\u6d3e\u4efb\u52a1\uff1a\u9001\/\u53d6\u5feb\u9012 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0n_state = S0; \/\/ \u2192 \u8fdb\u5165\u5730\u5740\u5468\u671f \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0else \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0n_state = IDLE; \/\/ \u6ca1\u4efb\u52a1\uff0c\u7ee7\u7eed\u4f11\u606f \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0S0 : begin \/\/ \u5730\u5740\u5468\u671f\uff1a\u62a5\u5b8c\u5730\u5740\u7acb\u523b\u8fdb\u6570\u636e\u5468\u671f \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 n_state = S1; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#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-1390","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1390","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=1390"}],"version-history":[{"count":6,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1390\/revisions"}],"predecessor-version":[{"id":1409,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/posts\/1390\/revisions\/1409"}],"wp:attachment":[{"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1390"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hanhhsir.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}