日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记二:异步FIFO

發布時間:2024/7/5 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记二:异步FIFO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 1 module fifo1 #(parameter DSIZE = 8, 2 parameter ASIZE = 4) //用格雷碼的局限性:循環計數深度必須是2的n次冪,否則就失去了每次只變化一位的特性 3 (wclk,wrstn,wdata,wfull,winc,rclk,rrstn,rdata,rempty,rinc); 4 input wclk,wrstn,winc; 5 input [DSIZE - 1:0] wdata; 6 output wfull; 7 8 input rclk,rrstn,rinc; 9 output [DSIZE - 1:0] rdata; 10 output rempty; 11 12 reg wfull,rempty; //空滿輸出 13 reg [ASIZE:0] rbin,wbin; //讀寫二進制地址 14 reg [ASIZE:0] wptr,rq1_wptr,rq2_wptr, //讀寫指針打兩拍CDC同步 15 rptr,wq1_rptr,wq2_rptr; 16 wire [ASIZE:0] rbinnext,wbinnext, //讀寫指針遞增 17 rgraynext,wgraynext; //讀寫指針遞增對應的格雷碼 18 wire [ASIZE - 1:0] waddr,raddr; //實際讀寫mem的地址 19 20 reg [DSIZE - 1:0] mem [0:(1<<ASIZE) - 1]; //左移一位表示乘2 21 22 23 //---------------------雙口RAM存儲器 數據讀寫----------------------------- 24 assign rdata = mem[raddr]; // 25 always@(posedge wclk) begin // 26 if(winc && !wfull) begin 27 mem[waddr] <= wdata; 28 end 29 end 30 31 //---------------------將讀指針CDC到寫時鐘域------------------------------ 32 always@(posedge wclk or negedge wrstn) begin 33 if(!wrstn) begin 34 wq2_rptr <= 5'd0; 35 wq1_rptr <= 5'd0; 36 end 37 else begin 38 wq1_rptr <= rptr; 39 wq2_rptr <= wq1_rptr; 40 end 41 end 42 43 //---------------------將寫指針CDC到讀時鐘-------------------------------- 44 always@(posedge rclk or negedge rrstn) begin 45 if(!rrstn) begin 46 rq2_wptr <= 5'd0; 47 rq1_wptr <= 5'd0; 48 end 49 else begin 50 rq1_wptr <= wptr; 51 rq2_wptr <= rq1_wptr; 52 end 53 end 54 55 56 //讀相關指針的產生 57 always@(posedge rclk or negedge rrstn) begin 58 if(!rrstn) begin 59 rptr <= 5'd0; 60 rbin <= 5'd0; 61 end 62 else begin 63 rptr <= rgraynext; 64 rbin <= rbinnext; 65 end 66 end 67 //寫相關的指針 68 always@(posedge wclk or negedge wrstn) begin 69 if(!wrstn) begin 70 wbin <= 5'd0; 71 wptr <= 5'd0; 72 end 73 else begin 74 wbin <= wbinnext; 75 wptr <= wgraynext; 76 end 77 end 78 79 //addr截取與格雷碼化指針 80 assign raddr = rbin[ASIZE - 1:0]; //mem的讀地址 81 assign rbinnext = rbin + (rinc & ~rempty); //mem的下一個讀地址 82 assign rgraynext = (rbinnext>>1) ^ rbinnext; //mem的讀地址對應的格雷碼 83 84 assign waddr = wbin[ASIZE - 1:0]; 85 assign wbinnext = wbin + (winc & !wfull); 86 assign wgraynext = (wbinnext>>1) ^ wbinnext; 87 88 //---------------------rempty產生------------------------------ 89 //FIFO empty when the next rptr == synchronized wptr or on the reset 90 always@(posedge rclk or negedge rrstn) begin 91 if(!rclk) begin 92 rempty <= 1'b1; 93 else begin 94 rempty <= (rgraynext == rq2_wptr); 95 end 96 end 97 98 //---------------------wfull產生------------------------------ 99 //FIFO full when CDC過來的格雷碼(采樣值)的最高位+次高位和bin轉換過來的格雷碼(理論值)均不同,剩下低位都相同 100 always@(posedge wclk or negedge wrstn) begin 101 if(!wrstn) begin 102 wfull <= 0; 103 end 104 else begin 105 wfull <= (wgraynext == {~wq2_rptr[ASIZE,ASIZE-1],wq2_rptr[ASIZE-2:0]}); 106 end 107 end 108 109 endmodule 110 /*Clifford E. Cummings的文章中提到的STYLE #1,構造一個指針寬度為N+1,深度為2^N字節的FIFO(為便方比較將格雷碼指 111 針轉換為二進制指針)。當指針的二進制碼中最高位不一致而其它N位都 相等時,FIFO為滿(在Clifford E. Cummings的文章中以 112 格雷碼表示是前兩位均不相同,而后兩位LSB相同為滿,這與換成二進制表示的MSB不同其他相同為滿是一樣的)。當指針完全相等時, 113 FIFO為空。 114 這種方法思路非常明了,為了比較不同時鐘產生的指針,需要把不同時鐘域的信號同步到本時鐘域中來,而使用Gray碼的目的就是使這個 115 異步同步化的過程發生亞穩態的機率最小。 116 */

?

很好的講解:

https://www.cnblogs.com/aslmer/p/6114216.html#4067080

https://blog.csdn.net/wyj_2016/article/details/78469272

https://blog.csdn.net/IamSarah/article/details/76085635

https://blog.csdn.net/IamSarah/article/details/76093802

https://blog.csdn.net/tnaig/article/details/81503259

?

轉載于:https://www.cnblogs.com/ucas-ime/p/10254811.html

總結

以上是生活随笔為你收集整理的学习笔记二:异步FIFO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。