職業訓練31日目 PLD基本設計 テキスト入力(VHDLによる設計)
本日の講義も昨日の課題の続き。
3bitバイナリカウンタは一応出来てたので、
7セグLED表示も、積和構造で出来るかやってみました。
「when句使っちゃったらビヘイビアじゃん」
と思って訊いてみたら、
「when句は真理値表みたいなもので論理圧縮できるので、十分RTLレベルですよ」
って言われたので、敢えて積和にする必要もないのだけれども…。
状態遷移図は、お絵描きの仕方分からないからパスして真理値表から。
真理値表
Q2 | Q1 | Q0 | a | b | c | d | e | f | g |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
カルノー図
- a
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | レ | |
1 | レ | レ | レ |
→a = !Q2 !Q0 + Q2 Q0 + Q1
- b
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | レ | レ |
1 | レ | レ |
→b = !Q2 + !Q1 !Q0 + Q1 Q0
- c
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | レ | |
1 | レ | レ | レ | レ |
→c = !Q1 + Q0 + Q2
- d
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | レ | |
1 | レ | レ |
→d = !Q2 !Q0 + Q2 !Q1 Q0 + !Q2 Q1 + Q1 !Q0
- e
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | ||
1 | レ |
→e = !Q2 !Q0 + Q1 !Q0
- f
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | |||
1 | レ | レ | レ |
→f = !Q1 !Q0 + Q2 !Q1 + Q2 !Q0
- g
Q2\Q1 Q0 | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | レ | レ | ||
1 | レ | レ | レ |
→g = Q2 !Q1 + !Q2 Q1 + Q1 !Q0
(もしくは、Q2 !Q1 + !Q2 Q1 + Q2 !Q0)
VHDL
-- 昨日のデコーダ部分を以下の記述で置き換える LED(0) <= not( (not(Q2) and not(Q0)) or (Q2 and Q0) or Q1 ); LED(1) <= not( not(Q2) or (not(Q1) and not(Q0)) or (Q1 and Q0) ); LED(2) <= not( not(Q1) or Q0 or Q2 ); LED(3) <= not( (not(Q2) and not(Q0)) or (Q2 and not(Q1) and Q0) or (not(Q2) and Q1) or (Q1 and not(Q0)) ); LED(4) <= not( (not(Q2) and not(Q0)) or (Q1 and not(Q0) ); LED(5) <= not( (not(Q1) and not(Q0)) or (Q2 and not(Q1)) or (Q2 and not(Q0) ); LED(6) <= not( (Q2 and not(Q1)) or (not(Q2) and Q1) or (Q1 and not(Q0)) );
徒労でしょうか…。
いいえ、明日に…。
あと、ちょっとハマったのは、
ブザーを鳴らす回路を作ろうとして、
全然鳴らないなぁ、と思っていたら、
ブザー出力をprocess文内に書いてました。
process文内に出力を書いちゃダメなんだって。
以後気をつけます。
4bitバイナリカウンタも真理値表書いてやってみたんだけど、
カウンタ部分がなぜかうまくいきませんでした…orz
ビヘイビア記述だったらラクなんだけどな。
if (COUNT = "1001") then COUNT <= "0000"; else COUNT <= COUNT + '1'; end if;