フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2008-9-24 9:10 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3088 |
周波数カウント動作は出来た どうやらPRESET時の初期値が0以外だとおかしなカウンタ論理になるらしいことが判明。とりあえず原理動作確認のために初期値はall0として、プリスケーラーが間違って分周しすぎていたのを修正して動作シミュレーションをやり直してみた。結果、与えていた2.9999MHz+45.5kHz=3.0454MHzがちゃんとカウント出来たヽ(´ー`)ノ
あとは初期値が0以外にした場合をやってみよう。初期値も当初間違えていて、455を足したら0になるBCD値でないといけないのをバイナリで計算していた。本来は100000-455=99545を与えないといけなかった。 なんとちゃんと正しく中間周波数分を差し引いた値(30454-455=29999)がカウントされるじゃないか。 結局、 ・プリスケーラー値を間違えていた ・カウンタ初期値をBCDでなくバイナリ値で与えていた のが原因だった..orz 自爆とはこのこと。 しかし今度のQuartusはPlace & Routeでかなりすごい最適化をするようになってシミュレーターの値を見ると意図したのとは全然違うのでバグではないかと誤解してしまう。外部から見た挙動は同じだが内部論理と挙動がまるで違っている。 今回の場合は、初期値に99545を指定すると、最後に出力ラッチする際にカウンタ値と初期値に対応したBCD値で排他的論理和を取っている。 すなわち初期値が9の桁のBCDカウンタはデザイン上では以下の様に変化することを意図していた 9->0->1->2->3->4->5->6->7->8->9->0 Quartusの最適化によってカウンタは初期値によらず常に0から開始し、以降指定された初期値と設計上の期待値と排他的論理和をとった値を遷移する特殊なカウンタに変更された。 デザイン上意図していたカウンタ出力の遷移 1001(9)->0000(0)->0001(1)->0010(2)->0011(3)->... これに初期値1001(9)を排他的論理和をとった値を最適化されたカウンタは遷移する 0000(0)->1001(9)->1000(8)->1011(B)->1010(A)->... という具合に一見すると変な遷移をするようになる。最終的に初期値である1001(9)と排他的論理和をとれば設計者が期待していたとおりのカウンタの出力が得られることがわかる。 つまり最終値はB0CDCとなった場合初期値99545を排他的論理和を取ると 1011 0000 1100 1101 1100 B 0 C D C xor 1001 1001 0101 0100 0101 9 9 5 4 5 0010 1001 1001 1001 1001 2 9 9 9 9 という仕掛けになっていた。 いやまったくすごい、こういう最適化論理は人間が最初から意図してRTL記述するのは大変なので感心した。 周波数カウンタ動作はこれでよしとしよう(´∀` ) もうほとんど終わったも同然。 P.S ちなみにシミュレーション時間は入力する信号の周波数が10分の1になったので劇的に短くなり、4分で終わるようになった。これだと1秒間分をやっても20分、1分間分だと20時間で終わることになる。 |
フラット表示 | 前のトピック | 次のトピック |
投稿するにはまず登録を | |