-- Lösung Teil 1 -- CPLD library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. library UNISIM; use UNISIM.VComponents.all; entity xc9572_demo is port( -- Clock-Erzeugung clk_in: in std_logic; clk_speed: out std_logic; -- Displays seg: out std_logic_vector(7 downto 0); disp: out std_logic_vector(3 downto 0); -- Taster key: in std_logic_vector(7 downto 0); -- Codier-Schalter hex_switch: in std_logic_vector(3 downto 0); -- LED's led: out std_logic_vector(7 downto 0) ); end xc9572_demo; architecture Behavioral of xc9572_demo is -- Zähler -> Ausgang signal q: STD_LOGIC_VECTOR(29 downto 0) := "000000000000000000000000000000"; -- Zähler -> Folgezustand signal fnext: STD_LOGIC_VECTOR(29 downto 0) := "000000000000000000000000000000"; -- Zähler -> vorangegangene Zustände (maximaler Wert erreicht?) signal fand: STD_LOGIC_VECTOR(29 downto 0) := "000000000000000000000000000000"; -- Zähler-Rückstellung -> Sekunden und Minuten signal sec1: STD_LOGIC := '0'; signal sec10: STD_LOGIC := '0'; signal min1: STD_LOGIC := '0'; signal min10: STD_LOGIC := '0'; -- Aktuell ausgegebener Wert auf 7-Segment-Anzeige signal disp_out: STD_LOGIC_VECTOR(3 downto 0); -- Lauflicht signal loop_mode: STD_LOGIC_VECTOR(1 downto 0):= "00"; signal loop_hold: STD_LOGIC_VECTOR(1 downto 0):= "00"; signal loop_cnt: STD_LOGIC_VECTOR(3 downto 0):= x"0"; signal loop_and: STD_LOGIC_VECTOR(3 downto 0):= x"0"; signal loop_max: STD_LOGIC_VECTOR(3 downto 0):= x"7"; signal loop_xmax: STD_LOGIC := '0'; signal loop_res: STD_LOGIC := '0'; signal loop_clk: STD_LOGIC_VECTOR(3 downto 0):= x"0"; signal loop_next: STD_LOGIC := '0'; signal counter : integer range 0 to 32000000; -- (8000000/0.125)/2 signal reload : integer range 0 to 32000000; signal clkdiv : std_logic := '0'; begin --Oszillator an/aus -- clk_speed <= '1'; reload <= (32000000)-1 when hex_switch=x"1" -- (8000000/0.125)/2 else (16000000)-1 when hex_switch=x"2" -- (8000000/0.250)/2 else (10666667)-1 when hex_switch=x"3" -- (8000000/0.375)/2 else ( 8000000)-1 when hex_switch=x"4" -- (8000000/0.500)/2 else ( 6400000)-1 when hex_switch=x"5" -- (8000000/0.625)/2 else ( 5333333)-1 when hex_switch=x"6" -- (8000000/0.750)/2 else ( 4571428)-1 when hex_switch=x"7" -- (8000000/0.875)/2 else ( 4000000)-1 when hex_switch=x"8" -- (8000000/1.000)/2 else ( 3555555)-1 when hex_switch=x"9" -- (8000000/1.125)/2 else ( 3200000)-1 when hex_switch=x"a" -- (8000000/1.250)/2 else ( 2909091)-1 when hex_switch=x"b" -- (8000000/1.375)/2 else ( 2666667)-1 when hex_switch=x"c" -- (8000000/1.500)/2 else ( 2461538)-1 when hex_switch=x"d" -- (8000000/1.625)/2 else ( 2285714)-1 when hex_switch=x"e" -- (8000000/1.750)/2 else ( 2133333)-1 when hex_switch=x"f" -- (8000000/1.875)/2 else 0; -- Zähler --Process(clk_in) --begin process (clk_in) begin if rising_edge(clk_in) then if (counter = 0) then counter <= reload; clkdiv <= not clkdiv; else counter <= counter-1; end if; if (hex_switch=x"0") then -- Sonderfall f=0 clkdiv <= '0'; end if; end if; end process; Process(clkdiv) begin if rising_edge(clkdiv) then -- Zähler erhöhen q <= q + '1'; -- 4 Bits -- if clk_in'event and clk_in = '1' then -- Zähler erhöhen --q <= q + '1'; ---endif ??? -- Anhand Bit 18 wechseln -- case q( 21 downto 18 ) is -- S7 Schleife -- Taster abfragen if (key(7)='1') then led <= x"7f"; case q( 20 downto 18 ) is when "000" => led <= x"7f"; -- X------- when "001" => led <= x"bf"; -- -X------ when "010" => led <= x"df"; -- --X----- when "011" => led <= x"ef"; -- ---X---- when "100" => led <= x"f7"; -- ----X--- when "101" => led <= x"fb"; -- -----X-- when "110" => led <= x"fd"; -- ------X- when "111" => led <= x"fe"; -- -------X when others => led <= x"ff"; -- -------- end case; end if; -- S5 Schleife -- Taster abfragen if (key(5)='1') then led <= x"7e"; case q( 20 downto 18 ) is when "000" => led <= x"7e"; -- X------X when "001" => led <= x"bd"; -- -X----X- when "010" => led <= x"db"; -- --X--X-- when "011" => led <= x"e7"; -- ---XX--- when "100" => led <= x"db"; -- --X--X-- when "101" => led <= x"bd"; -- -X----X- when "110" => led <= x"7e"; -- X------X when "111" => led <= x"ff"; -- -------- when others => led <= x"ff"; -- -------- end case; end if; -- S3 Schleife -- Taster abfragen if (key(3)='1') then led <= x"3f"; case q( 21 downto 18 ) is when "0000" => led <= x"3f"; -- XX------ when "0001" => led <= x"9f"; -- -XX----- when "0010" => led <= x"cf"; -- --XX---- when "0011" => led <= x"e7"; -- ---XX--- when "0100" => led <= x"f3"; -- ----XX-- when "0101" => led <= x"f9"; -- -----XX- when "0110" => led <= x"fc"; -- ------XX when "0111" => led <= x"f9"; -- -----XX- when "1000" => led <= x"f3"; -- ----XX-- when "1001" => led <= x"e7"; -- ---XX--- when "1010" => led <= x"cf"; -- --XX---- when "1011" => led <= x"9f"; -- -XX----- when others => led <= x"ff"; -- -------- end case; end if; -- S1 Schleife -- Taster abfragen if (key(1)='1') then led <= x"7f"; case q( 21 downto 18 ) is when "0000" => led <= x"7f"; -- X------- when "0001" => led <= x"3f"; -- XX------ when "0010" => led <= x"1f"; -- XXX----- when "0011" => led <= x"0f"; -- XXXX--- when "0100" => led <= x"07"; -- XXXXX--- when "0101" => led <= x"03"; -- XXXXXX-- when "0110" => led <= x"01"; -- XXXXXXX- when "0111" => led <= x"00"; -- XXXXXXXX when "1000" => led <= x"01"; -- XXXXXXX- when "1001" => led <= x"03"; -- XXXXXX-- when "1010" => led <= x"07"; -- XXXXX--- when "1011" => led <= x"0f"; -- XXXX---- when "1100" => led <= x"1f"; -- XX----- when others => led <= x"ff"; -- -------- end case; end if; end if; end Process; end Behavioral; -- Fehlermeldung: -- ERROR:Cpld:853 - Insufficient number of product terms. This design needs at -- ERROR:Cpld:868 - Cannot fit the design into any of the specified devices with