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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.