Elektronischer Würfel: Sie sollen einen elektronischen "Würfel" entwickeln. Die idee ist sehr einfach: so lange der "Wurf" Knopf gedrückt ist (WURF=1), wird mit hoher Geschwindigkeit (f=1kHz) eine interne Würfelzahl zyklisch von 1 bis 6 gezählt. Wird Wurf losgelassen, so wird die ermittelte Zahl bis zum nächsten Würfeln ausgegeben. Während des Würfelns selbst soll eine blinkende 8 ausgegeben werden, d.h. abwechselnd ein Zustand 8, ein Zustand keine Ausgabe. Taktsignal clk und Reset-Signal res stehen zur verfügung. Das Ausgabesignal des Würfels soll an eine 7-Segment-Anzeige direkt angeschlossen werden (s. Abb unten: Die Ziffern geben die Stelle des Ausgangsvektors valueN an, die an das Segmant angeschlossen ist). Durch Ausgabe einer Null leuchtet das entsprechende Segment. Beschreiben sie den Würfel mit einem Zustandsdiagramm (nach Moore) und einer VHDL-Spezifikation.
7-Segment-Anzeige
0 5 1 6 4 2 3
Wie gesagt, Danke schonmal im Vorraus für eure Bemühungen.
Ixh bin auf eure Hilfe angewiesen.
Mit freundlichen Grüßen
Volker
Re: elektronischer Würfel & Zähler mit VHDL - HILFE -
Re: elektronischer Würfel & Zähler mit VHDL - HILFE -
Hi, habe mich gestern mal hingesetzt und folgendes zu papier gebracht. Leider bekomme ich beim compilieren jetzt immer ne Fehlermeldung, bei der ich nicht weiß was Sie bedeuten und wie ich sie beheben soll, hoffe mir ann einer von euch helfen!
Hier mein programm:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity wuerfel22 is Port ( clk : in std_logic; taster : in std_logic; zahl : out std_logic_vector(6 downto 0)); end wuerfel22;
architecture Behavioral of wuerfel22 is signal zahl_intern : std_logic_vector (6 downto 0); signal zahl_internzwei : std_logic_vector (6 downto 0); signal zahl_interndrei : std_logic_vector (6 downto 0); begin process (taster) begin if taster = '1' and clk = '1' then zahl_internzwei <= "0000000"; case zahl_internzwei is when "0000000" => zahl_internzwei <= "0000000"; zahl <= zahl_internzwei; end case; elsif taster = '1' and clk = '0' then zahl_interndrei <= "1111111"; case zahl_interndrei is when "1111111" => zahl_interndrei <= "1111111"; zahl <= zahl_interndrei; end case; end if; end process; process (clk) begin zahl_intern <= "1001111"; -- eins if rising_edge (clk) then if taster = '1' then case zahl_intern is when "1001111" => -- eins zahl_intern <= "0010010"; -- zwei when "0010010" => zahl_intern <= "0000110"; -- drei when "0000110" => zahl_intern <= "1001100"; -- vier when "1001100" => zahl_intern <= "0100100"; -- fünf when "0100100" => zahl_intern <= "0100000"; -- sechs when others => zahl_intern <= "0111000"; -- eins end case; end if; end if; end process; zahl <= zahl_intern; -- Übergabe an Ausgabe asynchron -> real: zahl = zahl_intern end Behavioral;
KANN MIR DABEI JEMAND WEITERHELFEN,DEN FEHLER ZU FINDEN UND ZU BEHEBEN?!
FÜR HILFE BIN ICH SEHR DANKBAR; KOMME NÄMLICH ABSOLUT NICHT WEITER!
MELDET EUCH BITTE!
DANKE SCHONMAL IM VORRAUS. wuerfel.vhd un Fehlermeldung gibts auch nochmal im Anhang!
DANKE!
MIT FREUNDLICHEN GRÜßEN
Volker
P.S. diesen komischen 6, 5, 3 Zähler bräuchte ich auch noch
Re: elektronischer Würfel & Zähler mit VHDL - HILFE -
Hallo Volker,
Ich kenn Dein Tool nicht, aber im Prozess "taster" verwendest Du den case Konstrukt, obwohl Du nur einen Fall abfrägst. Bei Verwendung des case-Konstrukt musst Du alle anderen Fälle noch definieren z.B so:
case zahl_internzwei is when "0000000" => ... when others => ... end case;
Du könntest den case aber auch durch eine if-Abfrage ersetzen !
Ausserdem versteh ich den gesamten Prozess "taster" nicht recht. Was willst Du damit erreichen??? Ich denke mal, Du willst den Fall abfangen, wenn der Taster wieder losgelkassen wurde: Ich würde das so irgendwie machen (nicht getestet):
signal taster_old : std_logic; -- Kopie vom signal Taster process (taster) begin if taster = '1' then -- solange der taster =1, ist er gedrueckt taster_old <= '1'; else -- taster ist nicht gedrueckt if taster_old = '1' then -- wenn taster aber gedrueckt war, dann... zahl <= zahl_interndrei; -- Zahl ausgeben taster_old <= '0'; end if; end process;
Mit diesem Prozess soll nur einmal die Würfelzahl ausgegeben werden, wenn taster_old noch auf 1 steht und taster aber auf Null. Mit diesen beiden signalen erkennt der Prozess den Signalwechsel. (Achtung, den Code oben hab ich jetzt nicht getestet, da können schon noch Probleme damit auftauchen.)
Re: elektronischer Würfel & Zähler mit VHDL - HILFE -
Zitat: hdschondelmaier
Hallo Volker,
Ich kenn Dein Tool nicht, aber im Prozess "taster" verwendest Du den case Konstrukt, obwohl Du nur einen Fall abfrägst. Bei Verwendung des case-Konstrukt musst Du alle anderen Fälle noch definieren z.B so:
case zahl_internzwei is when "0000000" => ... when others => ... end case;
Du könntest den case aber auch durch eine if-Abfrage ersetzen !
Ausserdem versteh ich den gesamten Prozess "taster" nicht recht. Was willst Du damit erreichen??? Ich denke mal, Du willst den Fall abfangen, wenn der Taster wieder losgelkassen wurde: Ich würde das so irgendwie machen (nicht getestet):
signal taster_old : std_logic; -- Kopie vom signal Taster process (taster) begin if taster = '1' then -- solange der taster =1, ist er gedrueckt taster_old <= '1'; else -- taster ist nicht gedrueckt if taster_old = '1' then -- wenn taster aber gedrueckt war, dann... zahl <= zahl_interndrei; -- Zahl ausgeben taster_old <= '0'; end if; end process;
Mit diesem Prozess soll nur einmal die Würfelzahl ausgegeben werden, wenn taster_old noch auf 1 steht und taster aber auf Null. Mit diesen beiden signalen erkennt der Prozess den Signalwechsel. (Achtung, den Code oben hab ich jetzt nicht getestet, da können schon noch Probleme damit auftauchen.)