Hallo Leute,
ich habe ein Problem mit VHDL. Ich benutze die aktuelle Lattice Diamond
Software und versuche eine Ampelschaltung zu bauen. Der Quelltext steht
und wird mir auch mit 0 Errors synthesiced. Aber wenn ich dann mein
Spreadsheet öffne, um die Eingänge den Pins des PLD zuzuweisen, zeigt er
mir keinen einzigen Eingang an. Ich bin momentan am verzweifeln, da ich
schon zu oft ein neues Projekt erstellt habe, überprüft, ob ich den
richtigen Baustein ausgewählt habe, Quelltexte 100erte Male geändert und
bin jetzt einfach am Ende! Kann mir irgendjemand einen Tipp geben, wie
ich das Problem beheben kann? Nur für den Fall, dass mein Quelltext die
Ursache des Problemes ist, habe ich euch diesen weiter unten angehängt.
Viele Grüße
Rigusashi
Beschreibung:
Eine Fußgängerüberweg soll mit einer Ampel versehen werden. Die dafür
benötigte Schaltung soll mit VHDL erstellt werden. Ebenso soll die State
Maschine verwendet werden!
library ieee;
use ieee.std_logic_1164.all;
entity Ampel is
port(
CLK, Taster: in std_logic;
Taster_reset: out std_logic;
AutoAmpel: out std_logic_vector (2 downto 0);
FussAmpel: out std_logic_vector (1 downto 0)
);
end entity Ampel;
architecture behavior of Ampel is
type state_type is (S0, S1, S2, S3, S4, S5);
signal state, next_state: state_type;
begin
state_logic: process (state) is
begin
case state is
when S0 =>
AutoAmpel <= "001"; -- grün
Fussampel <= "10"; -- rot
when S1 =>
AutoAmpel <= "010"; -- gelb
Fussampel <= "10"; -- rot
when S2 =>
AutoAmpel <= "100";--rot
Fussampel <= "10";--rot
when S3 =>
AutoAmpel <= "100";--rot
Fussampel <= "01";--grün
when S4 =>
Taster_reset <= '1';
AutoAmpel <= "100";--rot
Fussampel <= "10";--rot
when S5 =>
AutoAmpel <= "110";--rot,gelb
Fussampel <= "10";--rot
when others =>
AutoAmpel <= "100"; --rot
Fussampel <= "10"; --rot
next_state <= S0;
end case;
end process state_logic;
state_change: process (CLK, Taster) is
type int5 is range 0 to 5;
variable counter: int5;
begin
if Taster = '1' then
next_state <= S1;
counter := 0;
end if;
if state = S1 then
if rising_edge (CLK) then
counter := counter + 1;
if counter = 2 then
next_state <= S2;
counter := 0;
end if;
end if;
end if;
if state = S2 then
if rising_edge (CLK) then
counter := counter + 1;
if counter = 2 then
next_state <= S3;
counter := 0;
end if;
end if;
end if;
if state = S3 then
if rising_edge (CLK) then
counter := counter + 1;
if counter = 5 then
next_state <= S4;
counter := 0;
end if;
end if;
end if;
if state = S4 then
if rising_edge (CLK) then
counter := counter + 1;
if counter = 2 then
next_state <= S5;
counter := 0;
end if;
end if;
end if;
if state = S5 then
if rising_edge (CLK) then
counter := counter + 1;
if counter = 2 then
next_state <= S0;
counter := 0;
end if;
end if;
end if;
end process state_change;
end architecture behavior;
packen, erhöht um einiges die Lesbarkeit und damit die Chance das sich
jemand die Mühe macht in auch zu lesen.
Ich habe mir den Code jetzt nicht angeschaut, aber 2 Tips zu Diamond.
1) Wenn keine Eingangspins zugewisen werden, wird mit grosser
Wharscheinlichkeit das ganze Design wegoptimiert. Sollte man auch im
Mapreport sehen.
2) In der SynplfyPro-Umgebung ist es leichter und schneller Fehler zu
finden.
(Messages,HDL-Analysist)
Hi,
oh oh, ich vermute du bist Einsteiger. Bei der FSM(oder was das sein
soll ;))
bekomme ich doch glatt Kopfschmerzen.
Der Erste Process ist noch einigermaßen OK aber der Zweite...
-In jedem if ein rising_edge verschachtelt?
-Für jeden State ein If?
-Variablen?
Soll ich es mal umschreiben?
Grüße
Hallo,
ist doch kein Wunder das da nix bei rauskommt, schau dir doch mal die
korekte Schreibweise einer Zwei Prozess State-Maschine an.
Kleiner Hinweis dein Konstrukt mit rising_edge(clk) kann so nicht
stimmen.
Ja, ich bin noch Einsteiger!
Also ich hatte vorher einen Entwurf wo ich nur mit einem Process
gearbeitet habe. Leider hat da noch weniger funktioniert. Ich wollte
eine Hardwarebeschreibung schreiben, in der ich alles kompakt zusammen
habe. Als es bei meinem ersten Entwurf zu Fehlern kam, bin ich auf zwei
Processe umgestiegen.
Hallo,
du hast bei deiner ersten doch den gleichen Fehler drin.
Gerade als Einsteiger halte dich an die Beispiele oder Templates von den
Herstellern.
Und wie schon gesagt du taktest deine State-Maschine nicht richtig.
Richtiger sieht es dann z.B. so aus
Muss ich die State Maschine takten? Ich benötige den Takt ja nur, um
meinen Zähler aufwärtszuzählen. Könnte ich dann nicht einfach sagen,
dass ich nur eine If-Anweisung schreibe, in der ich den Zähler takte und
diesen dann in der Case- Anweisung abrufe?
z.B.
Hallo,
na dann wäres ja keine State-Maschine mehr und du müsstes deine Ausgänge
von Zähler ableiten.Das Case mit state wäre völlig nutzlos, da sich
state dann ja nie ändert und damit deine Ausgänge auch nicht.
@Entwickler12345
also eigentlich hast du jetzt ja nur folgendes verändert:
du hast die State Maschine getaktet und hast den Zähler in einen eigenen
process geschoben. Ist das der einzige Fehler den ich gemacht habe? Ich
muss sagen, dass mir nicht bewusst war, dass die state maschine getaktet
sein muss. Hätte ich mich vllt. auch vorher besser erkundigen können :(
@dden
selbe wie oben: sorry, aber mir war nicht bewusst, dass eine state
maschine getaktet sein MUSS. Ich dachte, ich kann das wie ein Case
einfach mit Zuweisungen machen.
Ich werde mich erneut an den Quelltext setzen und das ganze getaktet
machen. Wenn es funktioniert hat, werde ich mich hier nochmal melden.
Vorab schonmal vielen Dank für die Anregungen.
Rigusashi schrieb:> Könnte ich dann nicht einfach sagen, dass ich nur eine If-Anweisung> schreibe, in der ich den Zähler takte und diesen dann in der Case-> Anweisung abrufe?
Könnte, hätte, wäre, würde, sollte...
Warum siehst du dir nicht einfach an, wie ANDERE das machen? Du bist
schließlich nicht der erste, der sowas zu tun hat.
Rigusashi schrieb:> selbe wie oben: sorry, aber mir war nicht bewusst, dass eine state> maschine getaktet sein MUSS. Ich dachte, ich kann das wie ein Case> einfach mit Zuweisungen machen.VHDL ist eine Beschreibungssprache.
Und was wird damit beschreiben?
Richtig: Hardware.
Also musst du vorher wissen, was du mit VHDL beschreiben willst. Du
musst dir also eine Vorstellung von deiner Hardware verschaffen, und die
dann beschreiben...
Rigusashi schrieb:> Muss ich die State Maschine takten? Ich benötige den Takt ja nur, um> meinen Zähler aufwärtszuzählen.
Ein Zähler ist ja nur die einfachste Art eines Zustandsautomaten,
nämlich einer, der mit jedem Takt einfach immer nur einen Zustand
weiterschaltet. Wenn also schon der einfachste Zustandsautomat (=Zähler)
sowohl Register wie auch einen Takt braucht, wird es wohl so sein, dass
kompliziertere Zustandsautomaten ebenfalls einen Takt brauchen.