VHDL: Anzahl Flip-Flops reduzieren

Gast #4440199
Lesenswert?

Hallo,

ich habe mal ein wenig mit VHDL herumgespielt und dabei ist mir eine 
Sache aufgefallen, für die ich keine Lösung finde.

Folgender Code soll nur auf Tastendruck einen Ausgang ein- und 
ausschalten. Ist also eine Statemachine mit 4 Zuständen.
1
library ieee;
2
use ieee.std_logic_1164.all;
3

4
entity switch is
5
  port( clock, reset : in std_logic;
6
        x            : in std_logic;
7
         y            : out std_logic);
8
end entity switch;
9

10
architecture behaviour of switch is
11
  type state_type is (z0, z1, z2, z3);
12
  signal state : state_type := z0;
13
  begin
14
  
15
  seq: process (clock, reset) is
16
  begin
17
    if (reset = '0') then
18
        state <= z0;
19
    elsif rising_edge(clock) then
20
      case state is
21
      when z0 =>
22
        if (x = '0') then state <= z1;
23
        else state <= z0;
24
        end if;
25
      when z1 =>
26
        if (x = '1') then state <= z2;
27
        else state <= z1;
28
        end if;
29
      when z2 =>
30
        if (x = '0') then state <= z3;
31
        else state <= z2;
32
        end if;
33
      when z3 =>
34
        if (x = '1') then state <= z0;
35
        else state <= z3;
36
        end if;
37
      end case;
38
    end if;
39
  end process;
40
  
41
  proc: process(state) is
42
  begin
43
    case state is
44
      when z0 =>
45
        y <= '0';
46
      when z1 =>
47
        y <= '1';
48
      when z2 =>
49
        y <= '1';
50
      when z3 =>
51
        y <= '0';
52
      end case;
53
  end process;
54
end architecture;


Wenn ich die auf Papier als Digitalschaltung entwerfe und mit dem 
Diagramm-Designer in Altera Quartus zeichne reichen 2 Flip-Flops aus.
Aus dem VHDL-Code wird aber für jeden Zustand ein Flip-Flop, also 4 
Stück, erzeugt.

Übersehe ich irgendwelche Randbedingungen, die ihn daran hindern das zu 
optimieren? Oder ist das einfach so?

Es funktionieren jedenfalls beide Varianten auf der Hardware.


Viele Grüße

test
Gast #4440211
Lesenswert?

Versuch mal in den Synthesizer settings das FSM encoding umzustellen.

http://quartushelp.altera.com/15.0/mergedProjects/hdl/vlog/vlog_file_dir_syn_encoding.htm

Sequential dürfte dir Helfen. Der Synthesizer schreibt bestimmt irgend 
einen report darüber, welche settings er benutzt. Zumindest XST macht 
das.

Letztendlich führt je nach FSM ein encoding zu einem bestimmten 
Resultat, z.B. besonders schnelle Logik oder besonders wenige FFs/LUTs. 
Der Synthesizer optimiert und nutzt Heuristiken, er optimiert aber nicht 
rein auf Flächennutzung solang du ihm das nicht explizit vorschreibst. 
Außerdem können Heuristiken auch mal daneben gehen, vor allem bei 
besonders kleinen oder großen FSMs.
Moderator (Firma: Titel) Persönliche Seite #4440438
Lesenswert?

test schrieb:
> if (x = '0') then state <= z1;
Ein Tipp zur Umsetzung ins "echte Leben": jeden asynchronen Eingang 
eintakten(**)...
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

Ergibt dann:
http://www.lothar-miller.de/s9y/archives/53-Drehgeber,-Encoder,-Quadraturdecoder.html

(**) nur, wenn du sicher sein kannst, dass eine Änderung an 1 Eingang 
nur Auswirkungen auf 1 Ausgang hat, darfst du die Sync-Stufe weglassen. 
Dabei darf dann aber auch kein Register-Duplication oder irgendeine 
Optimierung reinsfunken.

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