Forum: FPGA, VHDL & Co. VHDL: Anzahl Flip-Flops reduzieren


von test (Gast)


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

von Guest (Gast)


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.

von test (Gast)


Lesenswert?

Hi,

vielen Dank. Das hat mir sehr geholfen. Bei "syn_encoding" = sequential 
macht er es so wie gewünscht.


Viele Grüße

test

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


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.

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.