library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IEEE.STD_LOGIC_ARITH.ALL; --use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.all; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity toplevel is Port ( LEDs_out : out Std_Logic_Vector (7 downto 0); DIP_Switches : in Std_Logic_Vector (7 downto 0); -- Push_Button_Reset : in Std_Logic; reset : in Std_Logic; RS232_RX : in Std_Logic; RS232_TX : out Std_Logic; CLK : in Std_Logic); end toplevel; architecture Behavioral of toplevel is signal LEDs_in : Std_Logic_Vector (7 downto 0); signal count : integer range 0 to (125000000/2-1); signal frequenz_zaehler : integer range 0 to (125000000/2-1); -- für die Schleife der Subtraktion signal x : integer range 0 to (125000000); signal y : integer range 0 to (125000000); signal A : integer range 0 to (125000000); signal B : integer range 0 to (125000000); -- signalisiert ob die Schleife der Subtraktionen fertig ist signal sub_fertig : STD_LOGIC := '0'; -- um die DIP_Switches in INTEGER zu wandeln muss der umweg über SIGNED genommen werden, -- da eine direkte Umwandlung nicht möglich ist signal sig : signed(7 downto 0); signal int : integer range 0 to 120000000; begin LEDs_out <= LEDs_in; process(reset,CLK) begin if rising_edge(CLK) then if sub_fertig = '0' then if x >= B then y <= y + 1; x <= A - B; A <= x; else sub_fertig <= '1'; frequenz_zaehler <= y - 1; end if; elsif sub_fertig = '1' then if count < frequenz_zaehler then count <= count + 1; else LEDs_in <= LEDs_in(6 downto 0) & LEDs_in(7); -- gegen den Uhrzeiger -- LEDs_in <= LEDs_in(0) & LEDs_in(7 downto 1); -- mit dem Uhrzeiger count <= 0; end if; end if; if reset = '1' then count <= 0; LEDs_in <= X"18"; sub_fertig <= '0'; A <= 125000000; --Clock 125MHz sig <= signed(DIP_Switches); -- sig ist HILFS-Variable da man STD_LOGIC_VECTOR nicht direkt in INTEGER wandeln kann int <= to_integer(sig); -- int ist der Wert der gewandelten DIP_Switches if int = 0 then -- wenn alle DIP_Switches 0 sind soll die Frequenz 256 ausgewählt sein int <= 256; end if; B <= int * 2; y <= 0; --Schleifenzähler x <= A; --Abbruchkriterium für die Schleife (x>=A) end if; end if; end process; end Behavioral;