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