真理とは何か
TRANSCRIPT
3値論理の場合の真理値表
False Unknown True
False False False False
Unknown False Unknown Unknown
True False Unknown True
AND
OR
False Unknown True
False False Unknown True
Unknown Unknown Unknown True
True True True True
確かめてみる (oracle)
• 比較• 真
select 1 from dual where ('1' = '1');
• 偽select 1 from dual where not('1' = '0');
• Unkhownselect 1 from dual where ('1' = null);
select 1 from dual where not('1' = null);
どちらもヒットしない
ヒットする
ヒットする
※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。
確かめてみる (oracle)
• ANDselect 1 from dual
where (1 = 1) and (null = null);
select 1 from dual
where not((1 = 0) and (null = null));
• ORselect 1 from dual
where (1 = 1) or (null = null);
select 1 from dual
where not((1 = 0) or (null = null));
True
False
Unkown
※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。
確かめてみる (oracle)
• ANDselect 1 from dual
where (1 = 1) and (null = null);
select 1 from dual
where not((1 = 0) and (null = null));
• ORselect 1 from dual
where (1 = 1) or (null = null);
select 1 from dual
where not((1 = 0) or (null = null));
ヒットしない [Unknown判定]
ヒットする [not(False)判定]
ヒットしない [Unknown判定]
ヒットする [True判定]
※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。
3値論理の論理演算結果の覚え方
False (=0) Unknown (=1.5) True (=1)
False (=0) False False False
Unknown (=1.5) False Unknown Unknown
True (=1) False Unknown True
AND
OR
False (=0) Unknown (=1.5) True (=1)
False (=0) False Unknown True
Unknown (=1.5) Unknown Unknown True
True (=1) True True True
False < Unknown < True を満たす数値をてきとーに割り当てて、・AND は値のもっとも小さいもの・OR は値のもっとも大きいもの
が結果になります。
ちなみに null と NaN は違う (oracle)
create table test (
a BINARY_FLOAT
);
insert into test values (1000000.0);
insert into test values (0.0000001);
insert into test values (BINARY_FLOAT_INFINITY);
insert into test values (BINARY_FLOAT_NAN);
insert into test values (NULL);
select * from test where a > 0
※上記は、http://sqlfiddle.com/ で Oracle 11g に設定して確認することができます。
null はヒットしないが、NaN はヒットする
Order by だと null が最大になる?
• 処理系依存。• データベースによって異なる。
• 指定で変えられる。 (oracle)
• select * from test order by a nulls first
• select * from test order by a nulls last
9値論理
Character 意味
'U' uninitialized 未初期化
'X' strong drive, unknown logic value 強い 不明
'0' strong drive, logic zero 強い 0
'1' strong drive, logic one 強い 1
'Z' high impedance ハイインピーダンス
'W' weak drive, unknown logic value 弱い 不明
'L' weak drive, logic zero 弱い 0
'H' weak drive, logic one 弱い 1
'-' don't care 不関知
なにこれ?
• VHDL という言語で定義されている論理型 (std_logic 型)
• IEEE1164 に定義されている。https://en.wikipedia.org/wiki/IEEE_1164
• 3値論理と違って数学的な論理ではなく、電気回路にとって都合がよいように定義している(のだと思う)
9値論理の場合の真理値
and
U X 0 1 Z W L H - /
U U 0 U U U 0 U U U
X 0 X X X 0 X X X
0 0 0 0 0 0 0 0
1 X X 0 1 X 1
X X 0 X X Z
X 0 X X W
0 0 0 L
1 X H
X -
or
U X 0 1 Z W L H - /
U U U 1 U U U 1 U U
X X 1 X X X 1 X X
0 1 X X 0 1 X 0
1 1 1 1 1 1 1
X X X 1 X Z
X X 1 X W
0 1 X L
1 1 H
X -
not
U X 0 1 Z W L H -
U X 1 0 X X 1 0 X
ところで「不明」は null っぽいとしても、「強い」「弱い」って何よ?
Character 意味
'U' uninitialized 未初期化
'X' strong drive, unknown logic value 強い 不明
'0' strong drive, logic zero 強い 0
'1' strong drive, logic one 強い 1
'Z' high impedance ハイインピーダンス
'W' weak drive, unknown logic value 弱い 不明
'L' weak drive, logic zero 弱い 0
'H' weak drive, logic one 弱い 1
'-' don't care 不関知
強い
弱い
答え。
• 強い信号と弱い信号が衝突した場合、強い信号が有効になる。
resolution
U X 0 1 Z W L H - /
U U U U U U U U U U
X X X X X X X X X
0 X 0 0 0 0 X 0
1 1 1 1 1 X 1
Z W L H X Z
W W W X W
L W X L
H X H
X -
解決関数という謎のしくみがある
なぜ、強い信号と弱い信号があるのか
• 多分、抵抗の存在を省略して、プルアップ回路やプルダウン回路を表現したかったから。
• 本当のところは知りません。だれか教えてください(汗
Vcc
GND
OUT
ここは「強い1」 ( =‘1’ )
ここは「弱い0」 ( =‘L’ )
解決関数の注意点
• ただ、実際のところ、マルチドライバー(複数の信号を一つの入力に割り当てる)は、FPGAデバイス実機に対しては有効でない。(少なくとも Spartan 3E は)
• テストベンチ用のコードなど、シミュレーションでは有効。
• 言語仕様上有効だからと言って、実際にデバイスに適用できるわけではない点に注意。