mikrocontroller.net

Forum: FPGA, VHDL & Co. mit VHDL optimieren


Autor: Blinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe von VHDL nur ganz ganz wenig Ahnung. Wie kann ich VHDL benutzen um 
dieses was ich in "Relais-Logik" bauen will zu optimieren?
  "1111110" when "10101"  -- 0
  "0110000" when "00011"  -- 1
  "1101101" when "11001"  -- 2
  "1111001" when "11011"  -- 3
  "0110011" when "01111"  -- 4
  "1011011" when "11110"  -- 5
  "1011111" when "11100"  -- 6
  "1110000" when "10011"  -- 7
  "1111111" when "11101"  -- 8
  "1111011" when "11111"  -- 9

"0000000" when others will ich weglasen um meine Logik so einfach wie 
möglich zu halten. Hoffentlich kann man das verstehen  ;-)

Autor: Blinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,
habe das vieleicht nicht gut verständlich geschrieben.

Nochmal anders formuliert:

Ich habe 5 Eingänge das sind 5 Relais je 2 * UM.
Wie kann ich die Relais-Kontakte so auf 7 Ausgänge verteilen, das ich 
die im VHDL-Code angegebene Ausgangstabelle mit 7 Ausgängen bekomme?

Ich dachte das man irgendeinen VHDL-Compiler dazu missbrauchen könnte, 
um die benötigte Logik zu minimieren...

