-- countBCD -- 4-bit presettable up/down BCD counter with asynchronous clear and load -- and Carry IN (CIN) and Carry Out (COUT). LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY countBCD IS PORT( clk, CIN : IN STD_LOGIC; clear, load, UpDown : IN STD_LOGIC; p : IN INTEGER RANGE 0 TO 15; COUT : OUT STD_LOGIC; q : OUT INTEGER RANGE 0 TO 15); END countBCD; ARCHITECTURE a OF countBCD IS BEGIN PROCESS (clk, clear, load) VARIABLE cnt : INTEGER RANGE 0 TO 15; BEGIN IF (clear = '0' ) THEN -- Asynchrnous clear cnt := 0; ELSIF (load = '1' and clear = '1') THEN -- Asynchronous presettable load cnt := p; ELSE IF (clk'EVENT AND clk = '1') THEN IF (CIN = '1' and UpDown = '1') THEN cnt := cnt - 1; if (cnt =15) then cnt := 9; END IF; ELSIF (CIN = '1' and UpDown = '0') THEN cnt := cnt + 1; if (cnt =10) then cnt := 0; END IF; END IF; END IF; END IF; q <= cnt; -- COUT=1 at 9 for up count and COUT=1 at 0 for down count. IF (cnt = 0 and UpDown = '1') THEN COUT <= '1'; ELSIF (cnt = 9 and UpDown = '0') THEN COUT <= '1'; ELSE COUT <= '0'; END IF; END PROCESS; END a;