====== COUNTERS library ======
The COUNTERS library contains the most common used counters and consists of the following 6 generic components:
  * [[.:counters#buNar]]: N-bit binary up counter with asynchronous reset
  * [[.:counters#bdNsr]]: N-bit binary down counter with synchronous reset
  * [[.:counters#budNlr]]: N-bit binary up-down counter with syncronous load and asynchronous reset
  * [[.:counters#guNar]]: N-bit gray up counter with asynchronous reset
  * [[.:counters#gdNsr]]: N-bit gray down counter with synchronous reset
  * [[.:counters#gudNlr]]: N-bit gray up-down counter with syncronous load and asynchronous reset
The COUNTERs library can be verified with this testbench: [[.:counters#testbench|test_counters]]
===== buNar =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    buNar : N-bit binary up counter                          #
-- #                         with asynchronous reset                          #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
-- buNar Entity Description
entity buNar is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
end buNar;
-- buNar Architecture Description
architecture rtl of buNar is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
 
begin
   count <= ('0' & istate) + "01";
 
   Count_Process: process(CLK,R)
   begin
      if (R = '1') then
         -- reset event
         istate <= (OTHERS => '0');
      elsif (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (UP = '1') then
            -- clocked count up event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
    
   -- Assign output values
   DOUT <= istate;
   COUT <= count(N) and UP;
end rtl;
===== bdNsr =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    bdNsr : N-bit binary down counter                        #
-- #                         with synchronous reset                           #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
-- bdNsr Entity Description
entity bdNsr is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,R: in std_ulogic;
      COUT: out std_ulogic
   );
end bdNsr;
-- bdNsr Architecture Description
architecture rtl of bdNsr is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
 
begin
   count <= ('0' & istate) - "01";
 
   Count_Process: process(CLK)
   begin
      if (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (R = '1') then
            istate <= (OTHERS => '0');
         elsif (DOWN = '1') then
            -- clocked count down event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
    
   -- Assign output values
   DOUT <= istate;
   COUT <= '1' when (DOWN = '0') else not count(N);
end rtl;
===== budNlr =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    budNlr : N-bit binary up/down counter                    #
-- #                          with synchronous load and asynchronous reset    #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
-- budNlr Entity Description
entity budNlr is
   generic(N: INTEGER := 8);
   port(
      DIN: in unsigned(N-1 downto 0);
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,LOAD,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
end budNlr;
-- budNlr Architecture Description
architecture rtl of budNlr is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
 
begin
   count <= ('0' & istate) + "01" when ((UP = '1') and (DOWN = '0')) else
            ('0' & istate) - "01" when ((DOWN = '1') and (UP = '0')) else
            ('0' & istate);
 
   Count_Process: process(CLK,R)
   begin
      if (R = '1') then
         -- reset event
         istate <= (OTHERS => '0');
      elsif (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (LOAD = '1') then
            -- clocked load event
            istate <= DIN;
         elsif (UP = '1') or (DOWN = '1') then
            -- clocked count up/down event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
    
   -- Assign output values
   DOUT <= istate;
   COUT <= '0' when (DOWN = '0' and UP = '0')
      else '1' when (DOWN = '1' and UP = '1')
      else not count(N) when (DOWN = '1' and UP = '0')
      else count(N);
end rtl;
===== guNar =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    guNar : N-bit gray up counter                            #
-- #                         with asynchronous reset                          #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
use work.useful_functions.ALL;
-- guNar Entity Description
entity guNar is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
end guNar;
-- guNar Architecture Description
architecture rtl of guNar is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
   signal binary_out : unsigned(N downto 0);
begin
   count <= ('0' & istate) + "01";
 
   Count_Process: process(CLK,R)
   begin
      if (R = '1') then
         -- reset event
         istate <= (OTHERS => '0');
      elsif (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (UP = '1') then
            -- clocked count up event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
 
   -- Convert input to binary representation
   Bin2Grey(istate,binary_out);
    
   -- Assign output values
   DOUT <= binary_out(N-1 downto 0);
   COUT <= count(N) and UP;
end rtl;
===== gdNsr =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    gdNsr : N-bit gray down counter                          #
-- #                         with synchronous reset                           #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
use work.useful_functions.ALL;
-- gdNsr Entity Description
entity gdNsr is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,R: in std_ulogic;
      COUT: out std_ulogic
   );
end gdNsr;
-- gdNsr Architecture Description
architecture rtl of gdNsr is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
   signal binary_out : unsigned(N downto 0);
begin
   count <= ('0' & istate) - "01";
 
   Count_Process: process(CLK)
   begin
      if (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (R = '1') then
            istate <= (OTHERS => '0');
         elsif (DOWN = '1') then
            -- clocked count down event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
 
   -- Convert input to binary representation
   Bin2Grey(istate,binary_out);
    
   -- Assign output values
   DOUT <= binary_out(N-1 downto 0);
   COUT <= '1' when (DOWN = '0') else not count(N);
end rtl;
===== gudNlr =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    counters.vhd                                             #
-- #                                                                          #
-- # Component  :    gudNlr : N-bit gray up/down counter                      #
-- #                          with synchronous load and asynchronous reset    #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.ALL;
use work.useful_functions.ALL;
-- gudNlr Entity Description
entity gudNlr is
   generic(N: INTEGER := 8);
   port(
      DIN: in unsigned(N-1 downto 0);
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,LOAD,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
end gudNlr;
-- gudNlr Architecture Description
architecture rtl of gudNlr is
   signal istate : unsigned(N-1 downto 0);
   signal count : unsigned(N downto 0);
   signal load_value : unsigned(N-1 downto 0);
   signal binary_out : unsigned(N downto 0);
begin
   -- Convert input to binary representation
   Grey2Bin(DIN,load_value);
   count <= ('0' & istate) + "01" when ((UP = '1') and (DOWN = '0')) else
            ('0' & istate) - "01" when ((DOWN = '1') and (UP = '0')) else
            ('0' & istate);
 
   Count_Process: process(CLK,R)
   begin
      if (R = '1') then
         -- reset event
         istate <= (OTHERS => '0');
      elsif (CLK'event and (CLK = '1') and (CLK'last_value = '0')) then
         if (LOAD = '1') then
            -- clocked load event
            istate <= load_value;
         elsif (UP = '1') or (DOWN = '1') then
            -- clocked count up/down event
            istate <= count(N-1 downto 0);
         end if;
      end if;
   end process Count_Process;
 
   -- Convert input to binary representation
   Bin2Grey(istate,binary_out);
    
   -- Assign output values
   DOUT <= binary_out(N-1 downto 0);
   COUT <= '0' when (DOWN = '0' and UP = '0')
      else '1' when (DOWN = '1' and UP = '1')
      else not count(N) when (DOWN = '1' and UP = '0')
      else count(N);
end rtl;
===== Testbench =====
-- ############################################################################
-- # Project    :    Leonardo CBT-Kernel                                      #
-- #                                                                          #
-- # Filename   :    test_counters.vhd                                        #
-- #                                                                          #
-- # Component  :    test_counters : Test Bench for various counters.         #
-- #                                                                          #
-- # Model      :    rtl                                                      #
-- #                                                                          #
-- # Designer   :    S. Theoharis,N. Zervas                                   #
-- # Institute  :    VLSI Design Lab., University of Patras                   #
-- # Date       :    01.05.1999                                               #
-- ############################################################################
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity test_counters IS
END test_counters;
ARCHITECTURE rtl OF test_counters IS
COMPONENT bdNsr is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,R: in std_ulogic;
      COUT: out std_ulogic
   );
end COMPONENT;
COMPONENT buNar is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
end COMPONENT;
COMPONENT budNlr is
   generic(N: INTEGER := 8);
   port(
      DIN: in unsigned(N-1 downto 0);
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,LOAD,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
END COMPONENT;
COMPONENT gdNsr is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,R: in std_ulogic;
      COUT: out std_ulogic
   );
END COMPONENT;
COMPONENT guNar is
   generic(N: INTEGER := 4);
   port(
      DOUT: out unsigned(N-1 downto 0);
      CLK,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
END COMPONENT;
COMPONENT gudNlr is
   generic(N: INTEGER := 8);
   port(
      DIN: in unsigned(N-1 downto 0);
      DOUT: out unsigned(N-1 downto 0);
      CLK,DOWN,LOAD,R,UP: in std_ulogic;
      COUT: out std_ulogic
   );
END COMPONENT;
 FOR ALL : bdNsr USE ENTITY WORK.bdNsr(rtl);
 FOR ALL : buNar USE ENTITY WORK.buNar(rtl);
 FOR ALL : budNlr USE ENTITY WORK.budNlr(rtl);
 FOR ALL : gdNsr USE ENTITY WORK.gdNsr(rtl);
 FOR ALL : guNar USE ENTITY WORK.guNar(rtl);
 FOR ALL : gudNlr USE ENTITY WORK.gudNlr(rtl);
 
 CONSTANT N : integer := 8;
 SIGNAL DIN3,DIN6,DOUT1,DOUT2,DOUT3,DOUT4,DOUT5,DOUT6 : unsigned(N-1 downto 0);
 SIGNAL RESET,CLK,LOAD,UP,DOWN : std_ulogic := '0';
 SIGNAL COUT1,COUT2,COUT3,COUT4,COUT5,COUT6 : std_ulogic;
 
 BEGIN
Binary_down_counter : bdNsr
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DOUT=>DOUT1,
                     CLK=>CLK,
                     DOWN=>DOWN,
                     R=>RESET,
                     COUT=>COUT1
                    );
Binary_up_counter : buNar
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DOUT=>DOUT2,
                     CLK=>CLK,
                     UP=>UP,
                     R=>RESET,
                     COUT=>COUT2
                    );
Binary_up_down_counter : budNlr
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DIN=>DIN3,
                     DOUT=>DOUT3,
                     CLK=>CLK,
                     DOWN=>DOWN,
                     UP=>UP,
                     LOAD=>LOAD,
                     R=>RESET,
                     COUT=>COUT3
                    );
Gray_down_counter : gdNsr
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DOUT=>DOUT4,
                     CLK=>CLK,
                     DOWN=>DOWN,
                     R=>RESET,
                     COUT=>COUT4
                    );
Gray_up_counter : guNar
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DOUT=>DOUT5,
                     CLK=>CLK,
                     UP=>UP,
                     R=>RESET,
                     COUT=>COUT5
                    );
Gray_up_down_counter : gudNlr
           GENERIC MAP (
                        N=>N
                       )
           PORT MAP (
                     DIN=>DIN6,
                     DOUT=>DOUT6,
                     CLK=>CLK,
                     DOWN=>DOWN,
                     UP=>UP,
                     LOAD=>LOAD,
                     R=>RESET,
                     COUT=>COUT6
                    );
DIN3 <= "00000100";
DIN6 <= "00001100";
CLK <= not CLK AFTER 50 ns;
RESET <= '1', '0' AFTER 120 ns;
LOAD <= '0', '1' AFTER 1000 ns, '0' AFTER 1100 ns;
UP <= '0', '1' AFTER 2000 ns;
DOWN <= '1', '0' AFTER 2000 ns;
END rtl;