Forum: FPGA, VHDL & Co. VHDL Eingänge werden nicht übernommen


von Rigusashi (Gast)


Lesenswert?

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;

von Lattice User (Gast)


Lesenswert?

Vorab:
Bitte den Source zwischen
 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)

von Lattice User (Gast)


Lesenswert?

Bah

Lattice User schrieb:
> Vorab:
> Bitte den Source zwischen
1
[vhdl] [/vhdl]
packen, erhöht um einiges die
> Lesbarkeit und damit die Chance das sich jemand die Mühe macht in auch
> zu lesen.
>

von Rigusashi (Gast)


Lesenswert?

1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity Ampel is
5
port(
6
CLK, Taster: in std_logic;
7
Taster_reset: out std_logic;
8
AutoAmpel: out std_logic_vector (2 downto 0);
9
FussAmpel: out std_logic_vector (1 downto 0)
10
);
11
end entity Ampel;
12
13
14
architecture behavior of Ampel is
15
16
   type state_type is (S0, S1, S2, S3, S4, S5);
17
   signal state, next_state: state_type;
18
19
begin
20
21
   state_logic: process (state) is
22
23
   begin
24
25
case state is
26
27
when S0 =>
28
      AutoAmpel <= "001"; -- grün
29
      Fussampel <= "10"; -- rot
30
when S1 =>
31
      AutoAmpel <= "010"; -- gelb
32
      Fussampel <= "10"; -- rot
33
when S2 =>
34
      AutoAmpel <= "100";--rot
35
      Fussampel <= "10";--rot
36
when S3 =>
37
      AutoAmpel <= "100";--rot
38
      Fussampel <= "01";--grün
39
when S4 =>
40
      Taster_reset <= '1';
41
      AutoAmpel <= "100";--rot
42
      Fussampel <= "10";--rot
43
when S5 =>
44
      AutoAmpel <= "110";--rot,gelb
45
      Fussampel <= "10";--rot
46
when others =>
47
        AutoAmpel <= "100"; --rot
48
        Fussampel <= "10";  --rot
49
        next_state <= S0;
50
end case;
51
52
end process state_logic;
53
54
state_change: process (CLK, Taster) is
55
56
type int5 is range 0 to 5;
57
variable counter: int5;
58
59
  begin
60
61
  if Taster = '1' then
62
    next_state <= S1;
63
    counter := 0;
64
  end if;
65
66
if state = S1 then
67
   if rising_edge (CLK) then
68
    counter := counter + 1;
69
70
      if counter = 2 then
71
        next_state <= S2;
72
        counter := 0;
73
      end if;
74
  end if;
75
end if;
76
77
if state = S2 then
78
   if rising_edge (CLK) then
79
    counter := counter + 1;
80
81
      if counter = 2 then
82
        next_state <= S3;
83
        counter := 0;
84
      end if;
85
  end if;
86
end if;
87
88
if state = S3 then
89
   if rising_edge (CLK) then
90
    counter := counter + 1;
91
92
      if counter = 5 then
93
        next_state <= S4;
94
        counter := 0;
95
      end if;
96
  end if;
97
end if;
98
99
if state = S4 then
100
   if rising_edge (CLK) then
101
    counter := counter + 1;
102
103
      if counter = 2 then
104
        next_state <= S5;
105
        counter := 0;
106
      end if;
107
  end if;
108
end if;
109
110
if state = S5 then
111
   if rising_edge (CLK) then
112
    counter := counter + 1;
113
114
      if counter = 2 then
115
        next_state <= S0;
116
        counter := 0;
117
      end if;
118
  end if;
119
end if;
120
121
end process state_change;
122
123
end architecture behavior;

von Entwickler12345 (Gast)


Lesenswert?

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

von dden (Gast)


Lesenswert?

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.

von Rigusashi (Gast)


