職業訓練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;