非同步fifo 同步FIFO設計實現

2021-10-12 17:14:52 字數 2780 閱讀 6038

在學習跨時鐘域處理的時候,有一種方法是用非同步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...