Lesenswert?

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.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity Ampel is    
5
port(     
6
CLK, Taster: in std_logic;   
7
Taster_reset: out std_logic;
8
AutoAmpel: out std_logic_vector (2 downto 0);
9
FussAmpel: out std_logic_vector (1 downto 0) 
10
); 
11
end entity Ampel;   
12
13
14
architecture behavior of Ampel is  
15
16
   type state_type is (S0, S1, S2, S3, S4, S5);  
17
   signal state, next_state: state_type;  
18
  signal clock: std_logic;
19
  signal en: std_logic;
20
  
21
      
22
begin  
23
  clock <= CLK;
24
  en <= Taster;
25
   state_logic: process (Taster, CLK, state) is 
26
   type int5 is range 0 to 5;    
27
   variable counter: int5;  
28
  
29
   begin     
30
31
case state is
32
33
when S0 =>         
34
      AutoAmpel <= "001";           
35
      Fussampel <= "10";
36
      
37
        if en = '1' then
38
          next_state <= S1; 
39
          counter := 0;
40
        end if;
41
42
when S1 =>             
43
      AutoAmpel <= "010";           
44
      Fussampel <= "10";
45
      
46
        if clock'event and clock = '1'  then
47
          counter := counter + 1;
48
          
49
            if counter = 2 then
50
              next_state <= S2; 
51
              counter := 0;
52
            end if;
53
        end if;
54
55
when S2 =>             
56
      AutoAmpel <= "100";           
57
      Fussampel <= "10";
58
      
59
        if clock'event and clock = '1'  then
60
          counter := counter + 1;
61
          
62
            if counter = 2 then
63
              next_state <= S3; 
64
              counter := 0;
65
            end if;
66
        end if;        
67
68
when S3 =>             
69
      AutoAmpel <= "100";           
70
      Fussampel <= "01";
71
      
72
        if clock'event and clock = '1'  then
73
          counter := counter + 1;
74
          
75
            if counter = 5 then
76
              next_state <= S4; 
77
              counter := 0;
78
            end if;
79
        end if;
80
81
when S4 =>  
82
      Taster_reset <= '1';
83
      AutoAmpel <= "100";           
84
      Fussampel <= "10";
85
      
86
        if clock'event and clock = '1'  then
87
          counter := counter + 1;
88
          
89
            if counter = 2 then
90
              next_state <= S5; 
91
              counter := 0;
92
            end if;
93
        end if;
94
95
when S5 =>             
96
      AutoAmpel <= "110";           
97
      Fussampel <= "10";
98
      
99
        if clock'event and clock = '1'  then
100
          counter := counter + 1;
101
          
102
            if counter = 2 then
103
              next_state <= S0; 
104
              counter := 0;
105
            end if;
106
        end if;
107
108
when others =>                
109
        AutoAmpel <= "100";           
110
        Fussampel <= "10";                
111
        next_state <= S0;      
112
end case;   
113
114
end process state_logic; 
115
 
116
   
117
end architecture behavior;

von dden (Gast)


Lesenswert?

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
1
process
2
begin
3
  if rising_edge(clk) then
4
    if sync_rst='1' then
5
      zähler => 0;
6
    else
7
      case state is
8
        when s1 => 
9
          state <= s2;
10
        when s2 =>
11
          state <= s3
12
          zähler => zähler +1;
13
        when others =>
14
          state => s1
15
      end case;
16
    end if;
17
   end if;
18
end process;

von Rigusashi (Gast)


Lesenswert?

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.
1
if clock'event and clock = '1'  then
2
if en = '1' then
3
counter <= counter + 1;
4
end if;
5
end if;
6
7
case state is
8
9
when S0 =>         
10
      AutoAmpel <= "001";           
11
      Fussampel <= "10";
12
when S1 =>   
13
      en <= '1';
14
      AutoAmpel <= "010";           
15
      Fussampel <= "10";              
16
when S2 =>  
17
      en <= '1';
18
      AutoAmpel <= "100";           
19
      Fussampel <= "10";
20
when S3 =>   
21
      en <= '1';
22
      AutoAmpel <= "100";           
23
      Fussampel <= "01";
