文章<箇条書き<真理値表<式,疑似コード
全体を把握するには文章でよいが、実際に回路に実装するには論理的にあいまいさがないようにする必要がある。
◇
最初は動作を文章に書き下して、例えば、
「複数のデータストリーム入力A,B,Cがあり、Aの入力があればそれを出力し、Aが無ければB、Cの入力を使う。常に何らかの出力を出し続ける必要がある」
と書いたとする。
◇◇
これを箇条書きに直してみると曖昧なところが見えてきて少し明確になる。
・複数のデータストリーム入力A,B,Cがありそのうち1つを選択して出力する
・複数が同時に入力したときの優先順位はA,B,C
・入力がないときは、内部で生成した信号を出力する
◇◇◇
さらに、すべての入力値に対する出力値を真理値表にまとめると、すべての入力パターンが考慮されるので曖昧さがなくなる。
入力 |
出力 |
||
A |
B |
C |
Y |
1 |
x |
x |
A |
0 |
1 |
x |
B |
0 |
0 |
1 |
C |
0 |
0 |
0 |
内部生成 |
この例では入力の有無を0/1で表したが、入力パターンがすべて尽くされていれば自由に書いてよい。
さて、真理値表のようにパターンを列挙する方法は、サイズが大きくなると間違えやすくなる。例えば次の真理値表は大きすぎて意図が読み取れない。
× 大きすぎる真理値表
入力 |
出力 |
|||||||||||||||
A3 |
A2 |
A1 |
A0 |
E15 |
E14 |
E13 |
E12 |
E11 |
... |
E6 |
E5 |
E4 |
E3 |
E2 |
E1 |
E0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
... |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
表が大きくなった要因のひとつは2進数で書いたことなので、10進数16進数に直すとましになる。
○ 10進数16進数に直した真理値表
入力 |
出力 |
A[3:0] |
E[15:0] |
0 |
h0001 |
1 |
h0010 |
2 |
h0100 |
3 |
h1000 |
4 |
h0002 |
5 |
h0020 |
... |
... |
13 |
h0080 |
14 |
h0800 |
15 |
h8000 |
◇◇◇◇
パターンを列挙するよりも、もしアルゴリズム(式、疑似コード)で表現できるならばその方がコンパクトになるのでよい。
表と式で表すと
入力 |
出力 |
|
A[3:0] |
n=A mod 4 |
E[15:0] |
0-3 |
0-3 |
E[4n] = 1 |
4-7 |
0-3 |
E[4n+1] = 1 |
8-11 |
0-3 |
E[4n+2] = 1 |
12-15 |
0-3 |
E[4n+3] = 1 |
この表は式だけで表すこともできて
E[4*A[1:0] + A[3:2] ] = 1
となっている。これをよくみると、実は仕様自体を
E[A[3:0] ] = 1
と決めればよかったことがわかる。
◇◇◇◇◇
以上をまとめると、
文章 < 箇条書き < 真理値表 < 式,疑似コード
という順に、わかりやすく書けるはずである。