--- Quote Start ---
That isn't a VHDL problem, I think.
What's your expectation for code behaviour with q = 0? An integer range 0 to 11 synthesizes as unsigned[3 downto 0]. Decrementing from 0 rolls over to 15. You need to handle the behaviour for q= 0 explicitely, whatever you want, either roll over to 11, or stop decrementing.
IF q = 0 THEN
q <= ...
ELSE
q <= q - 1;
END IF;
--- Quote End ---
Thank you
I got my VHDL code done now, here it is if you like to take a look.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY countdownflying IS
PORT(
clk : in std_logic;
Abort : in BIT;
ARM : in BIT;
Launch: in BIT;
Launchpress :BUFFER INTEGER RANGE 90 TO 91;
q : BUFFER INTEGER RANGE 0 TO 15;
red : BUFFER INTEGER RANGE 0 TO 255;
green : BUFFER INTEGER RANGE 0 TO 255;
twosegment7 : out std_logic_vector(14 downto 0));
END countdownflying;
ARCHITECTURE arc OF countdownflying IS
BEGIN
PROCESS (clk,ARM,Abort)
BEGIN
if (Launch='1') THEN
Launchpress <= 91;
end if;
case ARM is
when '0' =>
q <= 11;
red <= 0;
green <= 0;
twosegment7 <="000000000000000"; -- 'none'
when '1' =>
red <= 255;
case Launchpress is
when 90 =>
IF (Abort='1') THEN
Launchpress <= 90;
q <= 11;
red <= 0;
green <= 0;
twosegment7 <="000000000000000"; -- 'none'
end if;
when 91 =>
IF (Abort='1') THEN
Launchpress <= 90;
q <= 11;
red <= 0;
green <= 0;
twosegment7 <="000000000000000"; -- 'none'
ELSIF (clk'EVENT AND clk='0') THEN
if (q <=11) THEN
q <=q-1;
case q is
when 00 => twosegment7 <="100011101110111"; -- 'LA'
green <= 0;
when 01 => twosegment7 <="000000001111110"; -- '0'
green <= 0;
when 02 => twosegment7 <="000000000110000"; -- '1'
green <= 1;
when 03 => twosegment7 <="000000001101101"; -- '2'
green <= 3;
when 04 => twosegment7 <="000000001111001"; -- '3'
green <= 7;
when 05 => twosegment7 <="000000000110011"; -- '4'
green <= 15;
when 06 => twosegment7 <="000000001011011"; -- '5'
green <= 31;
when 07 => twosegment7 <="000000001011111"; -- '6'
green <= 63;
when 08 => twosegment7 <="000000001110000"; -- '7'
green <= 127;
when 09 => twosegment7 <="000000001111111"; -- '8'
green <= 255;
when 10 => twosegment7 <="000000001111011"; -- '9'
green <= 255;
when 11 => twosegment7 <="001100001111110"; -- '10'
green <= 255;
when 12 => twosegment7 <="100011101110111"; -- 'LA'
green <= 0;
when 13 => twosegment7 <="100011101110111"; -- 'LA'
green <= 0;
when 14 => twosegment7 <="100011101110111"; -- 'LA'
green <= 0;
when 15 => twosegment7 <="100011101110111"; -- 'LA'
green <= 0;
end case;
end if;
else
END IF;
END case;
end case;
END PROCESS;
END arc;
I just need to learn how to use the on-board 24 MHZ oscillator. to control my count down by the seconds.