職業訓練33日目 習得度確認テスト(PLDを用いたデジタル回路設計作業)
課題
2ビットバイナリカウンタの設計・製作
仕様
- クロックでカウント
- クロック入力は1Hz
- 7セグメントLEDはカウントダウンを繰り返し(3,2,1,0,3,2,1,0...)
- カウンタはカウントアップ(00→01→10→11→00...)
悪い例
「カウントダウン」の仕様をすっかり見落とし、
普通にカウントアップする回路を作ったりしてはいけない…orz
それを指摘されて、カウンタ回路をカウントダウンする回路に修正してはいけない…orz
カウンタ回路では、カウントアップをして、
デコーダ回路で、カウントダウンに解釈する。
状態遷移図
お絵描き疲れたからパス…。
遷移図的には、普通のカウンタ回路ですから。
真理値表
- カウンタ回路
Q1 | Q0 | Q1' | Q0' |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 0 |
- デコーダ回路
Q1 | Q0 | a | b | c | d | e | f | g |
---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
カルノー図
- カウンタ回路
・Q1'
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | |
1 | レ |
→Q1' = Q1 !Q0 + !Q1 Q0(Q1 xor Q0)
・Q0'
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | |
1 | レ |
→Q0 = !Q0
- デコーダ回路
・a
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | レ |
1 | レ |
→a = !Q1 + Q0
・b
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | レ |
1 | レ | レ |
→b = 1
・c
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | |
1 | レ | レ |
→c = !Q0 + Q1
・d
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | レ |
1 | レ |
→d = Q1 + Q0
・e
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | |
1 | レ |
→e = Q0
・f
Q1\Q0 | 0 | 1 |
---|---|---|
0 | ||
1 | レ |
→f = Q1 Q0
・g
Q1\Q0 | 0 | 1 |
---|---|---|
0 | レ | レ |
1 |
→g = !Q1
VHDL
今回はVHDL入力だったので、回路図はパス!
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGHNED.ALL; entity sjdTest is PORT ( SW1 : in std_logic; GCK : in std_logic; a : out std_logic; b : out std_logic; c : out std_logic; d : out std_logic; e : out std_logic; f : out std_logic; g : out std_logic ); end sjdTest; architecture RTL of sjdTest is signal CLK : std_logic; signal Q0 : std_logic; signal Q1 : std_logic; signal AD_LGC : std_logic; begin -- テキストでこういう書き方をしてるので同じにしましたが、 -- 意味がない気がする…。 CLK <= GCK; process(CLK) begin if CLK'event and CLK = '1' then -- 2ビットバイナリカウンタ Q1 <= Q0 xor Q1; Q0 <= not Q0; end if; end process; -- aとdは同じロジック AD_LGC = (not Q0) or Q1; -- デコーダ表示部 a <= not( AD_LGC ); b <= not( ((not Q0) or Q1) or (Q0 or (not Q1)) ); c <= not( (not Q0) or Q1 ); d <= not( AD_LGC ); e <= not( Q0 ); f <= not( Q1 and Q0 ); g <= not( not Q1 ); end RTL;