在學習跨時鐘域處理的時候,有一種方法是用非同步fifo來處理跨時鐘域處理的。那麼在這之前先看看同步fifo實現。
所謂同步fifo,就是讀寫時鐘是同乙個時鐘頻率。本次實現是通過計數器的形式來實現滿空標誌。具體實現如下:
module fifo_sync(
input clk ,
input rst_n ,
input [7:0] datain , //輸入資料
input wr , //寫請求
input rd , //讀請求
output reg [7:0] dataout , //輸出資料
output empt , //空標誌
output full // 滿標誌
);//定義暫存器
reg [3:0] cnt; //計數器用於計算fifo中存放了多少資料,方便提供滿空標誌
reg [3:0] wr_ptr, rd_ptr; //讀寫指標
reg [7:0] fifo_mem [15:0]; //定義16個8位的暫存器用於存放資料,fifo管道
//定義狀態
parameter s0 = 2'b00, s1 = 2'b01, s2 = 2'b10, s3 = 2'b11;
//用一段式狀態機簡單實現fifo
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt <= 0;
wr_ptr <= 0;
rd_ptr <= 0;
dataout <= 0;
endelse begin
case ()
s0 : begin //空閒
cnt <= cnt;
wr_ptr <= wr_ptr;
rd_ptr <= rd_ptr;
dataout <= 0;
ends1 : begin //寫fiof
if(!full) begin
fifo_mem[wr_ptr] <= datain;
wr_ptr <= wr_ptr + 1'b1;
rd_ptr <= rd_ptr;
cnt <= cnt + 1'b1;
dataout <= 0;
endend
s2 : begin //讀fifo
if(!empt) begin
dataout <= fifo_mem[rd_ptr];
rd_ptr <= rd_ptr + 1'b1;
wr_ptr <= wr_ptr;
cnt <= cnt - 1'b1;
end
end
s3 : begin //同時讀寫fifo
if(!full) begin
fifo_mem[wr_ptr] <= datain;
wr_ptr <= wr_ptr + 1'b1;
end
if(!empt) begin
dataout <= fifo_mem[rd_ptr];
rd_ptr <= rd_ptr + 1'b1;
end
end
default : ;
endcase
endend
//滿空標誌訊號產生
assign full = (cnt == 4'd15);
assign empt = (cnt == 4'd0 );
endmodule
簡單的測試:
`timescale 1ns/1ns
module fifo_sync_tb();
reg clk;
reg rst_n;
reg [7:0] datain;
reg wr, rd;
wire [7:0] dataout;
wire empt;
wire full;
initial begin
clk = 1'b1;
rst_n = 1'b0;
datain = 0;
wr = 1'b0;
rd = 1'b0;
#50rst_n = 1'b1;
#40wr = 1'b1;
#20
rd = 1'b1;
#20rd = 1'b0;
#170
wr = 1'b0;
#200
rd = 1'b1;
#40rd = 1'b0;
#500
$stop;
end
always #5 clk = ~clk;
always @(posedge clk) begin
datain <= datain + 1'b1;
end
fifo_sync fifo(
.clk (clk ),
.rst_n (rst_n ),
.datain (datain ), //輸入資料
.wr (wr ), //寫請求
.rd (rd ), //讀請求
.dataout (dataout ), //輸出資料
.empt (empt ), //空標誌
.full (full ) // 滿標誌
);endmodule
非同步fifo 跨時鐘域同步(非同步FIFO)
本文使用 zhihu on vscode 創作並發布 之前學習了跨時鐘域下的單bit訊號同步的方法,這些單bit訊號多是作為控制訊號或者標誌訊號來使用,再實際的專案中,處理多bit資料也是十分常見的,即資料的同步。非同步fifo的實現其實本質上和雙口ram是一樣的,其實現思路就是將資料在src cl...
fifo的rdata 同步FIFO設計
我們常見的同步fifo一般都是固定位寬輸入,固定位寬輸出的,因此他們之間的關係一般來說都是固定的,比較容易理解,網上也有很多類似的 去指導怎麼編寫,在此不再贅述。如果突發奇想,新增乙個選通訊號wstrb呢?那麼這個世界是不是就不太一樣了呀 假設題目如下 編寫 實現如下的同步fifo功能,示意圖如下 ...
同步fifo的串並 同步fifo設計
1.同步fifo的功能點 當fifo寫滿的時候,輸出滿標誌.當fifo讀空的時候,輸出空標誌.寫滿之後不能繼續寫,即有滿標誌,禁止向ram寫入資料,防止資料混亂.讀空之後不能繼續讀,讀完所有資料,禁止重複讀.對於空滿標誌的判斷,設計的思想是,當讀指標等於寫指標加1,且同時有乙個寫使能,這樣,就認為f...