まえがき |
今の時代の人にナイトライダーって言っても通じないのかも。。。
大昔、チマタでけっこウケてたTV番組だよ。
主人公は人工知能を搭載した黒いスポーツカー、名前はKitt。
波動エンジンで動き、高濃度ミノフスキー粒子雲の中でも自律行動できる。。。。
脇役の相棒がマイケル。Katt君だったらチョコ菓子になるトコだった。
マイケルはトラジマでチョット太めの踊る猫。よく屋根の上で昼寝をしている。。。。
ん〜と、なんか微妙に違ってるような気もするから、興味のある人は「ナイトライダー」でファンサイトとか検索してチョ(^^;
んで、今回のお題目は、Kitt君のフロントに搭載されているイルミネーション。
TVだと、このイルミネーションの光がヒュンヒュンって音たてながら左右に動くんだ。周囲を見渡すKitt君の目のよーにね。
一時期、オートバックスとかイエローハットで、光が左右に動くイルミネーションが売られてたけど、まだあるのかなぁ。
今だったら高輝度LEDとか使って、もっとカッコ良く作れるだろうに。。。
|
機能記述編 |
↓こんなふう
●○○○○○○
↓
○●○○○○○
↓
○○●○○○○
↓
○○○●○○○
↓
○○○○●○○
↓
○○○○○●○
↓
○○○○○○●
↓
○○○○○●○
↓
○○○○●○○
↓
○○○●○○○
↓
○○●○○○○
↓
○●○○○○○
↓
最初に戻る
|
んでそのイルミの機能仕様だけれども、
- 発光部が7個あり、規則的に点滅する。
- 点灯している発光部は1個ダケ。
その1個が左から右へ順番に光って、右端まで行ったら今度は左へ戻る。
反復横飛び状態で、左右に往復しているように光る。
ま、こんだけ。単純だ(^^;
論理回路シミュレータの世界では、イルミってトコまで行けなくて、イルミを制御する制御回路までしか作れない。
制御回路の機能仕様にすると、
- 1本のクロック入力がある。
このクロック入力で、イルミの光を動かすタイミングを作る。
- 7本の出力がある。各出力が1個の発光部の点灯/消灯を決める。
'1'出力で点灯、'0'出力で消灯を意味するコトに決める。
ってか、論理回路の外の発光部回路は、そうなるように作ってもらえるコトにする。
- 7本の出力は、どれか1本だけが'1'で他は'0'になる。
- '1'になる出力は、クロック毎に、右から左へ、左端まで行ったら今度は左から右へと、順番に動く。
ま、こんだけだ。
ここまで読んで自力で作れそうだと思う人は、先を読む前に作ってみてチョ。
|
回路作成編 |
さて、このイルミの制御回路作るんだけど、何の考えもナシにCAD開いても、何も作れない。
まずはあらかたの回路構成とか設計方針とかを、その日の気分で決める。
回路構成やら設計方針って言っても、何を考えりゃ良いかって? まずはね、FlipFlopの数を考える。
前に別のページでやったけど、こゆのって2通りの考え方がある。
- 内部状態の数に着目してFlipFlop数を決める方法。
- 出力の数の着目してFlipFlop数を決める方法。
で、今日の気分は、出力の数に着目するほうかねぇ。。。
上の機能記述だと、これから作る回路は7本の出力を持つ。
各出力に1個のFlipFlopを使用するんで、7個のFlipFlopが必要になる。
この7個の出力FlipFlopは、特にJK-FF使っても良いコトなさそうなので、素直にD-FFを使うコトにする。
ここまで決まれば、自動的に↓ここまで書ける。

7本の出力Y1〜Y7は、どれか1本だけが'1'で他は'0'になる。つまりこの回路で7通りの状態が出来る。
けど、機能記述からすると、発光部が右に動くか左に動くかを決めるための状態が、もひとつ必要になる。
つまり、FlipFlopもう1個が必要になる。
このFlipFlopが'0'の時は'1'出力がY1からY7の方向へ移動し、'1'の時はY7からY1の方向に移動する、ってコトにする。
この方向決定FlipFlopの値が変化するのは、Y1が'1'になった時とY7が'1'になった時だ。
- Y1が'1'になったら、
- 次のクロックから'1'出力をY1からY7方向に進めるために、方向決定FlopFlopは'0'になればいい。
- Y7が'0'になったら、
- 次のクロックから'1'出力をY7からY1方向に進めるために、方向決定FlopFlopは'1'になればいい。
とすると、方向決定FlipFlopはD-FFじゃなくて、JK-FFかSR-FFがを使うのが楽そうだ。
JK-FFを使うと、方向決定FlipFlopの変化が1クロック遅れるから、SR-FFがベストっぽい。
ここまで決まれば、自動的に↓ここまで書ける。SR-FFは、NOR×2ヶで作ってある。

これでイルミ制御回路の入出力信号と、内部状態を保持する部分が組みあがった。
あとは機能記述に従った単純組み合わせ回路だから、
Y1が'1'になる条件、Y2が'1'になる条件、、って考えていけば、自動的に回路全体が出来上がる。
- Y1が'1'になるのは、
- 方向決定FlipFlopが'1'で、かつY2が'1'で、クロックが入った時。
だからY1を出力するFlipFlopのD入力(D1って呼ぼう)は、方向決定FlipFlopが'1'で、かつY2が'1'の時に'1'になればいい。
- D2は、
- {(方向決定FlipFlopが'0') and (Y1が'1')} or {(方向決定FlipFlopが'1')
and (Y3が'1')}で'1'になればいい。
いちいち方向決定FlipFlopって書くのが面倒だから、方向決定FlipFlopの出力をDIRと呼ぼうかね。
- D3は、
- {(DIR=0) and (Y2=1)} or {(DIR=1) and (Y4=1)}で'1'になればいい。
以下同様に、
- D4={(DIR=0) and (Y3=1)} or {(DIR=1) and (Y5=1)}
- D5={(DIR=0) and (Y4=1)} or {(DIR=1) and (Y6=1)}
- D6={(DIR=0) and (Y5=1)} or {(DIR=1) and (Y7=1)}
- D7=(DIR=0) and (Y6=1)
ってコトになる。
ところが、上の回路ではResetでY1〜Y7が全て'0'になるように配線してまった。
これじゃこの回路、最初の1個が点灯しないんで、以降何発クロックが入ってもランプは全部消えたままだ。
これじゃマズいんで、Y1用FlipFlopだけセット付きにして、ResetでY1が'1'になるようにしちゃおう。
あとは上の論理式を素直に回路にすると、↓こんなんが自動的に出来上がる。

これ、シミュレーションかけてみると、こうなる。
Y1〜Y7の'1'出力が順番に動いてって、端まで行くと戻ってくる。 うん、これでいいのだw

|
LSI/FPGA向きの回路に修正 |
さて、論理シミュレータの中なら、上の回路で問題なし。
けど、FPGAやLSIの回路になると、SR-FFは使えない。
特に、ゲートで組んだSR-FFは、ほとんどの実用CADでは許してもらえない。
- LSI-CADの場合、
- LSI用CADは、回路の内部状態を把握してテストパターンの自動生成とかするから、
ゲートでFlipFlop組まれると、CADが認識できない状態が作り込まれるコトになり、テストパターンの自動生成が出来なくなる。
いや、手作業でテストパターン作っても良いんだけどね、、、すんごい手間だよ(^^;
- FPGAの場合、
- FPGAの中身って、ゲートは真理値表テーブルに分解されちゃうから、フツーの回路だと起こり得ないタイミングでもハザードが出る。回路が完全同期設計になってりゃ問題ないんだけど、SR-FFを構成するゲートがハザード出すとSR-FFにならない。。。
まぁ、詳しくはXilinxとかAlteraのページ行ってFPGAの内部解説を見てちょ。
というワケで、FPGAやLSIでの実用回路は、↓こうなる。
当然、単一クロック単一リセットの完全同期設計だ。
前の回路で1個だけReset信号でセットされてるD-FFがあったけど、それもなくしてある。
- セット付きD-FFは、LSIでもFPGAでも使用可能だけどね、1個だけ違うのが居ると、なんとなく気持ち悪いw
それに、初期化時にセットされる値におもいっきり期待する回路になっちゃうんで、動作中の外来ノイズなんかで意図しない状態に陥ると自動復帰できない。
ってなワケで、初期化時にはD-FFを全部クリアして、D-FFが全部クリアされた状態から論理的に立ち上がるブートストラップ回路を付けちゃう。このブートストラップは、意図しない状態から自動復帰するフェイルセーフとしても機能する。
ゲート数がちと増えてるけど、100万個のゲートを作り込めるようなLSIじゃゼンゼン問題にならない。
FPGAだと、CADがゲートの組み合わせを全部作り変えて再構成するから、見た目のゲート数はほとんど問題にならない。

回路はずいぶん変わったけれども、シミュレーション結果は、↓ほれ、一緒だ。

なお、こーゆー論理回路って、この回路ダケが正解ってワケじゃぁ、ない。
最初に作った機能記述通りに動いてて、不安定な要素とか意図しない状態に陥る可能性とかが無ければ、それはそれで正解なんだよね。
|
汎用ロジック向けの回路に修正 |
さて、この回路を74xxシリーズの汎用ロジックICで組むとしたら、どうなるかね。
汎用ロジックICで組む場合、いかに適当なICを見つけるかが勝負だったりする。
そのためには、シリーズラインナップの各ICの動作や機能を把握する理解力と、それを使いこなす応用力が必要だ。
先に作った回路を、普通に組みなおすと、
D-FFの部分は74xx273って言う8ヶ入りD-FFにして、
D-FFのD入力信号を作る部分は74xx157って言う4回路入り2入力セレクタにしちゃう。
だってほら、その部分てANDとORのコンビネーションで、セレクタっぽい回路になってるっしょ?
ちゅーワケで、そのまんま汎用ロジックIC向けにアレンジした回路は↓こんなふうになる。

え、ドコがソノマンマだって? ん〜言われて見れば、ずいぶん違うよーな気もする。
DIR信号を作る方向決定FlipFlopを、74xx157と74xx273の余ってる部分で無理やり作っちゃったからねぇ。
それに合わせてブートストラップ兼フェイルセーフも強化したからねぇ。
まぁ↓こんなふーにチャンと動いてるんだから、細かいコトは気にしないw

こういう回路を汎用ロジックICでインプリメントするときも、やっぱこの回路ダケが正解ってワケじゃぁ、ない。
機能仕様通りに動けば良いワケだ。まぁ部品の少なさとか、タイミングのシビアさとか、あと使用部品のコストとか入手性って問題もあるけどねぇ。
例えば、上の回路の74xx273と74xx157の組み合わせって、よーーーく見ると直列入力並列出力付き8bit双方向シフトレジスタになっている。。。わっかるかなぁ?
で、74xxシリーズの中には、それにちょーど良いICがある。地球温暖化により絶滅が危惧されている74xx299ってICだけどね。
これを入手できて使いこなせれば、↓こんな回路も作れる。

この回路だと、先の回路よりもICが1個少ない。でも、動作は↓ほれ、ちゃんと動く。

|
あとがき(どこが?) |
そういえばTVのKitt君は、発光部の数がもっと多くて、光の動く速さも変わったりしてた。スピード出して疾走してる時は光の動きも早くて、ガレージで休んでる時はゆっくりだったりしてた。
点滅速度を変えるのは、最短の点滅周期より早いクロックを使って、可変分周器で可変周波数の点滅周期クロックを作ればいい。
そういえばTVのKitt君は、喋ったり、自分で勝手に走ったりしてた。
でも、これはちょっと源内CADじゃ無理だなぁ。
源内CADで扱える回路規模がもちっと大きかったら作って見せてあげれるのに、残念だねぇ(^o^;
|