Project

General

Profile

---------------------------------------------------------------------------
-- (c) 2013 mark watson
-- I am happy for anyone to use this for non-commercial use.
-- If my vhdl files are used commercially or otherwise sold,
-- please contact me for explicit permission at scrameta (gmail).
-- This applies for source and binary form and derived works.
---------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- Counter where only some bits are incremented - done in antic to save using larger adders I guess
ENTITY antic_counter IS
generic
(
STORE_WIDTH : natural := 1;
COUNT_WIDTH : natural := 1
);
PORT
(
CLK : IN STD_LOGIC;
RESET_n : IN STD_LOGIC;
increment : in std_logic;
load : IN STD_LOGIC;
load_value : in std_logic_vector(STORE_WIDTH-1 downto 0);

current_value : out std_logic_vector(STORE_WIDTH-1 downto 0)
);
END antic_counter;

ARCHITECTURE vhdl OF antic_counter IS
signal value_next : std_logic_vector(STORE_WIDTH-1 downto 0);
signal value_reg : std_logic_vector(STORE_WIDTH-1 downto 0);
BEGIN
-- register
process(clk,reset_n)
begin
if (reset_n = '0') then
value_reg <= (others=>'0');
elsif (clk'event and clk='1') then
value_reg <= value_next;
end if;
end process;

-- next state
process(increment, value_reg, load, load_value)
begin
value_next <= value_reg;

if (increment = '1') then
value_next <= value_reg(STORE_WIDTH-1 downto COUNT_WIDTH)&std_logic_vector(unsigned(value_reg(COUNT_WIDTH-1 downto 0)) + 1);
end if;
if (load = '1') then
value_next <= load_value;
end if;
end process;
-- output
current_value <= value_reg;
END vhdl;
(2-2/24)