【FPGA】FIFO設計

Fido はシングルとダブルに分けられ、ダブルならダブルクロックとなります。以下引用:Xiao Meige

シングルクロック FIFO:

シングルクロック FIFO は、オンチップ データのやり取りによく使用されます。たとえば、FPGA の制御下で外部センサーから読み取られた一連のセンサー データは、最初に FIFO に書き込まれ、その後、データは UART シリアル ポートのデータ転送速度で順次送信されます。センサーの 1 回のデータ読み取りは非常に高速ですが、常にデータを収集する必要はないためです。たとえば、センサーが SPI インターフェイス プロトコルを使用する場合、FPGA は 2M の SPI データ レートでセンサーから 20 個のデータを読み取り、それをボー レート 9600 でシリアル ポート経由で送信します。この処理は毎秒実行されます。2M のデータ レートはシリアル ポート 9600 のボー レートよりもはるかに高いため、最初にセンサーから収集したデータを FIFO でバッファリングしてから、シリアル ポートのデータ レートでゆっくりと送信する必要があります。ここで、センサデータの読み出しとシリアルポートデータの送信は同一クロックで同期できるため、シングルクロック構成のFIFOを使用してこの機能を実現できます。

デュアルクロックFIFO:

         デュアルクロック FIFO の一般的な用途は、非同期データの送受信です。

いわゆる非同期データとは、データの送信側と受信側がそれぞれ異なるクロック ドメインに同期していることを意味し、デュアル クロック FIFO の独立した読み出しおよび書き込みクロック構造を使用することで、異なるクロック ドメインのデータを必要なクロック ドメイン システムに同期させることができます。たとえば、高速データ収集システムでは、高速 ADC によって収集されたデータがギガビット イーサネット経由で PC に送信されます。ADC のサンプリング クロック (CLK1) は外部の専用フェーズ ロック ループ チップによって生成され、高速 ADC によってサンプリングされたデータはクロック信号と同期されます。FPGA 内部では、FPGA 動作クロック (CLK2) が独立したクロック チップとオンチップのフェーズ ロック ループによって生成される場合、CLK1 と CLK2 は 2 つ異なります。ドメイン内のクロックの周波数と位相の間には必要な関係はありません。CLK1 が 65M で CLK2 が 125M の場合、2 つのデータ レートが一致しないため、125M データを使用して 65M レートでデータを直接収集することはできません。

非同期データ送受信を実現するデュアルクロック構造のFIFO

 quartus に付属の IP コアを使用して、次のことを実現します。

FIFOはレジスタタイプです

それから設定されます

設定後、TEST.vファイルを書き込みます。

`timescale 1ns/1ps
`define wrclk_period 20
`define rdclk_period 10

module mydcfifo_tb;

//source define
	reg	[15:0]  data;
	reg	  rdclk;
	reg	  rdreq;
	reg	  wrclk;
	reg	  wrreq;


//probe define
	wire	[7:0]  q;
	wire	  rdempty;
	wire	[8:0]  rdusedw;
	wire	  wrfull;
	wire	[7:0]  wrusedw;

//instant user module
	mydcfifo mydcfifo(
		.data(data),
		.rdclk(rdclk),
		.rdreq(rdreq),
		.wrclk(wrclk),
		.wrreq(wrreq),
		.q(q),
		.rdempty(rdempty),
		.rdusedw(rdusedw),
		.wrfull(wrfull),
		.wrusedw(wrusedw)
	);

//generater clock
	initial wrclk = 1;
	always #(`wrclk_period/2)wrclk = ~wrclk;
	
	initial rdclk = 1;
	always #(`rdclk_period/2)rdclk = ~rdclk;
	
	integer i;

	initial begin
		data = 0;
		rdreq = 0;
		wrreq = 0;
		#(`wrclk_period*20 + 1);
		for (i=0;i <= 255 ;i = i + 1)begin
			wrreq = 1;
			data = i + 1024;
			#`wrclk_period;
		end
		wrreq = 0;
		#(`rdclk_period*20);
		for (i=0;i <= 511 ;i = i + 1)begin
			rdreq = 1;
			#`rdclk_period;
		end	
		rdreq = 0;
		#(`rdclk_period*20);
		$stop;	

	end

endmodule

次に、modelsim ソフトウェアをテストするように設定します

それからテストを実行します

 

こちらはデュアルコアなので、

書き込みは16ビット、周波数は20ns、

8 ビットとして読み取り、周波数は 10ns

このようにして、FIFO はクロック ドメインの同期を完了します。

書くとき:

読むとき:

このことから、次のように結論付けることができます。

準安定性を排除するFIFO同期クロック

おすすめ

転載: blog.csdn.net/qq_42792802/article/details/126964389