HOME 2020/04/27

DDS(Direct Digital Synthesizer)を応用した任意サイクルの生成

FPGAに実装するタイマ回路など同期設計で任意サイクルを使用したいとき、 ベースクロックから任意サイクルのイネーブル信号を生成する回路を使います。 ここではその任意サイクルを生成するためのパラメータを計算できます。

なお本回路はベースクロック信号の精度に依存するため、 イネーブル信号の精度を完全に保証するものではありませんのでご了承ください。 てい倍はできません。

ベースクロック= Hz
クロック周波数を入力してください。
ターゲットサイクル= サイクル
ターゲットサイクル数はクロック周波数以下です。
カウンタ最大ビット幅= bit
計算するカウンタのビット幅が大きいほど精度が良くなります。
誤差が0になればそこで計算を打ち切ります。
HDL出力: VerilogHDL VHDL


解説

DDSを応用したカウンタでベースクロックから任意サイクルのイネーブル信号を生成します。 特徴はイネーブル信号が偏っていないことです。 FPGAでの同期設計のときに任意サイクル生成回路として使用します。 非同期回路じゃなくてよい場合はこういう手もあるかなと。

例えば簡単な例だと、ベースクロック50MHzでターゲットサイクルが30MHzであれば、 その比は5:3なので、パラメータはそれぞれ加算値3、最大値5となります。

以下は疑似コードです。
module dds
{
	input rst, clk;
	output enable;

	wire add = 3; // 加算値
	wire max = 5; // 最大値
	reg count;

	if(clk){
		if(rst){
			count = 0;
		}
		else if(count < max){
			count += add;
		}
		else{
			count += add - max;
			enable();
		}
	}
}

5クロックに3回enable信号がHiになります。これは簡単ですね。 あくまでイネーブル信号であり、30MHzのクロックではないことに注意してください。

違う例では、ベースクロック50MHzでターゲットサイクルが33.8688MHz(PlayStationのCPU周波数)だと、 最大公約数が3200ですね。 それぞれ最大公約数で割ると、加算値10584、最大値15625となります。 これは12bitのカウンタを使うことで誤差が0となり、最大公約数が大きいほどカウンタのビット幅が少なくて済むわけです。 (ここでの誤差とは、理想的なターゲット周波数と実際のイネーブルサイクルの差)

では最大公約数が小さい場合どうしましょうか? もちろんカウンタのbit幅を増やせば増やすほど誤差は小さくなります。 ただし、誤差は小さくしたいけど、カウンタのビット幅もできるだけ小さくしたい。 そこで適切な加算値と最大値をパラメータとして見つける必要があります。

例えばファミコンの描画プロセッサの動作周波数は5.369318MHzです。 これをベースクロック50MHzから生成するとなると、パラメータ探索結果は以下の通り。

	カウンタ 5bit  加算値=      1  最大値=       9  誤差:186237.55555555596947669983
	カウンタ 6bit  加算値=      3  最大値=      28  誤差: 12175.14285714272409677505
	カウンタ 8bit  加算値=     13  最大値=     121  誤差:  2582.82644628081470727921
	カウンタ 9bit  加算値=     16  最大値=     149  誤差:   190.48322147689759731293
	カウンタ11bit  加算値=    109  最大値=    1015  誤差:   140.12807881738990545273
	カウンタ12bit  加算値=    189  最大値=    1760  誤差:     0.18181818164885044098
	カウンタ18bit  加算値=  14002  最大値=  130389  誤差:     0.03606132417917251587
	カウンタ19bit  加算値=  16837  最大値=  156789  誤差:     0.00062504410743713379
	カウンタ20bit  加算値=  50322  最大値=  468607  誤差:     0.00005548354238271713
	カウンタ22bit  加算値= 218125  最大値= 2031217  誤差:     0.00000295415520668030
	カウンタ24bit  加算値= 822178  最大値= 7656261  誤差:     0.00000026077032089233
	カウンタ26bit  加算値=2684659  最大値=25000000  誤差:     0.00000000000000000000
結果、カウンタが26bitあれば誤差0のイネーブルサイクルが作れます。 ただ、(ベースクロック自体の誤差から見て十分小さい誤差かどうか判断して) 誤差をいくらか許容するならば、 カウンタ12bitあたりの加算値と最大値を選択することでビット幅を抑えることができます。
Copyright(C)2020 pgate1 All Rights Reserved.