スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2008-2-11 4:30 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
最終的なデザイン 最終的なデザインは既に作成したトップモジュールを下位モジュールとする新しいトップモジュールを作成する。
その中に表示用のクロックを外部もしくは内部オシレーターの周波数から分周して得る回路を含む。 これによって下位モジュールは使用するデバイスやオシレーター回路に依存することなく再利用可能な形を保てる。 Qurartusに限らずトップモジュールはいくつでも作成でき、そのどれかを選択してデザインをコンパイルすればテスト用やデバッグ用、本ちゃん用といろいろ周辺回路のバリエーションが異なるデザインを作ることができる。 |
webadm | 投稿日時: 2008-2-11 6:41 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
ヒゲの問題 オリジナルのHP5004Aの回路では疑似乱数生成直後にシフトレジスタが一回だけヒゲによって動作しプローブデータが取り込まれてしまう。
これを裏付ける証拠がHP5004Aのサービスマニュアルから得られた。 プローブのセットアップタイムの性能をテストする方法がマニュアルに載っていて、それは10MHzの矩形波をプローブデータとして同じ信号を可変遅延したものをクロックとして、クロックを更に2分周したものをSTART/STOPとして与える場合に遅延を0とした場合と大きくしていった場合について表示されるシグネチャ値でプローブのセットアップタイム性能を評価するというもの。 それによると遅延を0とした場合(setup time = 0未満)とした場合にはシグネチャアナライザの表示は0000となるとしている。これは常にデータが0としてサンプルされるのでシグネチャ値は0にしか取り得ないので合っている。問題は遅延を大きくしていった時にシグネチャアナライザの表示が0003となるべきとしている点である。今回のデザインで同じ条件でシミュレーションするとどうやってもシグネチャ値は0001にしかならない。 このケースはステートマシンが最短時間で動作するケースで、シフトレジスタは一回しかシフトしないので初期値が0だとどうやっても0001にしかならない。 0003になるには初期値が0001でなければならない。つまりシフトレジスタがクリアされた後一回だけシフト動作でdataを取り込むのと同じ動作が必要という結論になる。 そこで疑似乱数生成モジュールのシフトレジスタのリセット動作仕様を以下のように変更し、CLEARパルスによってdataを取り込むようにしてみたところ、シミュレーションで見事に0003が表示されるようになった。 prg.v:疑似乱数生成モジュール(仕様変更) 引用: module prg(clear, clock, shift, data, reset, prn); data=1とサンプルされる条件では 0003が表示され data=0とサンプルされる条件では 0000が表示される。 これで本物と同じ動作になったと言えるかもしれない。 |
webadm | 投稿日時: 2008-2-11 9:13 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Re: ヒゲの問題 冷静に考えたら間違いを犯していることに気づいた。
オリジナルのゲーテドクロックの回路を良くみたらステートマシンのレジスタの出力ではなく、コンビネーション回路の出力でクロックをマスキングしていた。 回路図がかすれたり皺とかが混じっていて配線を追い間違っていた。 確かにそうしないと最初のシフトレジスタの動作のタイミングが1クロック遅れてしまう。先のテストケースでは本来は2クロック動作することになり0003となるべきだった。 さっそくRTLを書き直し、ステートマシンのSHIFT出力の仕方を変更してみた。 sm.v:ステートマシン(shift出力条件変更) 引用: module sm(clock, start, stop, hold, reset, clear, shift); prg.v:疑似乱数生成モジュール(0リセットに戻す) 引用: module prg(clear, clock, shift, data, reset, prn); シフトレジスタは2回シフトされ表示が0003になる。影響は無いがshift信号に予想外なタイミングにヒゲが出ている。まあコンビネーションロジックで生成しているのとステートマシンのレジスタが最適化によって3個に減ってしまっているので仕方が無いかもしれない。 data=0の場合は0000と表示されるので問題なし。 これでやっとオリジナルと同じ動作が期待できそうである。 ROMシグネチャモード時の65536サイクルdata=1のケースでもちゃんと結果が0003になった。 あとは仕様的にholdイネーブル時の動作がよく解っていなかったりする。holdをon状態にするとresetを押すたびに状態が解除され一回だけ計測がされる。holdがoffの場合には繰り返し計測がされるので、一回ずつ計測するにはhold onとする使い方になる。 しかしオリジナルのHP5004Aの回路図のスキャン画像が不鮮明で、hold信号がからんでいる組み合わせ回路の結線が正確に読み切れていない。中には組み合わせ回路の出力を入力にそのままフィードバックしていたりするので、動作の理解に苦しんでいる。 まあ、とりあえずholdは使わないので後日としよう。 |
webadm | 投稿日時: 2008-2-14 11:16 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Quartus IIのWaveform Editorではまる 以前に65536クロック周期のSTART/STOP信号で常にHightのプローブデータを計測した場合に0003のシグネチャ値が表示されるのをテストしたが、厳密に65536クロックではなく、Waveform Editorのタイムスケールでちょうどその値になるような位置でSTART/STOPを変化させていたというインチキをやっていたことを今更ながら告白。
さてちゃんと65536倍の周期のSTART/STOPパルスを入力してやろうと思って周期が40nsの65536倍を指定してWaveform EditorのClock入力で編集してみたところシミュレーション結果が違った。 しかもシグネチャ値が不安定だというおまけ付き。 なぜだ? かなり時間をかけて波形を追っていくとシグネチャ値が2通り出てくる原因が判明した。 Waveform Editorで入力した波形がぴったり65536倍ではなかったということ。同じ方法で40ns周期で入力したSA CLOCK信号とクロックエッジが同期しておらず、微妙にずれていっているのがわかる。 なぜだ? Counter入力を使ってみたところ、周期40n指定で文周比を65536に指定するとぴったりSA CLOCKと同期した波形が入力できた。 Clock入力は微妙に異なるクロックの位相偏差をエミュレートしているということなのだろうか? だとしたらすごい。 Counter入力でやったら、ちゃんと65536サイクルで0003が表示された。これで実機を製作しても安心である どうやらWaveform Editorでクロック周期として入力できる数値には上限があるらしく、それを超えるとオーバーフローした短い周期になってしまうらしい。長い周期はそれなりに長い単位に設定しないと思わぬ落とし穴に陥ることに。 |
webadm | 投稿日時: 2008-2-14 13:29 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Quartus II 7.2 sp2が出た シミュレーションをいろいろ繰り返しているうちに、ふと見ると新しいサービスパックがダウンロードできるという表示が出ていた。
時を同じくして今終わったシミュレーションのレポートを表示しようとしたらリソースが足りなくて表示できないとのエラーが。 メモリリークかよ(;´Д`) ちょうど良いタイミングだったのでサービスパックをダウンロードしよう。 |
webadm | 投稿日時: 2008-2-16 6:49 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
HPの他のシグネチャアナライザ HPは5004A以降に5005Aや5006Aというシグネチャアナライザを出している。
5004Aがシグネチャアナライザ単一機能の製品であったのに対して、それ以降のものはシグネチャアナライザは数ある機能のうちのひとつになってしまっている。マイコンが内蔵されて電圧測定や抵抗測定機能とか周波数測定などトラブルシューティングに使われる機能を合わせもっている。 それぞれのサービスマニュアルには不鮮明ながら回路図が収録されていて、いずれも小さいがシグネチャアナライザを実現する上で不可欠な疑似乱数生成回路もしくはLFSRが組まれている。 5004Aでは生成されたシグネチャをラッチしてLEDに表示していただけのものが、後継機種ではマイコン側でメモリにいくつか保持する機能が備わっている。 しかし回路を見比べていて驚愕の事実が発覚。 5006Aでは生成多項式がまるで違っているではないか。CRCぽい回路になっている。たぶん生成される値は同じ条件を与えても5004Aとは互換性が無くなっていると思われる。厳密に調べてみたわけではないが。 どのサービスマニュアルにもシグネチャアナライザを使用する場合にはその機種名が記載されているので、新しいシグネチャアナライザを使用している機種はそれに従ってサービスマニュアルも作成されているので仕様が違っていても問題はない。ただ素人考えでHPのシグネチャアナライザであればどれつかっても一緒だろうという予想は裏切られることになる。 後日、それらの仕様の違いを外部の設定ピンによってどのシグネチャアナライザの仕様で動作するか乱数生成回路を複数の仕様にあわせて変更できるようにすることは可能であると思われる。 |
webadm | 投稿日時: 2008-2-19 11:28 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
HOLD回路 気になっていたHOLD動作関連の回路をオリジナルのかすれた所々消えている回路図を古文書の修復のような感じで調べてみた。
中央にあるNANDゲートの出力がNANDゲートの入力にフィードバックしているのがHOLD信号が関係する唯一の回路。 最初なんのためかわからなかったが、古いデジタル回路の参考書を見ると、これは典型的なラッチ回路を構成しているらしい。 そういえば、老齢のハードウェア屋さんが、「むかしDECのpdp-11のUNIBUSインタフェースの回路図に、ゲートの出力が入力にループしている回路があってね...」という昔話をしているのを聞いたことがある。当時は標準ICを使っていかに少ない素子数で回路を組むかというのを競っていた時代でもあり、こういったトリッキーなラッチ回路は当たり前のように使われていたと思われる。 もうHDL時代ではこうしたループでラッチを構成する記述は御法度となっているので、いきなり回路を見てもそれとは気づかない。 実際に動作を理解するのもややこしい。初期状態からして出力値が入力値にフィードバックされているので、ピンとこない。 真理値表を書いてみてようやくわかってくる。 他にもHP5004Aの回路には謎めいた回路がある。それはトランジスタ1石でくまれたパワーオンリセット回路。これが電源いれたとたんにどういう動作をするかまるで予想がつかない。シミュレーターでやっても現実の動作は示してくれない。 RESET信号線は行き先の回路を見る限り負論理信号である。おそらく電源投入直後しばらくはLを維持して、次第にHになると思われる。確かにそういう動作をするためにはと考えると、最初コンデンサが充電されるまでベースに電流が流れトランジスタがONし、充電が完了すると流れなくなってトランジスタがOFFするという動作をしそうなことがようやく見えてくる。 HOLD信号は次ぎのステートを強制的に初期値に戻す信号を生成するのに関与している。それ以外の回路にはHOLD信号が供給されていない。JS00という出力信号が1になると次ぎのステートが強制的に初期状態になる。しかしJS00はHOLD信号が入力されている初段のNANDゲートの入力にもなっている。もう片方の初段のNANDゲートは計測中にSTOPがアサートされた時に0を出力する。従って出力段のNANDゲートのどちらかの入力が0であれば自動的に出力は1となりステートマシンを初期状態に戻すことになる。 これらのことから、HOLD信号は正論理信号で、0の場合にはSTOP信号と状態値のみがステートマシンを初期状態に戻すのに関与する。1の場合には出力が0の状態では関与せず、出力が1の状態では常に出力を1に保つ効果を持つ。従って、計測中には影響せず計測が終了時にステートが初期状態に戻るとそのまま初期状態を維持する動作をするということになる。巧妙だが回路からそれを読み取るのは難しい。 |
webadm | 投稿日時: 2008-3-21 5:29 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Xilinx ISEでの問題点 Alteraの最新のFPGA/CPLDは手に入り難いので、千石とかにあるようなXilinxの5v系 CPLDに入るならそのほうがいいかと思って久々にISE 8.2iを立ち上げてみた。
web updateをクリックしたらサービスパックが出ているようなのでそれをあてておくことに。 ソースをそのまま同じように作成していざコンパイル...やり方をすっかり忘れてたり(;´Д`) Impelement Top Moduleを実行すればよいのね。 すると警告が1つとエラーが16個出た。 なんだ? ごく普通のVerilogで書いたのに何故? とERRORをクリックすると驚愕の事実が判明。 引用: // Shift everything over, load the incoming bit エラーになったのは上の構文で、ifの条件式が複雑すぎるためらしいことが表示されたアンサーデータベースから判明。そうなのか、結構Xilinx ISEは手抜きなのね。QuartusIIの方がさすがにSystem Verilogサポートしているだけに気が利いている感じ。 さっそく以下の様に修正。 wire rstclr; assign rstclr = (!clear | !reset); // Shift everything over, load the incoming bit always @ (posedge clock) begin if (rstclr) begin sr <= 0; end else if(shift) begin sr[15:1] <= sr[14:0]; sr[0] <= data ^ sr[6] ^ sr[11] ^ sr[12] ^ sr[15]; end end これでImplementしたらXC95108に収まることが判明。これはPLCCパッケージもある比較的ポピュラーだけど古いデバイス。秋葉原だと千石電商で売っている。 これを使ってシグネチャアナライザーを作ってもいいかもしれない。 まだシミュレーションはしていないので問題が無いとは言えないが、動作周波数も十分大きいし余裕もあるのでなんとかなる気がする。 |
webadm | 投稿日時: 2008-3-21 7:13 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Re: Xilinx ISEでの問題点 後学のためにXilinx ISEのRTL Viewerで合成結果を見てみることにした。
トップレベルはこんな感じ。 その内訳もまあ想定通り。 ところがそっから下の各ブロックを見てみると驚愕の事実が発覚。 これは疑似乱数生成ブロックだが、上のレベルではshift信号が入力されているはずが、実際には消えてしまっている。そればかりか、resetとclear信号から合成されるrstclr信号パスが盲腸のように行き場を失っている。それとシフトレジスタのフィードバックがレジスタ出力からではなく入力信号から生成されている。これらを見ても意図した動作しない回路になってしまっているのは明らか。 Fitterでshift信号に関して警告が出ているがアンサーデータベースには該当するものが無い。 どうやらネットリストとしては意図した通りに合成しているがそれがFitterでデバイスにマッチしないので適当に省略されてしまったように見える。他にもいくつか他のブロックでも盲腸のような回路がRTL Viewerで確認されているので問題が他にもあるような気がする。 Xilinxの場合には、有る程度どんなネットリストが意図した通りにFitするか知った上でRTLを記述しないとだめなような気がする。このあたりはAlteraのQuartusIIの方が気が利いている。 まあISE 8.2sp3なのでこういう問題があるかもしれない。でも盲腸のような回路は昔からあった。 最新のISEではどうなのかは後日やってみよう。 |
webadm | 投稿日時: 2008-3-21 7:29 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3093 |
Re: Xilinx ISEでの問題点 Xilinx ISEのRTL Viewerを見てがっかりしたが、念のためにFitterの結果を見てみようとTechnology Mapを見てみたら意外な事実が判明。
問題の疑似乱数生成ブロックに該当する部分をみたら、ちゃんと意図した通りの回路になっている。どこも盲腸のようなところはない。 ということはRTL Viewerの表示上の手抜きらしいことが判明。 たぶん複雑過ぎて描画が面倒で表示を手抜きしているように見える。実際にはネットリストもFitterも意図した通りに仕事をしていたのに。もったいない。 |
« 1 2 (3) 4 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |