Forum: FPGA, VHDL & Co. Range aus Enum-Type


von Hubert (Gast)


Lesenswert?

Hallo,

ich habe folgende Zustandsmaschine:
1
type hallo is (no, no2, start, x1, x2, x3, stop, no3, no4);
2
signal sig : hallo;


Nun möchte ich (sinngemäß) folgende Abfrage machen:
1
if hallo >= start and hallo <= stop then
2
    signalisiere_irgendwas <= '1';
3
end if;



Wie kann ich eine solche FSM-Bereichsabfrage elegant umsetzen 
(synthesefähig)?

Gruß, Hubert

von Hubert (Gast)


Lesenswert?

Ach ja: Der Kniff soll so sein, dass ich immer den Range zwischen 
"start" und "stop" erwische, unabhängig davon, dass davor, zwischendrin, 
danach Zustände hinzukommen/wegfallen.

:-)

von Hubert (Gast)


Lesenswert?

Kleine Korrektur:
1
if sig >= start and sig <= stop then
2
    signalisiere_irgendwas <= '1';
3
end if;


Lässt sich das synthetisieren? Simulation klappt ...

von PittyJ (Gast)


Lesenswert?

Warum probierst du das nicht einfach aus? Dauert 30 Sekunden, das 
einfach mal zu übersetzen. Geht schneller als hier die Frage zu 
formulieren.

Der Compiler würde dann schon eine Fehlermeldung werfen.

Meiner kann es.

von Hubert (Gast)


Lesenswert?

>Dauert 30 Sekunden, das einfach mal zu übersetzen. Geht schneller als hier >die 
Frage zu formulieren.

Du kannst aber schnell tippen ;-)

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


Lesenswert?

XST kanns. Und mit dem neuen Parser (ab V6/S6 oder siehe 
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html) 
geht sogar noch mehr:
1
type zustaende is (za, zb, zc, zd, ze, zf, zg, zh, zi);
2
signal z : zustaende;
3
4
begin 
5
   process begin  
6
      wait until rising_edge(clk); 
7
8
      if z < zustaende'right then
9
         z <= zustaende'succ(z);    -- geht
10
         z <= zustaende'leftof(z);  -- geht
11
         z <= zustaende'val(zustaende'pos(z)+1);  -- geht
12
      else
13
         z <= zustaende'left;
14
      end if;   
15
16
      if z >= zb and z <= zh then     x <= '0';
17
      else                            x <= '1';
18
      end if;

Alternativ kann man ins Handbuch zum Synthesizer unter dem Kapitel 
"Attribute" schauen...

von Johann (Gast)


Angehängte Dateien:

Lesenswert?

naja, nicht ganz in 30 Sekunden, aber dafür mit Screenshot:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity fsm_range_synthesis is
5
port(
6
    iClk : in  std_logic;
7
    oShow : out std_logic
8
);
9
end entity;
10
11
12
architecture test of fsm_range_synthesis is
13
14
15
16
type hallo is (no, no2, start, x1, x2, x3, stop, no3, no4);
17
signal sig : hallo := no;
18
19
signal clk : std_logic := '0';
20
signal show : std_logic := '0';
21
22
23
begin
24
25
oShow <= show;
26
27
28
29
process
30
begin
31
    wait until iClk = '1';
32
    
33
    case sig is
34
        when no =>      sig <= no2;
35
        when no2 =>     sig <= start;
36
        when start =>   sig <= x1;
37
        when x1 =>      sig <= x2;
38
        when x2 =>      sig <= x3;
39
        when x3 =>      sig <= stop;
40
        when stop =>    sig <= no3;
41
        when no3 =>     sig <= no4;
42
        when no4 =>     sig <= no;
43
    end case;
44
45
end process;
46
47
48
49
50
process(sig)
51
begin
52
    if sig >= start and sig <= stop then
53
        show <= '1';
54
    else
55
        show <= '0';
56
    end if;
57
end process;
58
59
60
61
end test;

von Johann (Gast)


Angehängte Dateien:

Lesenswert?

Ah, interessant:
1
process
2
begin
3
    wait until iClk = '1';
4
    
5
    -- case sig is
6
        -- when no =>      sig <= no2;
7
        -- when no2 =>     sig <= start;
8
        -- when start =>   sig <= x1;
9
        -- when x1 =>      sig <= x2;
10
        -- when x2 =>      sig <= x3;
11
        -- when x3 =>      sig <= stop;
12
        -- when stop =>    sig <= no3;
13
        -- when no3 =>     sig <= no4;
14
        -- when no4 =>     sig <= no;
15
    -- end case;
16
    
17
    if sig < hallo'right then
18
        sig <= hallo'succ(sig);    
19
    else
20
        sig <= hallo'left;
21
    end if;
22
23
end process;


Verbraucht ein bisschen mehr Logik...

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


Lesenswert?

Johann schrieb:
> Verbraucht ein bisschen mehr Logik...
Bis hierher kannst du nur sagen: wird vom Synthesizer mit mehr Aufwand 
umgesetzt. Ob dann im FPGA tatsächlich mehr Ressourcen (= LUTs) 
verbraucht werden, das kannst du an diesem Schaltplan noch nicht 
sehen...

> Verbraucht ein bisschen mehr Logik...
Dafür 5 Flipflops weniger... ;-)
Die "manuelle" Codierung ist One-Hot, die "automatische" ist Binär 
umgesetzt. Die LUTs vor diesen 5 Flipflops sind idR. auch verloren...

von Johann (Gast)


Lesenswert?

>Dafür 5 Flipflops weniger... ;-)

Das stimmt natürlich

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.