変更履歴
2005/2/20 Ver 1.000 開始
2005/2/23 Ver.1.001 追加
2005/2/26 Ver.1.002 追加
2005/2/27 Ver.1.003 追加
2005/3/12 Ver.1.004 追加
2005/3/13 Ver.1.005 追加
2005/3/20 Ver.1.006 追加
2005/4/2 Ver.1.007 追加
2005/4/22 Ver.1.008 追加
2005/5/7 Ver.1.009 追加
2005/5/14 Ver.1.010 追加
2005/5/21 Ver.1.011 追加
2005/6/18 Ver.1.012 追加
2005/7/12 Ver.1.013 訂正
【始めに】
これは、とある会社にいたころ新入社員向けの教本として書いたものを手直して加筆するものであります。ここにかかれることは、HDLが主流になった今ではまったくナンセンスかもしれません。私自身AHDLで終わっていますからもう時代遅れでしょう。
第1章 ブール代数
定理1.A+0=A
2.A*1=A
3.A+A=A
4.A*A=A
さて、ここで、変数Aは0,1のいずれかです。
A+Bは論理和(OR)といいます。文字道理足し算です。但し、1+1=1となるところが違います。言葉でいうとAかBかのいずれかとなります。
A*Bは論理積(AND)といいます。文字道理掛け算です。下の表に様になります。言葉でいうとAかつBとなります。
A | B | A+B | A*B |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
たいていこの表で躓くんじゃないでしょうか。この表を真理値表といいます。これ以上先になるともういやだとなるでしょう。
/A実際は、Aの上に水平線を引きますがここでは/を使います。論理否定(NOT)といいます。
A | /A |
0 | 1 |
1 | 0 |
それぞれの回路記号は、以下にしめすとおりで左が入力右が出力です。
NOTの後ろに丸がありますね。これがNOTです。三角はバッファを表しています。
したがって、ANDの後ろに丸がつくとNOT出力となります。これをNANDといい、ORに丸がつくとNORになります。
後で出てきますが丸は後ろばかりでなく入力につけるときがあります。
これらの記号は、いわゆるMIL記号で、MIL表記では、配線は丸から始まると反対は丸で受けることになっています。この方法は回路を理解するのは実にいい方法ですが同じICが違うシンボルになるという点がありますが、非常にわかりやすいです。
日本の学会では別の記号を使っていますがこれでかかれた回路はMILで書かれたかかれたものとちがって理解するのはきわめて困難でしょう。ですから実社会ではいまだにMIL記号です。IEC記号というのもあります。
さて、
定理5.A+/A=1
定理6.A*/A=0
定理7./(/A)=A
定理8.A+1=1
定理9.A*0=0
定理10.A*B=B*A 交換の法則
定理11.A+B=B+A 交換の法則
定理12.A*(B+C)=A*B+A*C 分配の法則
定理13.A*B+A*C=A*(B+C) 結合の法則
ここまでは普通の算数をイメージすればよいでしょう。
定理14.A+A*B=A
【証明】
A+A*B=A*1+A*B=A*(1+B){定理8}=A*1{定理2}=A
定理15.A*(A+B)=A
【証明】
A*(A+B)=A*A+A*B=A+A*B=A
定理16.A*(/A+B)=AB
【証明】
A*(/A+B)=A*(/A)+A*B=0+A*B=A*B
定理17.A+/A*B=A+B
【証明】
A+/A*B=A*(1+B)+/A*B=A+A*B+/A*B=A+B*(A+/A)=A+B
定理18./A*(A+B)=/A*B
【証明】
/A*(A+B)=/A*A+/A*B=/A*B
定理19./A+A*B=/A+B
【証明】
/A+A*B=/A*(1+B)+A*B=/A+/A*B+A*B=/A+B*(/A+A)=/A+B
定理20.(A+B)*(/A+C)=A*C+/A*B
【証明】
(A+B)*(/A+C)=A*C+/A*B+B*C=A*C+/A*B+(/A+A)*B*C=A*C+/A*B+A*B*C+/A*B*C=A*C*(1+B)+/A*B*(1+C)=A*C+/A*B
定理21./(A+B)=/A*/B ド・モルガンの法則
定理22./(A*B)=/A+/B ド・モルガンの法則
定理23.(A+B)*(C+D)=A*C+B*C+A*D+B*D
定理24.A*B+C*D=(A+C)*(A+D)*(B+C)*(B+D)
定理25.A*B+C*D=(A*B+C)*(A*B+D)
定理26.(A+B)*(A+/B)=A
以上カルノー図などをつかわないで数式処理だけでやってきました。
第2章 順序回路
1.順序回路構成要素
順序回路は入力に変化がなければ今の状態を保ちます。今入力があって変化したときの結果Qとなったり、かわらなかったりしたときQn-1と記述し、前の状態を示します。Q、Qn-1 は1または0です。
1−1.R-Sフリップフロップ
これはR-Sフリップフロップといいます。
R | S | Q |
0 | 0 | Qn-1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 禁止 |
SはSet RはResetの意味で、SetするとQは1にセットされ、ResetするとQはリセットされて0になります。
SetもResetもしなければ現状維持です。
では、SetとResetを同時に入れるとどうなるでしょうか。答えは不定です。したがって、この組合せは禁止扱いとなっています。
1−2.Dフリップフロップ
Dフリップフロップはクロックの立ち上がりでD端子を読み込んでQに出力します。
D | CK | Q |
X | 0 | Qn-1 |
X | 1 | Qn-1 |
0 | ↑ | 0 |
1 | ↑ | 1 |
注:Xは0か1のいずれか。
実際のDFF(以下フリップフロップをFFと記述する)にはS,R端子があります。これはR-SFFと同じです。
1−3.JK−FF
JK−FFはR-SFFの一種で、クロックの立ち上がりで、R-Sします。JがS、KがRに相当します。但し、J=K=1のときQ=/Qn-1つまり今の状態が反転します。
J | K | CK | Q |
X | X | 0 | Qn-1 |
X | X | 1 | Qn-1 |
0 | 0 | ↑ | Qn-1 |
0 | 1 | ↑ | 0 |
1 | 0 | ↑ | 1 |
1 | 1 | ↑ | /Qn-1 |
1−4.T-FF
T-FFはJKをつないでTという名前にしたJK-FFです。Tが1のときクロックがくるたび反転します。
下図をタイミングチャートと言います。時間は左から右に流れます。CK,T,Qは
0,1の2つの値なので、こういう風に書きます。
Tが0の間はQはCKがきても変化しませんが1になるとCKのたびに反転します。この図で、CKとQを見比べるとCKの周期とQの周期が倍になっていますね。つまり、周波数が半分になったので、分周されたといいます。これからわかるように、JKとTはカウンタによく使われました。
2.順序回路
順序回路とは、今の状態から入力端子の状態によってクロックごとに状態が遷移してゆく回路の総称です。
これは、状態S0、S1,S2,S3,S4,S5の6つを持つ順序回路の状態遷移図です。これは入力端子の無い順序回路です。いま、S2なら次は矢印に従ってS3になります。
第3章 組合せ論理回路
3−1.ゲート回路
ゲート(AND、OR,NOTの総称)ばかりで構成されているものを組合せ論理回路といいます。ゲートの組合せですから、と考えて結構です。
では、どんなものがあるでしょう。たとえば、セレクタ、デコーダ、エンコーダなどがあります。
セレクタとは、選択回路、デコーダ、エンコーダはある符号から別の符号への変換機です。
4:1のセレクタを設計してみましょう。4:1とは4本から1本を選択するという意味です。
となります。4個のANDの出力を4入力のORで論理和をとっています。この回路の論理式では、
出力=入力A*選択A
+入力B*選択B
+入力C*選択C
+入力D*選択D
です。
いま、選択A以外の選択が全部0だとすると、
出力=入力A*選択A
となります。ここで、選択A=1なら、
出力=入力A
となりますね。
同じように、考えて、選択A-Dのいずれかひとつだけが1であれば、その選択の入力が出力されます。これで、4つ入力が選択できることがわかりましたね。
さて、選択Aと選択Bがともに1になったら出力=入力A+入力Bとなってしまいますね。こういうことすなわち必要な条件に対して余分な組合せがあることを冗長性があるといいます。後で説明しますが、選択入力が4本なので、16通りの組合せがあります。そのうち4つだけ使っているので12の冗長性があるわけです。
4つだけの組合せをつくるには2本ですみます。
A1 | A0 | 選択A | 選択B | 選択C | 選択D |
0 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 1 |
その2本をA1、A0として真理値表を書いてみますとこうなります。これから選択=1のみ必要ですから、それをピックアップして
選択A=/A1*/A0
選択B=/A1*A0
選択C=A1*/A0
選択D=A1*A0
がもとまります。
選択Aが1の条件を探すとA1=0、A0=0ですから、NOTになります。それで、/A1と/A0となります。ということは、0のところは、/をつけて1のところはつけなくていいということに気づきます。
これを回路にすると
となります。なおこれを2to4のデコーダといいます。/A1のNOT2つと/A0のNOT2つは同じなので、NOTを配線で共有してあります。
もう一度全体を整理してみましょう。
A1 | A0 | 選択A | 選択B | 選択C | 選択D | 出力 |
0 | 0 | 1 | 0 | 0 | 0 | 入力A |
0 | 1 | 0 | 1 | 0 | 0 | 入力B |
1 | 0 | 0 | 0 | 1 | 0 | 入力C |
1 | 1 | 0 | 0 | 0 | 1 | 入力D |
この表から選択を消去してこういう風にはいきませんか。
出力=/A1*/A0*入力A
+/A1*A0*入力B
+A1*/A0*入力C
+A1*A0*入力D
これを回路にすると、
ちょっと見ずらいですがこうなります。
ここでは、表から論理式を導きました。表以外にフローチャートからも論理式が導けます。
さて、A=Bという式が出てきました。これは一致回路を使います。EX-NORです。EX-OR(以下EXORと書く)の出力にNOTをつけたものです。EXORは排他的論理和という難しい名前がついていますが不一致回路といったほうがわかりやすいです。
A | B | EXOR | EX-NOR |
0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
真理値表です。EXORはA,Bが不一致のとき1でEX-NORは一致しているとき1ですね。
回路シンボルはこうなります。EX-NORは後ろに○がついていますね。
さて、出力A=B=Cは一番右の流れですがA=BでさらにB=Cなのでこの流れはANDになります。つまり、判断を重ねるとそれぞれのANDになります。
こうなります。では縦の流れはどうでしょうか。2つの矢印が集まっていますね。このことからORが必要ですね。しかもNOですから/(A=B)OR/(A=C)となりますね。さらにB=Cを重ねるからANDになりますね。
(A<>B=C)出力=(/(A=B)+/(A=C))*(B=C)
(A<>B<>C)出力=(/(A=B)+/(A=C))*/(B=C) NOだから(B=C)に/がつきます。
となります。
と回路はできました。使っているEScadに2入力のORが無かったので3入力のORを使っています。これは余りゲートを処理するときよく使う方法です。
さてここで、定理22のド・モルガンの法則を使うともう少し違ってきますが、MIL表記では○と○でつないだ線はNOTのNOTですからNOTが要らなくなりますから、
と簡略化できます。EX-NORがEXORになっているのに注意してください。
以上から、フローチャートは判断を重なるときはAND、集まるときはORに置き換えればよいことがわかりました。また、NOの出口には/をつけることもわかりました。
3-2.MIL表記の利点
さて先に出てきたEXORの論理式は、
出力=/A*B+A*/B
です。
話を戻して、下の回路は、一体どんな回路でしょうか。
出力=/(/(A*B)*/(C*D)*/(E*F))
と書き出せますが/がいっぱいあってさっぱりわかりません。
この例はNANDを3つ並べたかったのでむりやり論理式を組んだので論理式を悩む必要はありません。
MIL表記では○で始まった線は○で受けますので、後ろのNANDはド・モルガンの法則により、入力が○のORになります。
となります。まだ回路が読みにくいので、○と○はNOTのNOTですから消えますので、
と書き直せます。これは、簡単に論理式がかけますね。
出力=A*B+C*D+E*F
では、出力の○を入力に持ってきたときどうなるか示しましょう。
ド・モルガンの法則はこういうことだったんですね。つまり、AND系はOR系にOR系はAND系に化けるということですね。
3−3.演算回路
われわれが普通に使うのは10進数です。進数というのは一桁で使う記号の数でそれを使い切るとけた上がりします。10進数は0〜9の10個の記号を使い、記号を使い切るとけた上がりします。たとえば、9の次は10ですね。桁が上がりしていますね。
ここでは2進数を取り上げます。2進数ですから記号は2つ、つまり0と1です。ですから0、1と数えてきて記号を使い切ったので桁上がりして10になります。
10進数 | 2進数 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
これは15までの10進数と2進数の対応表です。2進数の一番下の桁は0と1を繰り返していますね。一桁上は、0が2回1が2回交互に現れます。その上の桁は0が4個1が4個という風になります。
さて、足し算をしてみましょう。
100 (4)
+ 11 (3)
--------
111 (7)
とやります。普通に計算と同じですね。
101 (5)
+ 11 (3)
--------
1000 (8)
ここでは1+1=10となるので、桁上がりがあったので、こうなります。
さて整理しましょう。
一桁の2進数A、Bの足し算は、
A | B | Cout=桁上がり | S=A+B |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
となります。この真理値表から桁上がり(Cout)はA AND B また、S(和)の(A+B)は不一致回路ですね。ですからS=A EXOR Bとなります。
桁上がりをキャリーといいます。和をSUMというのでSとします。これを半加算器といいます。ではなぜ半なのでしょうか。理由は下からの桁上がりが考慮されてないからです。
でも、この半加算器を2個組み合わせるとちゃんとした全加算器が出来ます。
3入力のORを使っていますが回路図を書くEScadというソフトに2入力のORが無いのでこうしています。深い意味はありません。四角い箱は半加算器をあらわしています。
Cin | A | B | Cout | S |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
これが全加算器の真理値表です。
全加算器をこの箱の記号を使うことにしましょう。
一桁の加算器が出来ればこれを並べれば何桁でも出来ますね。では4桁の加算回路を示しましょう。
4桁の数Aを各桁の数をA=A3A2A1A0とあらわしました。B=B3B2B1B0、和S=S3S2S1S0、桁上がりCoutです。
論理回路には引き算回路はありません。でも加算器で引き算を行います。
引き算の前に、掛け算をやっておきましょう。
掛け算は、
1001
X) 101
--------------------
1X 1001
0X 1001
1X 1001
---------------------
1001
0000
1001
---------------------
101101
と普通の筆算です。ただ掛ける数が0か1だけなの違いです。
1や0をかけるということは、ANDをとることにほかなりません。
足す数はA3,A2,A1,A0で共通です。これにB0とANDをとって加算し、桁移動してB1とANDをとって加算する、さらに桁移動してB2とANDをとって加算することになります。
加算器ばかりの回路になりますが、ページに入らないので省略します。
引き算は、補数を使います。補数というと、また、算数かと思われますが、1の補数にかぎっていえば、NOTです。1の1の補数は0、0の1の補数は1です。つまり、引く数を0を1、1を0に入れ替えるのです。
0110
- 0011
----------
0011
ですが、これを補数では、0011を1,0入れ替えて1100として足します。
0110
+)1100
-----------
10010
となりますね。最上位は捨てるので、0010で1足りません。そこで、1を足してやります。
では、これは何をやっているかというと、10進数でたとえると9の補数で考えるとわかりやすいでしょう。
5678
-) 3456
-----------
を9の補数つまり各桁の数を9から引きますと、3456は6543になります。9-3=6、9-4=5、9-5=4,9-6=3 つまり9999-3456=6543ですね。これを足すわけです。
5678
+)6543
--------
12221
ですね。最上位の1はすてて1を足すと2222であっていますね。式で書いてみると
5678+(9999-3456)-10000+1=5678-3456=2222
ですね。まちがっていませんね。
したがって、引き算は引く数を各桁ごとにNOTをいれて加算し最後に1を足すことになります。
A3A2A1A0引くB3B2B1B0の引き算回路です。1を足す部分は、ここでは、最下位の全加算器のキャリーに1を入れています。
以上組合せ論理回路を終わり、順序回路と組合せ論理回路の合成と進みます。
第4章 カウンタの設計
4−1.カウンタの概念
カウンタとは、数える機械です。クロックが来るたびに1ずつ増えてゆきます。
カウンタの回路は皆こうなっています。DFFがJKやRSTなど変わっても基本は同じです。
動作は、ラッチ(D-FFの集まり)が今の値です。これをもとに次の値を発生させて次のクロックでこれを読み込みます。
これは、同期式カウンタの概念ですが、非同期式カウンタというのもあります。これは、ハザード、メタステーブルなどいろんな問題を発生しますので以後扱いません。ゲートアレーの中にこれがあるとテストパターンは同期パターンですからうまく動くのですが、実際ではわけのわからない苦労を背負い込みますからそんなものを知ること自体罪悪なのです。
4−2.5進カウンタ
それでは、5進カウンタのQとDの対応表を以下に示します。
Q2 | Q1 | Q0 | D2 | D1 | D0 | |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
3 | 0 | 1 | 1 | 1 | 0 | 0 |
4 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | ・ | ・ | ・ | ・ | ・ | ・ |
2 | ・ | ・ | ・ | ・ | ・ | ・ |
これより、
D0="0"+"2"=/Q2*/Q1*/Q0+/Q2*Q1*/Q0=/Q2*/Q0*(/Q1+Q1)=/Q2*/Q0
D1="1"+"2"=/Q2*/Q1*Q0+/Q2*Q1*/Q0
D2="3"=/Q2*Q1*Q0
したがって、
が設計できます。しかし、ここで注意しておかないといけないことがあります。ここではDFFを3個使っていますので、3bitのカウンタですが、3bitであらわせる数字は、ほかにここで使われてない5,6,7があります。もし電源オン時にこれらの値になったときどうなるでしょうか。
Q2 | Q1 | Q0 | D2 | D1 | D0 | |
5 | 1 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
Q2 | Q1 | Q0 | D2 | D1 | D0 | |
6 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
Q2 | Q1 | Q0 | D2 | D1 | D0 | |
7 | 1 | 1 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
いずれも正常にカウントしていますね。このようにカウンタを設計するときは、冗長なコードについても確認しておく必要があります。
4−3.8進カウンタ
8進カウンタの真理値表を以下に示します。
Q2 | Q1 | Q0 | D2 | D1 | D0 | |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
3 | 0 | 1 | 1 | 1 | 0 | 0 |
4 | 1 | 0 | 0 | 1 | 0 | 1 |
5 | 1 | 0 | 1 | 1 | 1 | 0 |
6 | 1 | 1 | 0 | 1 | 1 | 1 |
7 | 1 | 1 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 | 1 |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
これから、
D0="0"+"2"+"4"+"6"=/Q0
D1="1"+"2"+"5"+"6"=Q1 EXOR Q0
D2="3"+"4"+"5"+"6"=/Q2*Q1*Q0+Q2*(/Q1*/Q0+/Q1*Q0+Q1*/Q0)=/Q2*Q1*Q0+Q2*(/Q1+Q1*/Q0)=/Q2*Q1*Q0+Q2*(/Q1+/Q0)
ちょっと途中経過を端折りました。
となります。
では、T-FFをつかった場合を考えてみましょう。TFFはT=1でクロックごとに反転しますから、以下の真理値表になります。Qを反転させる前で、Tを1にしてやればよいわけですから、こうなります。
Q2 | Q1 | Q0 | T2 | T1 | T0 | |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 1 |
2 | 0 | 1 | 0 | 0 | 0 | 1 |
3 | 0 | 1 | 1 | 1 | 1 | 1 |
4 | 1 | 0 | 0 | 0 | 0 | 1 |
5 | 1 | 0 | 1 | 0 | 1 | 1 |
6 | 1 | 1 | 0 | 0 | 0 | 1 |
7 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 1 |
2 | 0 | 1 | 0 | 0 | 0 | 1 |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
これより、
T0=1
T1=/Q0
T2=/Q1*/Q0
となります。
先ほどと比べて論理が簡単になりましたね。
TFFのシンボルが無いのでJKFFで代用してあります。JKFFのJKをつないでTと読み替えてください。
T-FFをもう一度整理してみましょう。
T=1で反転するので、DFFとゲートで回路を構成すると、
となります。TFFを使った回路をこれで置き換えて論理展開して整理すると最初にあげたDFFの8進カウンタになります。
もう一度カウンタの概念に戻って、今の値から+1するということから、加算器を使ってみましょう。
これでもカウンタなのです。これの論理を整理すると最初にあげたDFFを使った例になります。
4-4.ジョンソンカウンタ
では、一寸毛色の変わった、ジョンソンカウンタを見てみましょう。これは、タイミング発生器に使われ、生成には2信号のゲートでよいという都合のよい回路です。
このDFFの連続接続をシフトレジスタといいます。シフトレジスタというのは、クロックごとに信号が左から右へとシフトしてゆくので、そういいます。
波形では、このようになります。Q0の波形がQ1、Q2,、Q3と伝播してゆきますね。Q3が1になるとQ0はQ3の反転ですから0になります。こうして繰り返されます。
応用としては、タイミングシーケンスの発生に用いられます。
タイミング信号は、2入力のANDだけで作れますので、重宝します。しかしこのまま使うとディレーがついてますから非同期なので、DFFで受けた方がよいでしょう。すると1クロック遅れますから、その分タイミングを工夫しなければなりません。
これまでのカウンタとは、+1するという意味では、そうなっていません。また、ここでは4bitなので16通りのパターンがありますがここでは8とおりしか使っていないので、冗長性のある回路です。ここでは、使う前にRESETをかけて初期状態を作っています。この回路は、このように使う前に細工が必要なので注意が必要です。
4-5.制御端子つきカウンタ
先の8進カウンタにHOLD、LOAD、CLEARをつけましょう。HOLDはカウントをとめることで、LOADは0-7の値をカウンタにセットしてそこからカウントさせるときに使います。CLEARは0にすることです。
概念的にはこうなります。
M1 | M0 | HOLD | COUNT | LOAD | CLEAR |
0 | 0 | ○ | |||
0 | 1 | ○ | |||
1 | 0 | ○ | |||
1 | 1 | ○ |
となります。各段のDFFをこれに置き換えれば完成です。ここで、CLEARの3入力ANDは条件が成り立つと0なので不要なことが気づきます。
となりますね。
5.マイコン
5−1.マイコンの概念
ノイマン形のコンピュータの概念は
であらわされます。プログラムとデータは同じメモリにあります。これを分けたものも存在します。
アドレスは、メモリの番地で、データはそこに書かれているデータ、あるいはそこに書きたいデータが流れます。
I/Oはメモリ空間に配置されるもの、または、I/O空間に配置されるものがあります。
マイコンではアドレスをアドレスバス、データをデータバスと言います。
5−2.マイコン特有の論理素子
データバスには複数の素子がつながりますので、セレクタで選択するのでもいいのですが、普通は、オープンコレクタかトラーステートバッファが使われます。
オープンコレクタの概念は、この図のようになっており、コレクタを1本の抵抗で共有します。Enable1,2が0ならトランジスタはOFFでコレクタはHになります。するとバッファは反転なので0です。このときEnable1が1になるとコレクタは/Data1でバッファの出力はData1になりますね。同様にEnable1が0、Enable2が1なら出力はData2になりますね。これをワイヤードORといいます。一般的に、トランジスタは論理素子の中に含まれていてこの図のような外付けは特別な理由がない限りありません。
ここでEnableという言葉が出てきましたが、これは許可でバスを使用する許可という意味合いです。
オープンコレクタの欠点は、配線が大きくなると抵抗と浮遊容量で構成される時定数でスピードが制限されることです。
さて、トライステートの概念は、
で、Enableが0のとき2つのトランジスタともOFFで出力はハイインピーダンスとなります。これをHi-Zとかきます。Enableが1ならDataが1なら上のトランジスタがON、したがOFFで出力はH、Dataが0なら逆になり、Lが出力されます。したがって、出力は、H,L,Hi-Zの3つの状態がありますので3状態すなわちスリーステート素子といいます。
これがシンボルです。Enable端子は下の線です。うえはEnableが1でActive下は0でActiveです。
ここでActiveという言葉がでてきますが、Enableになってバスを駆動するときActiveになったといいます。
使い方としてはこのようになります。トライステート素子で注意することは2つ以上の素子のEnableが同時にActiveになると場合によっては上のトランジスタと別素子の下トランジスタがONになってショートして破壊することがあります。
さて、データバスは双方向なので
となります。
5−3.マイコンの制御
マイコンには以上のバッファをコントロールする専用の制御線があります。まず方向を制御するR/W、DE(Data Enable)、AE(Address Enable)などです。この他にメモリとIO線があります。
あとは、割り込み線、リセット線があり、クロック線で構成されます。それぞれのマイコン特有の名前と信号線があります。
以上でマイコンの回路素子は終わりです。
5−4.I/Oポート
I/Oポートには、入力ポートと出力ポートがあります。
入力ポートは、
という感じになります。スリーステートバッファは、シュミットトリガータイプを使います。
シュミットトリガーとは、
のような入力出力特性をもった素子を言います。L→Hに判定する電圧とH→Lに判定する電圧が違うわけです。
ノイズの載った遅い信号がL,Hの判定の境目でノイズでばたばたするのを防ぐ機能があります。
ノイズがあってもシュミットトリガーでは判定がくつがえりませんね。
出力ポートは、
となります。D0-7のデータバスはデータが常に流れているのでこれを一瞬に捕まえて保持する必要があるのでこういう風になります。また、FFの出力は、入力ですので、電線を引き回すとノイズで反転することもあるので必ずバッファを入れます。ここでは、書きませんでしたが、電源ON時に何が出力されるかわからないのでRESETは必要です。
以上でIOポートは終わりですが、ソフトを設計する人のために出力ポートには必ず出力を読み取れる入力ポートをつけるようにしましょう。すると、ビットをON、OFFするのは簡単に出来ますが、これがないと何を出力したか覚えておく必要があり、ソフトが複雑になります。
これらには、よく使われる74シリーズのICにこの機能が入ったものがあります。
出力ポートのタイミングを示します。
ADRESはデータより先に確定するのが普通です。なぜ確定というかと時分割で動いており、バスを占有するバスマスタというときとそうでない時があるからです。たとえば、外付けのDMAコントローラがある場合、アドレスバスは、共有することになります。バスマスタでないときはHi-Zとなっています。したがって、バスは通常Hi-Zになることになります。
ここで、線が2本かかれていますが、H,Lのいずれの場合も書いているからです。
IOwrite信号をストローブ信号といいます。この信号の立ち上がりでラッチします。もちろんたち下がりでもいいですが、セットアップタイムが短くなるので長くなる方を取ります。逆にホールドタイムが短くなります。
セットアップ、ホールドタイムとは、
という具合で、D-FFはCLKの立ち上がりでDATAを読み込みますがそれにはCLKの前にDATAが確定している最小時間の規定があります。これをセットアップタイムといいます。また、CLKの立ち上がり後も一定時間保持している必要がありこれをホールドタイムといいます。
これらの規定を満足しないとメタステーブル状態になります。これは、出力がHとLの中間でしばらく続きやがて入力とは関係なくHかLに落ち着くということです。
メタステーブルは、必ずおきるというのではなくてある確率でおきます。メーカーやFFの回路構成によってその値は異なります。
このメタステーブル対策回路ではメタステーブルよりCLKの周期がながいという前提です。
第6章 復習
さて、以上までのまとめをしてみましょう。するともっと詳細なシーケンスを書かなくてはいけないので、どうしたものかと腐心していましたが、光は100MBまでホームページ無料ということなので、テキストをそのままスキャンすることにしました。ここから、1ページ2MBとなりますがご容赦ください。
いま見直してみると舌足らずの部分が多数見受けられますがご勘弁ください。
ページ1、ページ2、ページ3、ページ4、ページ5、ページ6、ページ7、ページ8、ページ9、ページ10、ページ11、ページ12、ページ13
第7章 タイミング設計
ページ14、ページ15、ページ16、ページ17、ページ18
つづく