24
when S4 =>  
25
      en <= '1';
26
      Taster_reset <= '1';
27
      AutoAmpel <= "100";           
28
      Fussampel <= "10";
29
when S5 =>             
30
      AutoAmpel <= "110";           
31
      Fussampel <= "10";
32
when others =>                
33
        AutoAmpel <= "100";           
34
        Fussampel <= "10";                
35
        next_state <= S0;      
36
end case;

von Entwickler12345 (Gast)


Lesenswert?

Probier mal. Ich habe es aber nicht getestet und simuliert. Bin mir mit 
dem Enable vom Counter nicht ganz sicher, sollte aber gehen.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity Ampel is
6
port(
7
CLK, Taster: in std_logic;
8
Taster_reset: out std_logic;
9
AutoAmpel: out std_logic_vector (2 downto 0);
10
FussAmpel: out std_logic_vector (1 downto 0)
11
);
12
end entity Ampel;
13
14
15
architecture behavior of Ampel is
16
17
   type state_type is (S0, S1, S2, S3, S4, S5);
18
   signal state, next_state: state_type;
19
   signal counter     : unsigned(2 downto 0) := (others => '0');
20
   signal cnt_ena     : std_logic            := '0';
21
22
begin
23
24
  count: process (CLK)
25
  begin
26
     if rising_edge(CLK) then
27
      if cnt_ena = '1' then
28
        counter <= counter + 1;
29
      else
30
        counter <= (others => '0');
31
      end if;
32
     end if;
33
  end process;
34
35
36
  state_change: process (CLK, Taster)
37
  begin
38
     if rising_edge(CLK) then
39
      state <= next_state;
40
     end if;
41
  end process;
42
43
   state_logic: process(state, counter)
44
   begin
45
   
46
    next_state <= state;
47
    Taster_reset <= '0';
48
    AutoAmpel <= "100";--rot
49
    Fussampel <= "10";--rot
50
    cnt_ena   <= '0';
51
    
52
    case state is
53
      when S0 =>
54
        AutoAmpel <= "001"; -- grün
55
        Fussampel <= "10"; -- rot
56
        if Taster = '1' then
57
          next_state <= S1;                    
58
        end if;
59
      when S1 =>
60
        cnt_ena    <= '1';
61
        AutoAmpel <= "010"; -- gelb
62
        Fussampel <= "10"; -- rot
63
            if counter = 2 then
64
            next_state <= S2;
65
                        cnt_ena    <= '0';            
66
          end if;
67
      when S2 =>
68
        AutoAmpel  <= "100";--rot
69
        Fussampel  <= "10";--rot
70
        cnt_ena    <= '1';
71
        if counter = 2 then
72
          next_state <= S3;
73
                    cnt_ena    <= '0';          
74
        end if;
75
      when S3 =>
76
        AutoAmpel <= "100";--rot
77
        Fussampel <= "01";--grün
78
        cnt_ena    <= '1';
79
        if counter = 5 then
80
          next_state <= S4;  
81
                    cnt_ena    <= '0';          
82
        end if;
83
      when S4 =>
84
        Taster_reset <= '1';
85
        AutoAmpel <= "100";--rot
86
        Fussampel <= "10";--rot
87
        cnt_ena    <= '1';
88
        if counter = 2 then
89
          next_state <= S5;
90
                    cnt_ena    <= '0';          
91
        end if;
92
      when S5 =>
93
        cnt_ena    <= '1';
94
        AutoAmpel <= "110";--rot,gelb
95
        Fussampel <= "10";--rot
96
        if counter = 2 then
97
          next_state <= S0;
98
          cnt_ena    <= '0';
99
        end if;
100
      when others =>
101
        AutoAmpel <= "100"; --rot
102
        Fussampel <= "10";  --rot
103
        next_state <= S0;
104
    end case;
105
  end process state_logic;
106
107
108
109
end architecture behavior;

von dden (Gast)


Lesenswert?

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.

von Rigusashi (Gast)


Lesenswert?

@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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.