bin gerade dabei ein VHDL Programm zu schreiben und komme nicht weiter.
Aufgabe ist es einen Automaten zu programmieren, der nach Starten, einen Ultraschall impuls auslöst, gleichzeitig einen Zähler startet und nach Rückmeldung des Sensors den Zählerstand als HEX-Wert auf 4 7-Seg-Anzeigen ausgibt.
Prinzipiell funktioniert alles bis auf eine Kleinigkeit beim Sensor. Die Eigenart des Sensor ist, dass er seinen Ausgang beim Start auf High setzt und nach Empfang des Echos auf Low geht. Und diese fallende Flanke des Sensorausgangs soll Bedingung im Automaten sein, in den nächsten Zustand zu springen. Und diese Bedingung bekomme ich nicht hin.
Das Programm hat leider 230 Zeilen Code. Ist ein bissle viel um alles hier reinzukopieren.
Wenn mir jemand weiterhelfen kann bitte die Mail-Adresse posten, dann schick ich das Programm zu. Oder gleich bei mir melden unter mit Betreff VHDL oder so.
Vielen Dank schonmal.
Grüßle Achim
Re: Komme nicht weiter :(
Hier doch noch der Code...
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all;
entity Digitales_Messen is Port ( CLK : in std_logic; RESET : in std_logic; ENABLE : in std_logic; Start : in std_logic; StartMessung: out std_logic; Stop : in std_logic; Neustart : in std_logic; AN0 : inout std_logic; AN1 : inout std_logic; AN2 : inout std_logic; AN3 : inout std_logic; LED : out std_logic_vector(7 downto 0)); end Digitales_Messen;
architecture Behavioral of Digitales_Messen is type statetype is (Ausgangszustand, Zaehler, Ausgabe); signal state, NextState: statetype; signal ctr : std_logic_vector(12 downto 0); signal counterm : std_logic_vector(9 downto 0); signal Zaehlerstart : std_logic; signal Ausgabestart : std_logic; signal Ausgangsstart: std_logic; signal counter : std_logic_vector(18 downto 0); signal HEX0 : std_logic_vector (3 downto 0); signal HEX1 : std_logic_vector (3 downto 0); signal HEX2 : std_logic_vector (3 downto 0); signal HEX3 : std_logic_vector (3 downto 0); signal Ende : std_logic;
begin
--StateTransition: process (CLK, RESET) begin if RESET = '1' then state <= Ausgangszustand; elsif rising_edge(CLK) then if ENABLE = '1' then State <= NextState; end if; end if; end process;
--StateCalculation: process (Start, Stop, Neustart, State, RESET, CLK) begin case state is when Ausgangszustand => if Start = '1' then NextState <= Zaehler; else NextState <= Ausgangszustand; end if; when Zaehler => if Stop = '1' then NextState <= Ausgabe; else NextState <= Zaehler; end if; when Ausgabe => if Neustart = '1' then NextState <= Ausgangszustand; else NextState <= Ausgabe; end if; end case; end process;
--OutputState: process (State, RESET) begin if State = Zaehler then Zaehlerstart <= '1'; else Zaehlerstart <= '0'; end if; if State = Ausgabe then Ausgabestart <= '1'; else Ausgabestart <= '0'; end if; if State = Ausgangszustand then Ausgangsstart <= '1'; else Ausgangsstart <= '0'; end if; end process;
--Counter: process (CLK, Ausgangsstart) begin if Ausgangsstart = '1' then counter <= "0000000000000000000"; counterm <= "0000000000"; Ende <= '0'; StartMessung <= '0'; elsif Zaehlerstart = '1' and rising_edge(CLK) then counter <= counter + 1; if Ende = '0' then StartMessung <= '1'; counterm <= counterm+1; if counterm = "1111101000" then StartMessung <= '0'; Ende <= '1'; end if; end if; end if; end process;
--Output: process (CLK, Ausgangsstart) begin if Ausgangsstart = '1' then AN0 <= '1'; AN1 <= '1'; AN2 <= '1'; AN3 <= '1'; elsif Ausgabestart = '1' and rising_edge(CLK) then HEX0 <= counter(6 downto 3); HEX1 <= counter(10 downto 7); HEX2 <= counter(14 downto 11); HEX3 <= counter(18 downto 15); if CTR = "0000000000000" then if AN0 = '1' and AN1 = '1' and AN2 = '1' and AN3 = '1' then AN0 <= '0'; elsif AN0 = '0' then AN0 <= '1'; case HEX1 is when "0000" => LED <= "11000000"; when "0001" => LED <= "11111001"; when "0010" => LED <= "10100100"; when "0011" => LED <= "10110000"; when "0100" => LED <= "10011001"; when "0101" => LED <= "10010010"; when "0110" => LED <= "10000010"; when "0111" => LED <= "11111000"; when "1000" => LED <= "10000000"; when "1001" => LED <= "10010000"; when "1010" => LED <= "10001000"; when "1011" => LED <= "10000011"; when "1100" => LED <= "11000110"; when "1101" => LED <= "10100001"; when "1110" => LED <= "10000110"; when "1111" => LED <= "10001110"; when others => NULL; end case; AN1 <= '0'; elsif AN1 = '0' then AN1 <= '1'; case HEX2 is when "0000" => LED <= "11000000"; when "0001" => LED <= "11111001"; when "0010" => LED <= "10100100"; when "0011" => LED <= "10110000"; when "0100" => LED <= "10011001"; when "0101" => LED <= "10010010"; when "0110" => LED <= "10000010"; when "0111" => LED <= "11111000"; when "1000" => LED <= "10000000"; when "1001" => LED <= "10010000"; when "1010" => LED <= "10001000"; when "1011" => LED <= "10000011"; when "1100" => LED <= "11000110"; when "1101" => LED <= "10100001"; when "1110" => LED <= "10000110"; when "1111" => LED <= "10001110"; when others => NULL; end case; AN2 <= '0'; elsif AN2 = '0' then AN2 <= '1'; case HEX3 is when "0000" => LED <= "11000000"; when "0001" => LED <= "11111001"; when "0010" => LED <= "10100100"; when "0011" => LED <= "10110000"; when "0100" => LED <= "10011001"; when "0101" => LED <= "10010010"; when "0110" => LED <= "10000010"; when "0111" => LED <= "11111000"; when "1000" => LED <= "10000000"; when "1001" => LED <= "10010000"; when "1010" => LED <= "10001000"; when "1011" => LED <= "10000011"; when "1100" => LED <= "11000110"; when "1101" => LED <= "10100001"; when "1110" => LED <= "10000110"; when "1111" => LED <= "10001110"; when others => NULL; end case; AN3 <= '0'; elsif AN3 = '0' then AN3 <= '1'; case HEX0 is when "0000" => LED <= "11000000"; when "0001" => LED <= "11111001"; when "0010" => LED <= "10100100"; when "0011" => LED <= "10110000"; when "0100" => LED <= "10011001"; when "0101" => LED <= "10010010"; when "0110" => LED <= "10000010"; when "0111" => LED <= "11111000"; when "1000" => LED <= "10000000"; when "1001" => LED <= "10010000"; when "1010" => LED <= "10001000"; when "1011" => LED <= "10000011"; when "1100" => LED <= "11000110"; when "1101" => LED <= "10100001"; when "1110" => LED <= "10000110"; when "1111" => LED <= "10001110"; when others => NULL; end case; AN0 <= '0'; end if; end if; ctr <= ctr + 1; if (ctr > "1000000000000") then ctr <= "0000000000000"; end if; end if; end process;