\u4e00\u3001\u524d\u8a00<\/strong><\/span><\/p> \n \u3000\u3000\u5e94\u8058IC\u524d\u7aef\u76f8\u5173\u5c97\u4f4d\u65f6\uff0cFIFO\u662f\u6700\u5e38\u8003\u4e5f\u662f\u6700\u57fa\u672c\u7684\u9898\u76ee\u3002FIFO\u7ecf\u5e38\u7528\u4e8e\u6570\u636e\u7f13\u5b58\u3001\u4f4d\u5bbd\u8f6c\u6362\u3001\u5f02\u6b65\u65f6\u949f\u57df\u5904\u7406\u3002\u968f\u7740\u82af\u7247\u89c4\u6a21\u7684\u5feb\u901f\u589e\u957f\uff0c\u7075\u6d3b\u7684system verilog\u6210\u4e3a\u8bbe\u8ba1\/\u9a8c\u8bc1\u4eba\u5458\u7684\u57fa\u672c\u529f\u3002\u672c\u6587\u4ece\u7b80\u6613\u7248\u7684\u540c\u6b65FIFO\u5f00\u59cb\uff0c\u719f\u6089IP\u8bbe\u8ba1\u4e0e\u9a8c\u8bc1\u7684\u57fa\u7840\u6280\u80fd\u3002<\/span><\/p> \n \u4e8c\u3001IP\u8bbe\u8ba1<\/span><\/strong><\/p> \n \u3000\u3000FIFO\u8fd9\u4e00IP\u6838\u5df2\u7ecf\u76f8\u5f53\u6210\u719f\uff0c\u56e0\u6b64\u7f51\u4e0a\u8d44\u6599\u4e5f\u662f\u4e00\u6293\u4e00\u5927\u628a\u3002\u5176\u4e2d\u7b14\u8005\u8ba4\u4e3a\u8f83\u597d\u7684\u4e00\u4e2a\u5728\u6587\u672b\u9644\u5f55\u4e2d\uff0c\u9700\u8981\u8be6\u7ec6\u4e86\u89e3FIFO\u5de5\u4f5c\u539f\u7406\u7684\u670b\u53cb\u53ef\u4ee5\u4ed4\u7ec6\u770b\u770b\u3002\u8fd9\u91cc\u7b80\u5355\u4ecb\u7ecd\u4e0b\u672c\u6587\u8bbe\u8ba1FIFO\u7684\u539f\u7406\u4e0e\u7ed3\u6784\u3002FIFO\u7684\u5185\u90e8\u5b58\u50a8\u5355\u5143\u662f\u5e38\u89c1\u7684\u53cc\u53e3RAM\uff0c\u8fd9\u4e2aIP\u7684\u7cbe\u9ad3\u5728\u4e8e\u8bfb\u5199\u5730\u5740\u7684\u5bf9\u5916\u5c4f\u853d\u4e0e\u81ea\u52a8\u7ba1\u7406\u3002\u907f\u514d\u5199\u6ee1\u3001\u8bfb\u7a7a\u81f3\u5173\u91cd\u8981\u3002<\/em><\/strong>\u672c\u6587\u8bbe\u8ba1\u7684FIFO\u9876\u5c42\u4f8b\u5316\u53cc\u53e3RAM\u548cFIFO\u63a7\u5236\u4e24\u5927\u6a21\u5757\uff1a\u524d\u8005\u4ec5\u4f5c\u4e3a\u5b58\u50a8\u5355\u5143\u54cd\u5e94\u8bfb\u5199\u4fe1\u53f7\uff0c\u540e\u8005\u6839\u636e\u8bfb\u5199\u8ba1\u6570\u5668\u4ea7\u751f\u8bfb\u5199\u6307\u9488\u548c\u91cd\u8981\u7684\u7a7a\u6ee1\u6307\u793a\u4fe1\u53f7\u3002<\/span><\/p> \n \u3000\u3000\u4ee3\u7801\u5982\u4e0b\uff1a<\/span><\/p> \n \u5b58\u50a8\u6a21\u5757\uff1a<\/span><\/p> \n FIFO\u63a7\u5236\u6a21\u5757\uff1a<\/span><\/p> \n 1<\/span> `timescale 1ns\/1ps\r\n<\/span> 2<\/span> module<\/span> dpram\r\n<\/span> 3<\/span> #(parameter<\/span> D_W=8<\/span>,\r\n<\/span> 4<\/span> A_W=8<\/span>)\r\n<\/span> 5<\/span> (\r\n<\/span> 6<\/span> input<\/span> clk,\r\n<\/span> 7<\/span> input<\/span> rst_n,\r\n<\/span> 8<\/span> \/\/<\/span>write ports<\/span>\r\n 9<\/span> input<\/span> wr_en,\r\n<\/span>10<\/span> input<\/span> [D_W-1<\/span>:0<\/span>] wr_data,\r\n<\/span>11<\/span> input<\/span> [A_W-1<\/span>:0<\/span>] wr_addr,\r\n<\/span>12<\/span> \/\/<\/span>read ports<\/span>\r\n13<\/span> input<\/span> rd_en,\r\n<\/span>14<\/span> input<\/span> [A_W-1<\/span>:0<\/span>] rd_addr,\r\n<\/span>15<\/span> output<\/span> reg<\/span> [D_W-1<\/span>:0<\/span>] rd_data\r\n<\/span>16<\/span> );\r\n<\/span>17<\/span> \/\/<\/span>RAM<\/span>\r\n18<\/span> reg<\/span> [D_W-1<\/span>:0<\/span>] memory [0<\/span>:2<\/span>**A_W-1<\/span>];\r\n<\/span>19<\/span> \r\n20<\/span> \/\/<\/span>write operation<\/span>\r\n21<\/span> always<\/span>@(posedge<\/span> clk)begin<\/span>\r\n22<\/span> if<\/span>(wr_en)begin<\/span>\r\n23<\/span> memory[wr_addr] <= wr_data;\r\n<\/span>24<\/span> end<\/span>\r\n25<\/span> end<\/span>\r\n26<\/span> \r\n27<\/span> \/\/<\/span>read operation<\/span>\r\n28<\/span> always<\/span>@(posedge<\/span> clk or<\/span> negedge<\/span> rst_n)begin<\/span>\r\n29<\/span> if<\/span>(~rst_n)\r\n<\/span>30<\/span> rd_data <= 0<\/span>;\r\n<\/span>31<\/span> else<\/span> if<\/span>(rd_en)begin<\/span>\r\n32<\/span> rd_data <= memory[rd_addr];\r\n<\/span>33<\/span> end<\/span>\r\n34<\/span> else<\/span> if<\/span>(rd_addr == 1<\/span>)\r\n<\/span>35<\/span> rd_data <= memory[0<\/span>];\r\n<\/span>36<\/span> end<\/span>\r\n37<\/span> \r\n38<\/span> endmodule<\/span><\/pre> \n <\/div> \n dpram<\/span>\n <\/div> \n
1<\/span> `timescale 1ns\/1ps\r\n<\/span> 2<\/span> module<\/span> fifo_ctrl\r\n<\/span> 3<\/span> #(parameter<\/span> A_W = 8<\/span>,\r\n<\/span> 4<\/span> parameter<\/span> [0<\/span>:0<\/span>] MODE = 0<\/span>\/\/<\/span>0- standard read 1- first word fall through<\/span>\r\n 5<\/span> )\r\n<\/span> 6<\/span> (\r\n<\/span> 7<\/span> input<\/span> clk,\r\n<\/span> 8<\/span> input<\/span> rst_n,\r\n<\/span> 9<\/span> \r\n10<\/span> output<\/span> [A_W-1<\/span>:0<\/span>] wr_addr,\r\n<\/span>11<\/span> output<\/span> [A_W-1<\/span>:0<\/span>] rd_addr,\r\n<\/span>12<\/span> \r\n13<\/span> output<\/span> empty,\r\n<\/span>14<\/span> output<\/span> full,\r\n<\/span>15<\/span> input<\/span> wr_en,\r\n<\/span>16<\/span> input<\/span> rd_en\r\n<\/span>17<\/span> );\r\n<\/span>18<\/span> localparam<\/span> MAX_CNT = 2<\/span>**A_W;\r\n<\/span>19<\/span> localparam<\/span> FD_W = A_W;\r\n<\/span>20<\/span> \r\n21<\/span> function<\/span> [FD_W-1<\/span>:0<\/span>] abs;\r\n<\/span>22<\/span> input<\/span> signed<\/span> [FD_W-1<\/span>:0<\/span>] data;\r\n<\/span>23<\/span> begin<\/span>\r\n24<\/span> assign<\/span> abs = data >= 0<\/span> ? data : -data;\r\n<\/span>25<\/span> end<\/span>\r\n26<\/span> endfunction<\/span>\r\n27<\/span> \r\n28<\/span> reg<\/span> [A_W-1<\/span>:0<\/span>] wr_cnt;\r\n<\/span>29<\/span> wire<\/span> add_wr_cnt,end_wr_cnt;\r\n<\/span>30<\/span> reg<\/span> wr_flag;\r\n<\/span>31<\/span> reg<\/span> [A_W-1<\/span>:0<\/span>] rd_cnt;\r\n<\/span>32<\/span> wire<\/span> add_rd_cnt,end_rd_cnt;\r\n<\/span>33<\/span> reg<\/span> rd_flag;\r\n<\/span>34<\/span> wire<\/span> [A_W+1<\/span>-1<\/span>:0<\/span>