當前位置:網站首頁>RAM/FIFO學習回顧
RAM/FIFO學習回顧
2022-05-14 15:01:54【NALL_YOU】
RAM/FIFO 學習回顧
參考正點原子FPGA邏輯設計指南
&&github上某比特大佬的代碼(async_fifo)
sp_ram(單端口)
存儲用ram數組模型即可,根據深度和寬度選擇。
reg [7:0] ram [31:0] ; //ram 數據
根據使能信號賦值
always @(posedge clock ) begin
if(wen && en)
ram[address] <= data;
end
always @(posedge clock ) begin
if(( wen == 1'b0) && en)
q <= ram[address];
else
q <= 8'hx ;
end
需要一個讀寫模塊操作讀寫地址和讀寫使能信號,並在其中例化Sp_ram模塊。
仿真結果如圖所示
tp_ram(偽雙端口)
基本思路差不多,與單端口的差別是可以進行同時讀寫,也會遇到一種極端情况,讀過快,這時就需要用到一種技巧:讀穿通到寫,直接把要寫的值賦給讀。
sync_fifo(同步fifo)
同步fifo的設計關鍵是讀寫指針判斷空滿標志
fifo數據量計算
always @ (posedge clk or negedge rst) begin
if (rst == 1'b0)
count <= 0;
else begin
case({wr_en,rd_en})
2'b00:count<= count;
2'b01:
if(count!==5'b00000)
count<=count-1;
2'b10:
if(count!== max1_count)
count<=count+1;
2'b11:count<=count;
endcase
end
end
空滿標志判斷
always @(count) begin
if(count==5'b00000)
empty = 1;
else
empty = 0;
end
always @(count) begin
if (count== max_count)
full = 1;
else
full = 0;
end
同步fifo一般用於數據緩存
下圖為仿真圖
async_fifo(异步fifo)
要點:二進制轉格雷碼,格雷碼域的計數,如何用格雷碼判斷空滿標志
讀地址同步到寫時鐘域,寫地址要同步到讀時鐘域
[email protected](posedge fifo_wr_clk or negedge rst_n)
if(!rst_n)begin
sync_r2w_r1 <= 11'd0;
sync_r2w_r2 <= 11'd0;
end else begin
sync_r2w_r1 <= gray_rdaddress;
sync_r2w_r2 <= sync_r2w_r1;
end
[email protected](posedge fifo_rd_clk or negedge rst_n)
if(!rst_n)begin
sync_w2r_r1 <= 11'd0;
sync_w2r_r2 <= 11'd0;
end else begin
sync_w2r_r1 <= gray_wraddress ;
sync_w2r_r2 <= sync_w2r_r1;
end
同步過程中要用格雷碼,避免二進制的多個比特同時變化,產生競爭現象
assign gray_rdaddress = (rdaddress >>1) ^ rdaddress;//(({1'b0,rdaddress[9:1]}) ^ rdaddress);
assign gray_wraddress = (({1'b0,wraddress[10:1]}) ^ wraddress);
格雷碼如何判斷空滿。
空:讀比寫快,讀指針追上了寫指針
滿:寫比讀快,寫超越了寫指針一圈
assign fifo_empty = (gray_rdaddress == sync_w2r_r2);
assign fifo_full = (gray_wraddress == {~sync_r2w_r2[10:9],sync_r2w_r2[8:0]});
性能測試方法:分別測試讀快寫慢和讀慢寫快的兩種情况fifo的反應
fifo是有性能限制的,實際讀寫時鐘差距過多時需要通過改變深度來提高性能。深度的計算又是一門學問。
同時,异步fifo也可用於比特寬轉換,通過讀寫時鐘比來完成。
版權聲明
本文為[NALL_YOU]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/134/202205141500424006.html
邊欄推薦
猜你喜歡
隨機推薦
- 不均衡樣本集的重采樣
- uni-app技術分享| uni-app轉小程序-實時消息
- SQL中某個字段大於等於且不等於某值該如何寫
- 【Leetcode】442. 數組中重複的數據
- 2022年為什麼降薪也要跳槽?機會比漲薪很重要?
- 工作流結合動態錶單的工作流程
- 為什麼要使用.NET5?.NET5是未來!
- (pycharm)安裝nltk包
- 安裝Apache
- 利用循環輸入輸出數組(簡便易學)利用循環設置函數
- 雲原生時代的搜索服務算力管理
- 證券投資基金的監管
- ArrayList循環删除元素的常見問題及解决方法
- Stack Overflow 上最熱門的 10 個 Kotlin 問題
- 555 定時器的時間計算
- 二叉樹的最近公共祖先
- 模擬卷Leetcode【普通】931. 下降路徑最小和
- C語言 數組(一維數組 · 二維數組)
- NFC之華為AIPASS認證:測試用例簡介
- 622. 設計循環隊列
- VMware虛擬機 之 NAT模式詳解
- 【Devops】kubernetes網絡
- 新式茶飲“拿捏”年輕人,“八馬茶業”們的出路在哪?
- 機器學習之金融風控
- 1.67版本vscode括號著色(Bracket Pair Colorizer)取消
- MySQL日期查詢使用的方法函數
- HugeGraph客戶端APP開發(一)
- [.Net]使用Soa庫+Abp搭建微服務項目框架(五):服務發現和健康監測
- 添加虛擬內存,不添加硬盤的方式
- Redis源碼學習(25),雙端鏈錶學習,adlist.h
- 虛幻5新特性之EnhancedInput
- 緩存命中錶示什麼?
- sencha touch 在線實戰培訓 第一期 第四節
- “我們從 Google 離職了”
- yolov5訓練測試與源碼解讀
- 原生JS 實現輪播圖效果
- 邏輯回歸 解决報錯:ValueError: Solver lbfgs supports only ‘l2‘ or ‘none‘ penalties, got l1 penalty.
- Oracle OCI 計算、存儲、網絡工具旨在降低雲複雜性
- Go項目實戰之日志必備篇[開源十年項目第11次更新]
- Shell脚本變量和運算符