職業訓練30日目 PLD基本設計 テキスト入力(VHDLによる設計)

本日は、課題で3bitバイナリカウンタをVHDLで作りました。
なので、作った回路を晒そうかと思います。
出力は、7セグメントLEDです。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGHNED.ALL;

entity bit3BinaryCounter is
PORT ( SW1 : in std_logic;
        GCK : in std_logic;
        LED : out std_logic_vector(6 downto 0));
end bit3BinaryCounter;

architecture RTL of bit3BinaryCounter is
    -- 7セグ表示パターンの定数
    constant SEG_0 : std_logic_vector(6 downto 0) := "0111111";
    constant SEG_1 : std_logic_vector(6 downto 0) := "0000110";
    constant SEG_2 : std_logic_vector(6 downto 0) := "1011011";
    constant SEG_3 : std_logic_vector(6 downto 0) := "1001111";
    constant SEG_4 : std_logic_vector(6 downto 0) := "1100110";
    constant SEG_5 : std_logic_vector(6 downto 0) := "1101101";
    constant SEG_6 : std_logic_vector(6 downto 0) := "1111101";
    constant SEG_7 : std_logic_vector(6 downto 0) := "1101111";
    constant SEG_8 : std_logic_vector(6 downto 0) := "1111111";

    signal CLK : std_logic;
    signal C0  : std_logic;
    signal C1  : std_logic;
    signal SW  : std_logic;
    signal Q0  : std_logic;
    signal Q1  : std_logic;
    signal Q2  : std_logic;
    signal CNT : std_logic_vector(2 downto 0);
    signal LED_OUT : std_logic_vector(6 downto 0);

    -- マジックナンバーみたいで数字で管理したくないんだけど、
    -- カウンタ回路で論理演算するときの、項の番号を変数名に付けておく。
    signal Q1_1 : std_logic;
    signal Q1_2 : std_logic;
    signal Q1_3 : std_logic;
    signal Q2_1 : std_logic;
    signal Q2_2 : std_logic;
    signal Q2_3 : std_logic;
    signal Q2_4 : std_logic;
begin
    CLK <= GCK2;

    -- カウンタ回路の論理をあらかじめ定義しておく
    Q1_1 <= (not Q1) and Q0 and SW;
    Q1_2 <= Q1 and (not SW);
    Q1_3 <= Q1 and (not Q0);
    Q2_1 <= (not Q2) and Q1 and Q0 and SW;
    Q2_2 <= Q2 and (not SW);
    Q2_3 <= Q2 and (not Q0);
    Q2_4 <= Q2 and (not Q1);
process(CLK)
begin
    if (CLK'event and CLK = '1') then
        -- SW回路
        C0 <= SW1;
        C1 <= C0;
        SW <= not C0 and C1;

        -- カウンタ回路
        Q0 <= Q0 xor (not SW);
        Q1 <= Q1_1 or Q1_2 or Q1_3;
        Q2 <= Q2_1 or Q2_2 or Q2_3 or Q2_4;
    end if;
end process;
    -- 3つの出力を合わせて3bitの数値にする
    CNT(2) <= Q2
    CNT(1) <= Q1
    CNT(0) <= Q0

    -- 7セグ表示用デコーダ
    LED_OUT <=
    SEG_0 when CNT = "000" else
    SEG_1 when CNT = "001" else
    SEG_2 when CNT = "010" else
    SEG_3 when CNT = "011" else
    SEG_4 when CNT = "100" else
    SEG_5 when CNT = "101" else
    SEG_6 when CNT = "110" else
    SEG_7 when CNT = "111" else
    SEG_8;

    -- LEDに出力
    LED <= not LED_OUT;
end RTL;

手元に検証できる環境がないから、合ってるかどうかちょっと不安ですが…。

結局、状態遷移図とか真理値表とか回路図がないと意味分かんないですね…orz

7セグメント1つ1つカルノー図を書いて、
100%RTL記述のものも書いたんですが、時間がないのでこの辺で。