ココの一連のページの至るトコロに、「同期回路,同期回路」ってシツコく書いてある。
んでも、同期って言ってるのは、ごく小さな論理回路の中ダケの話しであって、リアル世界は非同期だw。
(いや、クォーク以下のレベルまで分解すれば、もしかしたら時間も質量も離散化されてて、実は同期システムなのかも・・・)
で、非同期システムのリアル世界と同期システムの論理回路とを繋ぐモノ、それをたぶんシンクロナイザって言ってると思う。
人間って何故かね、名前を付けるのが好き。
で、名前を付けて、その名前を覚えちゃうと、もう中身まで判ったような気になるから不思議w
んで、シンクロナイザなんて名前付けると、中身めんどくさそうだけど、実はショーモナイ回路だったりする(^^;
日本語にすれば、たぶん「同期化回路」ってなモンかな。
要は、非同期の信号を、論理回路内の同期システムの動作に合わせて、同期信号にするダケだ。
|
同期化の必要性を、具体的に説明してみようかね。
この説明にちょーど良い回路が、ハンパ分周器のページにある。↓こーんな回路だ。

この回路、複雑そうに見えるけど、複雑に見える部分は実は4bit+4bit=4bitの加算回路だ。
この加算回路は、4ヶのFlipFlopが保持している値に、In入力端子の値を加算してる。
加算回路の出力は、そのままFlipFlopのD入力に繋がってる。
こうしておくと、どんな動作になるかって?
この回路、基本的な動作はカウンタだと思ってくれ。
ただ、普通のカウンタはクロック1発につき+1のカウントアップを行うのに対し、
この回路はクロック1発につきIn入力で与えられた値だけカウントアップを行う。
実際にIn入力の値を0→1→3→5と変化させたシミュレーション結果が、↓これだ。

こんな風にシミュレーションかけると、これはこれで何も問題ないうように見える。
けどリアル世界は、こんなシミュレーション1発でクリアできるほど甘くない。
回路作成者が行うシミュレーションって、無意識に期待する動作から外れないようにシミュレーションしちゃう傾向がある。この傾向はかなりの熟練者でも同じで、その結果重大なミスを見逃すことだって、ままある。
だから、Pentiumみたいな巨大LSIを開発する時は、ミスのリスクを極力小さくするために、回路設計者じゃない人がシミュレーションかけてみたり、ワザとイジワルな動作条件を探してシミュレーションしたりする。
例えば、↓こんなふう。

さぁ、最初のシミュレーション結果と、どこが違う?
上と下のシミュレーション結果では、回路出力Outの値が途中から違うよね。
その相違の原因も、このシミュレーション波形の中にハッキリ現れている。さぁ、それはドコかな?
金田一君やコナン君なら、きっと即座に見つけてしまうだろう。。。(^^;
いや、ポイントを見つけるのは、そんなに難しくない。
「Outの値が途中から違う」ってワザワザ書いているんだから、どっから違ってるかを見ればいい。
ジッと見れば、時間軸目盛りが160アタリから動作が違ってくるなんて、スグ判る。
1番目のシミュレーション結果では「d→0→3→8→d→2→7」って変化しているのに対し、
2番目のシミュレーション結果では「d→0→3→0→5→a→f」って変化している、
この時In入力に入ってる値は3か5かドッチカなんだから、Outの「3→0」って変化はありえない。
3か5しか増えないハズのOutの値が、「3→0」って変化する原因は、ドコにあるかね。
それも、このシミュレーション波形の中にハッキリ現れている。とても小さな差かもしれないけど。
この差は、コナン君にジムシィとラナァまで居ないと見つからない。。(コナン違い(^^;)
|
上の2つのシミュレーションの違いって、実はIn入力が3→5に変化するタイミングが、ちとだけズレているんだ。
実際に源内CADに回路をInputして、FlipFlopのD端子への入力信号をモニタしてみれば判るんだけど、
2ッ目のシミュレーションでは、In入力が5に変化するタイミングがわずかに遅くなってて、FlipFlop-D入力の値が確定する前にクロックエッジが来てしまう。FlipFlopは加算回路の途中結果を取り込んでしまうワケで、その結果、Out出力の値がズレてくる。
In入力が3→5に変化するタイミングってさ、実は一番イジワルなタイミングだったりもする(^^;
この時加算回路は3+5=8の演算をしてるワケ。この3+5=8の演算ってのは、bit0の加算で出たケタ上がりがbit1の加算回路に入って、その桁上がりがbit2の加算回路に入って、その桁上がりがbit3の値になる、、、っていう、加算回路でもっとも演算時間のかかるタイミングだったりする。
(ホントは3+3=6の状態から3+5=8の状態に遷移するんで、ちとだけ違ってる・・まぁ気にしないで(^^;)
キャリールックアヘッドの加算器使えば、In入力が変化してからFlipFlop-D入力の値が変化するまでの時間は短くできる。
でもそれは、この場合の本質的な解決にならない。
加算には、どんな論理回路を使ったって、無限小ではない有限の時間が必要になるワケで、加算回路の演算中にクロックが来るようなタイミングってのは必ず存在する。
ヘタに小細工して問題発生確率を減らすとさ、それが動作確認で見つかる確率も減るワケで、ヘタをすると大ハマリ。。。。
確率がゼロになる根本的対策と、確率が半分になるダケの対策とでは、大違いだからねぃ。。。
|
で、加算回路の演算中にクロックが来ないようにする根本的対策、それがシンクロナイザだ。
いや〜前置き長かった(;_;) こんだけ長い前置き書いといて、この後ショボかったら、どーしよう。。。
上の回路にシンクロナイザを追加した回路って、↓こんなんだけど。。。

前の回路と何が違うかって? 外から入ってきたIn入力を、一度FlipFlopで受けてる。
え、それだけかって? うん、それだけだ(^^;
動作はどうなるかってぇと、2番目のシミュレーションと同じパターン使って、↓こうなる。

これで、いちおう「d→0→3→8→d→2→7」って変化してるでしょ。だから動作は正しい。
ただねぇ、In入力が変化してからOut出力に値が出てくるまでのタイミングが、1クロック遅くなってる。
そりゃそうだよね、In入力をFlipFlopで受けてるんだもの。
でも、そうすることで論理回路の中の信号が、全てクロックに同期した信号になるワケだ。
外部からやって来る非同期の信号を、同期回路内部のクロックに同期させる回路だから、日本語で言うと同期化処理、えーごだとシンクロナイザ、ってコトになる。実態はタダのD-FFだけど(しょぼ)
まぁ、SR-FlipFlopは1bitのメモリか?ってな問題にもあるように、使うパーツはアリキタリでも、それをどう使うかで意味合いがゼンゼン違ってくる。
これが論理回路の楽しいトコなんだけどね(^^;
|
論理シミュレータ上のシンクロナイザは、上に書いたようにD-FFを1段追加すれば、それで完璧。
なんだけど。。。。リアル世界は、こんなD-FF1段でクリアできるほど甘くない。
ドコに問題があるかってぇと、In入力と追加したD-FFとは、やっぱ非同期で動作してるってコト。
論理シミュレータ上だとねぇ、
・In入力の4bitは時間差ゼロで同時に変化する
・In入力の値がD-FFの入力端子に届くまでの時間はゼロだ
・各D-FFのクロック入力には、同じクロックが時間差ゼロで届く
・各D-FFは時間特性のバラツキが無い。
リアル世界だと、この4つの条件は、どの一つも成り立たない。無限小ではない有限の時間差が、必ず起こる。
そこに時間差が存在する限り、そのタイミングでクロックが変化する確率は、ゼロではない。
従って上に書いたD-FF×1段によるシンクロナイザって、リアル世界では根本的な対策ではなく、問題発生確率を減らしているダケの駄作だ。
このリアル世界の問題は、どう解決されるかって?
それは、論理シミュレータの世界を卒業する時のお楽しみに取っておこう。
こういう過酷なリアル問題をサクサク解くために、今のうちに論理回路シミュレータで基礎を固めておきましょう(^^;
|