目次CPLD入門5進カウンター


5進 カウンター
ソースコード/解説



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
--******************************************************************************
--*                                                                            *
--*                   5 Binary Counter with Count Enable                       *
--*                                                     Device : XC9536-PC44   *
--*                                                     Author : Seiichi Inoue *
--******************************************************************************

library ieee;                                    -- Defines std_logic types
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;


entity Counter5 is
  port ( CLK,CLEAR,CE : in std_logic;            -- Defines ports
         Q5 : out std_logic_vector(2 downto 0));
  attribute pin_assign : string;                 -- Pin Assign
  attribute pin_assign of CE : signal is "1";
  attribute pin_assign of Q5 : signal is "13,12,11";
  attribute bufg: string;
  attribute bufg of CLK : signal is "CLK";
  attribute bufg of CLEAR : signal is "SR";
end Counter5;

architecture Counter5_ARCH of Counter5 is
signal Q5_IN : std_logic_vector(2 downto 0);     -- Defines internal signals
begin
  Q5 <= Q5_IN;                                   -- Set output
  process( CLEAR, CLK, CE ) begin
    if CLEAR='0' then                            -- Clear counter ?
      Q5_IN <= "000";                            -- Yes. Clear counter
    elsif CLK='1' and CLK'event then             -- Clock rising edge ?
       if CE='1' then                            -- Yes. Count Enable ?
          if Q5_IN=4 then                        -- Yes. Count = 4 ?
             Q5_IN <= "000";                     -- Yes. Clear counter
          else                                   -- No
             Q5_IN <= Q5_IN + '1';               -- Count-up
          end if;
       end if;                                   -- Count Disable(Stop)
    end if;
  end process;
end Counter5_ARCH;

--******************************************************************************
--*                          end of 5 Binary Counter                           *
--******************************************************************************

解説
行番号コメント
010036で使っている演算のためにこのライブラリが必要です。
015カウンターの出力を3ビットの配列で指定します。
016
-018
入力/出力のピンを指定します。
019
-021
グローバルピン(GCKおよびGSR)の指定を行っています。
025 内部の論理演算で使用するカウンターを定義します。
これは出力(OUT)として指定したものはエンティティ内部では使用できないというVHDLの制約があるためです。
出力と同じように3ビットの配列で指定します。
027内部演算用のカウンタを出力カウンタに結びつけます。
029
030
最初にCLEAR入力の判断をします。
CLEAR入力が'0'(Lレベル)の場合、カウンタをクリア(000)にし、ロジックを完了します。
031 CLEARが'L'で無いときにこのロジックに進みます。
クロック(CLK)が0から1に変化した場合(カウントモード)の判断をします。
「CLK='1' and CLK'event」はCLKが'0'から'1'に変化したことを検出する記述です。
032 カウント指定(CE=1)の場合、カウント処理(033)に進みます。
そうでない場合にはロジックを完了します。カウントはされません。(カウントストップ)
033
034
カウンター値の最大値判定を行います。
今回の場合5進( 0から4までのカウント)なので、カウント値が4かどうかを判断しています。
6進カウンタにしたい場合には判断値を5にします。
最大値であった場合にはカウンターをクリアします。
036カウントを1つ加算します。加算後、ロジックを完了します。