Range aus Enum-Type

Gast #3192171
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
Gast #3192204
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.
Moderator (Firma: Titel) Persönliche Seite #3192273
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...
Gast #3192283
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;
Angehängte Dateien:
Gast #3192293
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...
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #3192316
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren