ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Main Menu
Tweet
Facebook
Line
:-?
« 1 (2) 3 4 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
webadm
投稿日時: 2008-2-16 6:49
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
HPの他のシグネチャアナライザ
HPは5004A以降に5005Aや5006Aというシグネチャアナライザを出している。

5004Aがシグネチャアナライザ単一機能の製品であったのに対して、それ以降のものはシグネチャアナライザは数ある機能のうちのひとつになってしまっている。マイコンが内蔵されて電圧測定や抵抗測定機能とか周波数測定などトラブルシューティングに使われる機能を合わせもっている。

それぞれのサービスマニュアルには不鮮明ながら回路図が収録されていて、いずれも小さいがシグネチャアナライザを実現する上で不可欠な疑似乱数生成回路もしくはLFSRが組まれている。

5004Aでは生成されたシグネチャをラッチしてLEDに表示していただけのものが、後継機種ではマイコン側でメモリにいくつか保持する機能が備わっている。

しかし回路を見比べていて驚愕の事実が発覚。

5006Aでは生成多項式がまるで違っているではないか。CRCぽい回路になっている。たぶん生成される値は同じ条件を与えても5004Aとは互換性が無くなっていると思われる。厳密に調べてみたわけではないが。

どのサービスマニュアルにもシグネチャアナライザを使用する場合にはその機種名が記載されているので、新しいシグネチャアナライザを使用している機種はそれに従ってサービスマニュアルも作成されているので仕様が違っていても問題はない。ただ素人考えでHPのシグネチャアナライザであればどれつかっても一緒だろうという予想は裏切られることになる。

後日、それらの仕様の違いを外部の設定ピンによってどのシグネチャアナライザの仕様で動作するか乱数生成回路を複数の仕様にあわせて変更できるようにすることは可能であると思われる。
webadm
投稿日時: 2008-2-14 13:29
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
Quartus II 7.2 sp2が出た
シミュレーションをいろいろ繰り返しているうちに、ふと見ると新しいサービスパックがダウンロードできるという表示が出ていた。

時を同じくして今終わったシミュレーションのレポートを表示しようとしたらリソースが足りなくて表示できないとのエラーが。

