目次CPLD入門アップ・ダウンカウンタ


4ビット バイナリアップダウンカウンター
ソースコード/解説



001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
--******************************************************************************
--*                                                                            *
--*      Synchronous Binary 4bits Up-Down Counter without Carry/Borrow         *
--*                                                     Device : XC9536-PC44   *
--*                                                     Author : Seiichi Inoue *
--******************************************************************************

library ieee;                                    -- Library declaration
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity UD_COUNTER1 is
  port ( CLK,CLEAR,LOAD,CE,UP : in std_logic;    -- INPUT and OUTPUT declaration
         DIN : in std_logic_vector(3 downto 0);
         Q : out std_logic_vector(3 downto 0));
  attribute pin_assign : string;                 -- Pin assign
  attribute pin_assign of CLK : signal is "1";
  attribute pin_assign of CLEAR : signal is "2";
  attribute pin_assign of LOAD : signal is "3";
  attribute pin_assign of CE : signal is "4";
  attribute pin_assign of UP : signal is "8";
  attribute pin_assign of DIN : signal is "38,37,36,35";
  attribute pin_assign of Q : signal is "14,13,12,11";
end UD_COUNTER1;

architecture UD_COUNTER_ARCH of UD_COUNTER1 is
signal Q_IN : std_logic_vector(3 downto 0);      -- Internal counter signal
begin
  Q <= Q_IN;                                     -- Set output
  process( CLEAR, CLK, LOAD, CE, UP ) begin
    if CLEAR='1' then                            -- CLEAR = ON ?
       Q_IN <= "0000";                           -- Yes. Counter clear
    elsif CLK='1' and CLK'event then             -- Clock in ?
       if LOAD='1' then                          -- Yes. LOAD = ON ?
          Q_IN <= DIN;                           -- Set Input to Output
       else                                      -- LOAD = OFF
          if CE='1' then                         -- Count Enable ?
             if UP='1' then                      -- Yes. Up count ?
                Q_IN <= Q_IN + '1';              -- Yes. Count-up
             else                                -- Not count-up
                Q_IN <= Q_IN - '1';              -- Count-down
             end if;
          end if;                                -- Not CE = 1
       end if;
    end if;
  end process;
end UD_COUNTER_ARCH;

--******************************************************************************
--*             end of Synchronous Binary 4bits Up-Down Counter                *
--******************************************************************************

解説
行番号コメント
010039,041で使っている演算のためにこのライブラリが必要です。
014カウンターをプリセットするための入力を4ビットの配列で指定します。
015カウンターの出力も4ビットの配列で指定します。
016
-023
入力/出力のピンを指定します。
027 内部の論理演算で使用するカウンターを定義します。
これは出力(OUT)として指定したものはエンティティ内部では使用できないというVHDLの制約があるためです。
出力と同じように4ビットの配列で指定します。
029内部演算用のカウンタを出力カウンタに結びつけます。
031
032
最初にCLEAR入力の判断をします。
CLEAR入力が'1'(Hレベル)の場合、カウンタをクリア(0000)にし、処理を完了します。
033 CLEARが'1'で無いときにこのロジックに進みます。
クロック(CLK)が0から1に変化した場合(カウントモード)の判断をします。
「CLK='1' and CLK'event」はCLKが'0'から'1'に変化したことを検出する記述です。
034クロックがカウントモードの場合、ロード(DOAD)入力の判断をします。
035ロード指定(LOAD=1)の場合、データ入力(DIN)をカウンタに設定し、処理を完了します。
036ロード指定でない(LOAD=0)の場合、037に進みます。
037 カウント指定(CE=1)の場合、カウント処理(038)に進みます。
そうでない場合には処理を完了します。カウントはされません。
038 カウントアップ指定(UP=1)の場合、カウントアップ処理(039)に進みます。
そうでない場合(カウントダウン)、カウントダウン処理(040)に進みます。
039カウントを1つ加算します。加算後、処理を完了します。
040
041
カウントを1つ減算します。減算後、処理を完了します。