當前位置:網站首頁>RAM/FIFO學習回顧

RAM/FIFO學習回顧

2022-05-14 15:01:54NALL_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

隨機推薦