メモリリークかよ(;´Д`)

ちょうど良いタイミングだったのでサービスパックをダウンロードしよう。
webadm
投稿日時: 2008-2-14 11:16
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
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-11 9:13
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
Re: ヒゲの問題
冷静に考えたら間違いを犯していることに気づいた。

オリジナルのゲーテドクロックの回路を良くみたらステートマシンのレジスタの出力ではなく、コンビネーション回路の出力でクロックをマスキングしていた。

回路図がかすれたり皺とかが混じっていて配線を追い間違っていた。

確かにそうしないと最初のシフトレジスタの動作のタイミングが1クロック遅れてしまう。先のテストケースでは本来は2クロック動作することになり0003となるべきだった。

さっそくRTLを書き直し、ステートマシンのSHIFT出力の仕方を変更してみた。

sm.v:ステートマシン(shift出力条件変更)

引用:
module sm(clock, start, stop, hold, reset, clear, shift);

input clock, start, stop, hold, reset;

output reg clear, shift;

// Declare state register
reg [1:0]state;

// Declare states
parameter S00 = 0, S01 = 1, S10 = 2, S11 = 3;

// Determine the next state synchronously, based on the
// current state and the input
always @ (posedge clock) begin
if (!reset)
state <= S00;
else
case (state)
S00:
if (!start)
begin
state <= S01;
end
else
begin
state <= S00;
end
S01:
if (start)
begin
if (!stop)
begin
state <= S10;
end
else
begin
state <= S11;
end
end
else
begin
state <= S01;
end
S10:
if (stop && !hold)
begin
state <= S00;
end
else
begin
state <= S10;
end
S11:
if (!stop)
begin
state <= S10;
end
else
begin
state <= S11;
end
endcase
end

// Determine the output based only on the current state
// and the input (do not wait for a clock edge).
always @ (state or stop or clock or reset)
begin
case (state)
S00:
begin
clear = reset;
shift = 0;
end
S01:
begin
clear = reset;
shift = start;
end
S10:
begin
clear = (!stop | clock) & reset;
shift = !stop;
end
S11:
begin
clear = reset;
shift = 1;
end
endcase
end

endmodule


prg.v:疑似乱数生成モジュール(0リセットに戻す)

引用:
module prg(clear, clock, shift, data, reset, prn);

input clear, clock, shift, data, reset;

output reg [15:0] prn;

// Declare the shift register
reg [15:0] sr;

// Shift everything over, load the incoming bit
always @ (posedge clock or negedge clear or negedge reset)
begin
if (!clear | !reset)
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

always @ (negedge clear or negedge reset)
begin
if (!reset)
begin
prn <= 0;
end
else
begin
prn <= sr;
end
end

endmodule




シフトレジスタは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-11 6:41
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
ヒゲの問題
オリジナルの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);

input clear, clock, shift, data, reset;

output reg [15:0] prn;

// Declare the shift register
reg [15:0] sr;

// Shift everything over, load the incoming bit
always @ (posedge clock or negedge clear or negedge reset)
begin
if (!clear | !reset)
begin
sr[0] <= data;
sr[15:1] <= 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

always @ (negedge clear or negedge reset)
begin
if (!reset)
begin
prn <= 0;
end
else
begin
prn <= sr;
end
end

endmodule


data=1とサンプルされる条件では



0003が表示され

data=0とサンプルされる条件では



0000が表示される。

これで本物と同じ動作になったと言えるかもしれない。
webadm
投稿日時: 2008-2-11 4:30
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
最終的なデザイン
最終的なデザインは既に作成したトップモジュールを下位モジュールとする新しいトップモジュールを作成する。

その中に表示用のクロックを外部もしくは内部オシレーターの周波数から分周して得る回路を含む。

これによって下位モジュールは使用するデバイスやオシレーター回路に依存することなく再利用可能な形を保てる。

Qurartusに限らずトップモジュールはいくつでも作成でき、そのどれかを選択してデザインをコンパイルすればテスト用やデバッグ用、本ちゃん用といろいろ周辺回路のバリエーションが異なるデザインを作ることができる。
webadm
投稿日時: 2008-2-11 4:12
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
表示用の基準クロック
シグネチャアナライザーはLEDのダイナミック点灯用に低速な基準クロックを必要とする。

MAX IIの場合にはこうした厳密な精度を求めないクロック発生源であれば内部のオシレーターを使うという手がある。

QuartusのToolメニューからMegawizard Plug-In Managerを起動してCreate custum Megafunctionを選択するとI/O Megafunctionの中にMAX II oscillatorというのがある。



これを選択してオシレーターを利用するためのモジュールを作成してくれる。これを使うにはトップモジュールでインスタンス化して出力信号をクロック源が必要な他のモジュールの入力につなげてやればよい。

これを使うとトップモジュールはAltera MaxII専用になってしまうが、下位は影響を受けないのでこれも有りである。

どうしてもベンダー固有の機能は使いたくない場合は、物理的に外付けのクロック源を用意する必要がある。トラ技付録CPLD基板にはそれもあるので任意の周波数のXOSCを差し込んでクロック源として使うことができる。
webadm
投稿日時: 2008-2-11 2:57
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
周辺回路の設計
MAX II CPLDでシグネチャアナライザの基本回路が実装できたので、シグネチャアナライザ装置として必要な周辺回路基板を設計しないと実用にならない。

すぐさま信号をつなげてみたい気持ちははやるが、罠がある。

MAX II CPLDは古いCPLDやFPGAと違って新しいので5V動作ではないという点。

電源電圧が3.3Vなのでそれより高い入力電圧を加えると破壊されてしまう。

従って外部の入力信号からCPLDを保護するための回路が必要となる。

トラ技付録のMAX II基板にもJTAG関連の信号接続で同様の対策が施されている。東芝の74VHCシリーズの標準ICを使ってレベル変換及び入力保護を行っている。

特にやばいのがCPLDに電源が供給されていない状態でうっかり動作中の測定対象機器から信号をつなぎ込んでしまうケース。相手は古いTTLレベルでドライブ能力もCMOSに比べたら大きいので一瞬にして大電流がCPLDのI/Oブロックに流れ込んで破壊してしまうことが予想される。

出力はLVTTLなのでLEDを点す程度なら問題無い。あまりCPLDから電流を取ると誤動作と故障の原因になるので、外付けトランジスタをドライブする形とする。

実際に回路を実装するときには74VHCシリーズがフラットパッケージなので変換基板とかを必要とするかもしれない。ちょっと直付けは自信が無い。

LEDのCOMMONとSEGMENTの駆動用のトランジスタもバカにならない数となる。COMMON側は複数のSEGMENTに流れる電流の総和となるのでON抵抗を下げるために電流増幅率の大きなダーリントン接続回路を使用する。

単体LEDは直接CPLDからドライブできるがそれでもかなり電流を流すことになるので駆動用トランジスタを外付けする形とする。

まあそこまでやる必要はないのかもしれないけど、虎の子のMAX II基板なので壊れると痛い。
webadm
投稿日時: 2008-2-10 14:22
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
タイミングアナライザの問題はクリア
諸悪の根元は疑似乱数生成器のシフトレジスタをシフトするクロックとしてゲーテドクロック(shift)を生成しているのがいただけなかった。

オリジナルのHP5004Aでは実際そうしているのだけれどもFPGAで同じことをやってもPlace & Routeの結果配線遅延が変わってくると同じ動きをする保証は無くなる。

まずゲーテドクロックを使うのをやめて、イネーブル付きのシフトレジスタを構成するように仕様を改める。

今度からステートマシンが出力するshift信号はゲーテドクロックではなく、単なる疑似乱数生成イネーブル信号ということにする。これは従来のled_gate信号と同じなのでled_gate信号は廃止してshift信号でled_gate信号ピンをドライブするように変更。

最後に疑似乱数生成器にclock信号を入力し、shift信号がアサートされている時のみclock信号の立ち上がりでシフトレジスタをシフトするように変更。

変更したソースは以下の通り。

satop.v:シグネチャアナライザトップ

引用:
module satop(sa_clock, sa_start, sa_stop, sa_data,
clock_pol, start_pol, stop_pol,
clk, reset, hold,
test_clock, test_start, test_stop, test_data,
led_seg, led_com,
led_gate, led_unstable, led_data);

// Input Port(s)
input sa_clock, sa_start, sa_stop, sa_data;
input clock_pol, start_pol, stop_pol;
input clk, reset, hold;

// Output Port(s)
output test_clock, test_start, test_stop, test_data;
output [6:0] led_seg;
output [3:0] led_com;
output led_gate, led_unstable, led_data;

wire clock, start, stop, data, clear, shift, dclock;
wire [15:0] prn;
wire [3:0] dcount;

// Parameter Declaration(s)

// Additional Module Item(s)
assign led_gate = shift;

edgesel edgesel(sa_clock, sa_start, sa_stop,
clock_pol, start_pol, stop_pol,
reset, clock, start, stop);
sm sm(clock, start, stop, hold, reset, clear, shift);
prg prg(clear, clock, shift, data, reset, prn);
dc dc(prn, dcount, led_seg, led_com, led_unstable);
dl dl(sa_data, clock, reset, dclock, data, led_data);
stosc stosc(clk, dcount, dclock, test_clock, test_start, test_stop, test_data);

endmodule


sm.v:ステートマシン

引用:
module sm(clock, start, stop, hold, reset, clear, shift);

input clock, start, stop, hold, reset;

output reg clear, shift;

// Declare state register
reg [1:0]state;

// Declare states
parameter S00 = 0, S01 = 1, S10 = 2, S11 = 3;

// Determine the next state synchronously, based on the
// current state and the input
always @ (posedge clock) begin
if (!reset)
state <= S00;
else
case (state)
S00:
if (!start)
begin
state <= S01;
end
else
begin
state <= S00;
end
S01:
if (start)
begin
if (!stop)
begin
state <= S10;
end
else
begin
state <= S11;
end
end
else
begin
state <= S01;
end
S10:
if (stop && !hold)
begin
state <= S00;
end
else
begin
state <= S10;
end
S11:
if (!stop)
begin
state <= S10;
end
else
begin
state <= S11;
end
endcase
end

// Determine the output based only on the current state
// and the input (do not wait for a clock edge).
always @ (state or stop or clock or reset)
begin
case (state)
S00:
begin
clear = reset;
shift = 0;
end
S01:
begin
clear = reset;
shift = 0;
end
S10:
begin
clear = (!stop | clock) & reset;
shift = 1;
end
S11:
begin
clear = reset;
shift = 1;
end
endcase
end

endmodule


prg.v:疑似乱数生成モジュール

引用:
module prg(clear, clock, shift, data, reset, prn);

input clear, clock, shift, data, reset;

output reg [15:0] prn;

// Declare the shift register
reg [15:0] sr;

// Shift everything over, load the incoming bit
always @ (posedge clock or negedge clear or negedge reset)
begin
if (!clear | !reset)
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

always @ (negedge clear or negedge reset)
begin
if (!reset)
begin
prn <= 0;
end
else
begin
prn <= sr;
end
end

endmodule


タイミングアナライザの結果は以下の通り



RTL Viewerで全体を見るとled_gateがshiftとつながっているのとprgにclock信号につながっている点を除いて従来と変わらない。



今回貢献したのはイネーブル付きのシフトレジスタにしたこと。



良いことずくめのようだが副作用もある。



自慢のヒゲが無くなってしまった。

まあこれは後日実際に動作させてみて必要であればシフトレジスタをリセットする際の初期値にdataを取り込むようにすれば良い。



webadm
投稿日時: 2008-2-10 13:05
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3095
タイミングアナライザーがひどいことに
普通はシミュレーションの前にタイミングアナライザーのチェック結果を見る。

見てみたら真っ赤だった...orz

クロック系信号の条件を設定していなかったのもあるが、ちゃんと設定してもどうしても疑似乱数生成器のシフトレジスタに前段のデータラッチの出力をサンプル際にホールドタイムを満たさないというもの。



なんでhold timeバイオレーションがこんなにでるんだ?


そんなはずはと、オリジナルのHP5004Aの回路図を改めてみたら、データのラッチはDFFではなくJKFFであるが、これはプローブ入力を2つのコンパレータ(HレベルとLレベル)の出力をJ,Kに接続しているだけなので、出力の変化タイミングはクロックエッジに同期している点ではDFFと変わらない。



今時のロジックICはhold timeは0なのでsetupが満たせば良いと思うのだが、何故かhold違反が出る。

よく考えれば当たり前だった。プローブデータ(sa_data)はsa_clockをclock_polとxorしたclock信号でサンプルするので疑似乱数生成器にその出力が変化するのはclock立ち上がりの後になる。一方疑似乱数生成器のシフトレジスタをシフトするのはclock信号を状態値でandしたshift信号でサンプルするので、立ち上がりがclockの立ち上がりから更に遅れる。このあたりのタイミングはPlace & Routeの結果によって配線遅延でレースが発生してしまう。一番良くない設計パターンだ。

というかやはりFPGA内部で非同期信号を扱うともう大変過ぎ。

あっち直せば今度はこっちにしわ寄せが出るとかいうイタチごっこになってくる。

根本的にだめくさい...orz
« 1 (2) 3 4 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
ページ変換(Google Translation)
サイト内検索