Durch blosses Anschauen (ich habe den VHDL-Code in Grossschrift 
ausgedruckt, die einzelnen Spalten mit der Schere ausgeschnitten und 
festgestellt das 4 Bits von Eingang(4 downto 0) in Ausgang(6 downto 0) 
exakt wiederzufinden sind. Die fehlenden 3 Bits von Ausgang(6 downto 
0)müssten sich durch wired-OR etc. herstellen lassen. Kann dabei nicht 
irgendein VHDL-Compiler helfen?

Autor: Da Dieter (dieter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat dein Problem mit VHDL zu tun?!?


Und Logik minimieren kann man mit dem Verfahren nach Quine-McCluskey 
machen.

Autor: Boris M. (borism)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich glaube dass du dir das etwas zu einfach vorstellst. Der 
VHDL-Compiler minimiert die Logik für einen FPGA. Ich glaube nicht dass 
du damit allzu viel anfangen kannst. Aber du kannst dir ja von Xilinx 
das WebPack auf den Computer installieren und etwas spielen. Der 
VHDL-Code ist ja recht überschaubar. Ich habe folgendes mal schnell 
eingegeben:
entity top is
    Port ( clk : in  STD_LOGIC;
        input : in std_logic_vector( 4 downto 0);
        output : out std_logic_vector (6 downto 0));
end top;
architecture Behavioral of top is
begin
process
begin
if rising_edge(clk) then
  case input is
  when "10101" => output <= "1111110";    -- 0
  when "00011" => output <= "0110000";    -- 1
  when "11001" => output <= "1101101";    -- 2
  when "11011" => output <= "1111001";    -- 3
  when "01111" => output <= "0110011";    -- 4
  when "11110" => output <= "1011011";    -- 5
  when "11100" => output <= "1011111";    -- 6
  when "10011" => output <= "1110000";    -- 7
  when "11101" => output <= "1111111";    -- 8
  when "11111" => output <= "1111011";    -- 9
  when others => NULL;
  end case;
end if;
end process;
end Behavioral;
Ich bekomme aber leider das RTL Schematik nicht gescheit in ein PNG 
gebannt.

PS: Es ist durchaus möglich dass ich nicht Recht habe - bin schließlich 
auch noch blutiger Anfänger was FPGAs angeht. Warte mal die Profis ab...

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Programm zur Logikminimierung gibt es z.B. hier:

http://diamond.gem.valpo.edu/~dhart/ece110/espress...

Autor: Blinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Autor:  Boris M. (borism)

Danke für die Mühe.
Du hast das als Prozess geschrieben. Ich wollte nur Kombinatorik machen 
mit "WITH SELECT". Ist wohl als Prozess (=Schaltwerk) für FPGA besser?

>Ich bekomme aber leider das RTL Schematik nicht gescheit in ein PNG
>gebannt.

Ich vermute mal, das sind mehrere Seiten?

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es eher wie folgt beschreiben (obiges leicht modifiziert). Ich 
bezweifel nämlich, das irgendwelche Takte zur Verfügung stehen. Auch 
sollte man den fall beachten, dass der Eingang keine gültigen Werte hat.
Ich habe es mal in ein Synthesetool geworfen und es kommt eine nette 
kleine Schaltung raus. Optimierte Netzliste kann ich leider nicht posten 
wegen Technologieabhängigkeit (sollte mir mal ne kleine generic-lib 
besorgen). Aber der Weg ist ohne weiteres gangbar. Und die Netzliste 
kann man dann per Hand nachbauen :)

Der Besucher


LIBRARY ieee;
USE ieee.std_logic_1164.all;

entity top is
    Port ( input  : in std_logic_vector( 4 downto 0);
           output : out std_logic_vector (6 downto 0));
end top;

architecture Behavioral of top is
begin

process(input)
begin
  case input is
    when "10101" => output <= "1111110";    -- 0
    when "00011" => output <= "0110000";    -- 1
    when "11001" => output <= "1101101";    -- 2
    when "11011" => output <= "1111001";    -- 3
    when "01111" => output <= "0110011";    -- 4
    when "11110" => output <= "1011011";    -- 5
    when "11100" => output <= "1011111";    -- 6
    when "10011" => output <= "1110000";    -- 7
    when "11101" => output <= "1111111";    -- 8
    when "11111" => output <= "1111011";    -- 9
    when others  => output <= "0000000";    -- default
  end case;
end process;

end Behavioral;

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird doch sicher als ROM synthetisiert...?

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei meinem Code wird im übrigen nur kombinatorische Logik erzeugt.
Kann man es auch mit dem SELECT, oder auch mit If THEN ELSE ausserhalb 
eines Prozesses beschreiben. Wie immer führen viele Wege zum Ergebnis.

Der Besucher

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian:
Also bei mir kamen INV, (N)AND und (N)OR gatter raus.

Wäre mal interesant eine Library zu erstellen, die 74xxx-Logicgatter 
(oder ähnliches) optimal nutzt.

Der Besucher

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennoch haben Da Dieter und Xenu Recht und man sollte anders an das 
Problem herangehen.

Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian R. schrieb:
> Das wird doch sicher als ROM synthetisiert...?
Nein. Die Lücken zwischen den input Werten (Adressbreite) sind zu 
groß...

Autor: Blinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal danke schön an alle die sich damit befasst haben.
Habe das mit der CASE IS eingetippt und den RTL-Schematic angeschaut.

Das Teil ist ganz schön kompliziert und hat zum beispiel nicht gemerkt 
das
Output(6) <= Input(4) sein könnte.
Da gibt es noch 3 weitere...

Das liegt an
 
 when others  => output <= "0000000";    -- default

Wenn man das weglassen könnte?!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blinky schrieb:
> Das liegt an
Wenn du das sagst...

> Wenn man das weglassen könnte?!
  when others  => output <= "-------";    -- default
So sagst du ihm das es dir egal ist was sonst rauskommt... dann kann 
auch besser optimiert werden.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du das weg lässt kannst du aber nicht sicher sein was du am ausgang 
hast wenn der eingang irgentwas anderes liefert.

Und das der irgentwas nicht merkt, bezweifle ich stark.

Die Tools sind in der Hinsicht mittlerweile SO mächtig, die scheitern 
wohl kaum an so simpler Logik.

Autor: BorisM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich mich recht Erinnere kann man mit eine NULL-Befehl sagen, dass 
nichts getan wird ->
when others => NULL;
Kann das aber hier daheim leider nicht testen...
Ich denke aber auch das der Weg über VHDL hier der Falsche ist...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> when others => NULL;
Damit gibt es Latches:
WARNING:Xst:737 - Found 7-bit latch for signal <output>.
Denn das heißt, wenn ein anderer Wer als die paar gültigen am Eingang 
anliegt, dann soll der vorherige Ausgangswert gespeichert werden...

Alle diese Beschreibungen liefern (auf den Ressourcenverbrauch bezogen) 
annähernd das selbe Ergebnis:
    when others  => output <= "1111011";    
    when others  => output <= "-------";    
    when others  => output <= "0000000";    

> Ich denke aber auch das der Weg über VHDL hier der Falsche ist...
Das denke ich auch...
Die Synthese macht aus der VHDL-Beschreibung erst mal irgendeine 
Netzliste. Diese Netzliste wird dann später in die Komponenten 
umgesetzt, die es tatsächlich auf dem CPLD oder FPGA gibt. Und diese 
Komponenten (LUT, Makrozelle) haben nunmal mehr Möglichkeiten als reine 
AND/OR/... Gatter.

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Blinky

Es muss aber definiert werden, was in allen anderen der 10 Fälle 
geschieht (sind immerhin 22) ansonsten werden Latches generiert. Und ich 
nehme an, dass du sicherlich keine "gültige" Anzeigewerte möchtest, wenn 
am Eingang "ungültige" Kombinationen stehen.
Mit welcher Technologie willst du die Schaltung eigentlich realisieren?
Vielleicht kann man über diesen Weg eine günstige Lösung finden. Ich 
denke da so an CPLDs oder GALs. Mit einem FPGA schiesst du wohl mit 
Kanonen auf Spatzen.
Die Ausgänge sollen eine 7-Segmentanzeige ansteuern?
Es gibt auch fertige BCD zu 7-Segment Dekoder. Wäre es besser den 
Eingang auf BCD zu konvertieren und so einen Dekoder zu nutzen?

Der Besucher

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der Code im CASE, wenn der Ausgang im BCD-Format(4 bit) 
gewünscht wird:

    when "10101" => output <= x"0";    -- 0
    when "00011" => output <= x"1";    -- 1
    when "11001" => output <= x"2";    -- 2
    when "11011" => output <= x"3";    -- 3
    when "01111" => output <= x"4";    -- 4
    when "11110" => output <= x"5";    -- 5
    when "11100" => output <= x"6";    -- 6
    when "10011" => output <= x"7";    -- 7
    when "11101" => output <= x"8";    -- 8
    when "11111" => output <= x"9";    -- 9
    when others  => output <= x"f";    -- oder auch a bis e

Das könnte etwas kleiner werden. Es wird aber der zusätzliche Dekoder 
benötigt.

Der Besucher

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei...die Idee mit einfach ein kleines ROM (32x8) einzusetzen hat auch 
einen gewissen Charm und sollte günstig zu realisieren sein.

Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei die erste Frage diese war:
> Wie kann ich VHDL benutzen um dieses was ich
> in "Relais-Logik" bauen will zu optimieren?
Die Antwort dürfte also lauten: Gar nicht.

Autor: Lötknecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin mit ein wenig probieren auf diese einfache Lösung gekommen:
A <= I4;
B <= I0;
C <= I1 OR I2;
D <= I4 AND (I3 OR I2);
E <= I4 AND NOT I1;
F <= I2;
G <= I3;
Leider hat das Xilinx Webpack diese einfache Lösung nicht gefunden.
Das läßt mich jetzt doch irgendwie an diesem Tool zweifeln!!!
Ich habe sogar versucht dem ganzen mit
    when others  => output <= (input(4) & input(0) & (input(1) or input(2)) & "00" & input(2) & input(3));    -- default
ein bischen auf die Sprünge zu helfen.
Oder gibt es da unterschiedliche Optimierungslevel die man einfach 
einschalten muß?

Autor: Blinky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lötknecht:
Recht schönen Dank, so sieht das jetzt bei mir in VHDL aus:
entity top is
    Port ( input  : in std_logic_vector( 4 downto 0);
           output : out std_logic_vector (6 downto 0));
end top;
.
.
.
output(6) <= Input(4);
output(5) <= Input(0);
output(4) <= Input(1) OR Input(2);
output(3) <= Input(4) AND (Input(3) OR Input(2));
output(2) <= Input(4) AND NOT Input(1);
output(1) <= Input(2);
output(0) <= Input(3);
.
.
.
Leider noch nicht einfach genug! Input(2) kommt dreimal vor, meine 
Relais haben aber nur 2 * UM

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müssen es unbedingt Relais sein?
Sind doch ziemlich groß, mechanisch, stromhungrig und teuer.
Aber haben einen tollen Sound!

Der Besucher

Autor: Blinky (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>Müssen es unbedingt Relais sein?
>Sind doch ziemlich groß, mechanisch, stromhungrig und teuer.

Ich will bipolare Relais verwenden, die bekommen nur einen ganz kurzen 
Impuls zum Umschalten. Danach halten die stromlos ihre Position.

Autor: Da Dieter (dieter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hör endlich auf mit deinem VHDL für ne Hand voll Relais!!!

Schmeiß das VHDL weg, nimm Zettel und Bleistift und schalte deinen 
Gehirn ein. Damit kommst du bei solch einfachen Aufgaben am schnellsten 
ans Ziel.

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Da Dieter
>hör endlich auf mit deinem VHDL für ne Hand voll Relais!!!

Man sollte auch mal unkonventionelle Wege einschlagen.
Und schon gar nicht jemanden dafür rügen, das er es tut.

Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Man sollte auch mal unkonventionelle Wege einschlagen.
Schon, aber das Ziel von VHDL ist nicht, eine Relaislogik mit einem 
Synthesizer für CPLDs/FPGAs möglichst effizient abzubilden. VHDL als 
Beschreibungssprache gibt das nicht her.
Dafür wäre ein Relais-VHDL-Synthesizer nötig. Hier sind die 
Relaishersteller gefragt ;-)

Dass die Logik durch den Synthesizer ein wenig ineffizient abgebildet 
wird, kann man dadurch verschmerzen, dass der Quelltext einfach lesbar 
und wartbar ist. Klar sind durch manuelle Optimierungen Platz- und/oder 
Geschwindigkeitsvorteile möglich. Die mache ich aber erst, wenn das 
FPGA/CPLD voll ist.

> Man sollte auch mal unkonventionelle Wege einschlagen.
Man sollte dann aber auch rechtzeitig erkennen, dass/wenn/ob es eine 
Sackgasse ist... :-/

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Dass die Logik durch den Synthesizer ein wenig ineffizient abgebildet
> wird, kann man dadurch verschmerzen, ...
Ich weiß garnicht ob das überhaupt ineffizient ist.
Da eine 4-Input Lut wenigstens jede belibiege Funktion mit 4 Inputs 
abbilden kann, warum Prozessorzeit verschwenden um da etwas zu 
optimieren?

Um Gatter einzusparen die später eh nicht implementiert werden?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich weiß garnicht ob das überhaupt ineffizient ist.
Kann man ausprobieren:
Die Beschreibung mit select, case & co (egal ob mit "---" oder "XXX" 
oder others oder auch nicht...) ergibt einen Verbrauch von ca. 11 LUTs.

Die Beschreibung dort im 
Beitrag "Re: mit VHDL optimieren"
braucht gerade mal 2 LUTs. Das könnte man durchaus als "effizienter" 
bezeichnen... ;-)

> Um Gatter einzusparen die später eh nicht implementiert werden?
Nach dem Synthesizer kommt noch der Mapper, der nur das was der 
Synthesizer ineffizient abbildet, in die LUTs packt. Und danach noch 
Place&Route. Optimiert wird dabei (so gut wie) nichts mehr.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.