Forum: FPGA, VHDL & Co. mit VHDL optimieren


von Blinky (Gast)


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?
1
  "1111110" when "10101"  -- 0
2
  "0110000" when "00011"  -- 1
3
  "1101101" when "11001"  -- 2
4
  "1111001" when "11011"  -- 3
5
  "0110011" when "01111"  -- 4
6
  "1011011" when "11110"  -- 5
7
  "1011111" when "11100"  -- 6
8
  "1110000" when "10011"  -- 7
9
  "1111111" when "11101"  -- 8
10
  "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  ;-)

von Blinky (Gast)


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?

von Da D. (dieter)


Lesenswert?

Was hat dein Problem mit VHDL zu tun?!?


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

von Boris M. (borism)


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:
1
entity top is
2
    Port ( clk : in  STD_LOGIC;
3
        input : in std_logic_vector( 4 downto 0);
4
        output : out std_logic_vector (6 downto 0));
5
end top;
6
architecture Behavioral of top is
7
begin
8
process
9
begin
10
if rising_edge(clk) then
11
  case input is
12
  when "10101" => output <= "1111110";    -- 0
13
  when "00011" => output <= "0110000";    -- 1
14
  when "11001" => output <= "1101101";    -- 2
15
  when "11011" => output <= "1111001";    -- 3
16
  when "01111" => output <= "0110011";    -- 4
17
  when "11110" => output <= "1011011";    -- 5
18
  when "11100" => output <= "1011111";    -- 6
19
  when "10011" => output <= "1110000";    -- 7
20
  when "11101" => output <= "1111111";    -- 8
21
  when "11111" => output <= "1111011";    -- 9
22
  when others => NULL;
23
  end case;
24
end if;
25
end process;
26
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...

von Xenu (Gast)


Lesenswert?

Ein Programm zur Logikminimierung gibt es z.B. hier:

http://diamond.gem.valpo.edu/~dhart/ece110/espresso/tutorial.html

von Blinky (Gast)


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?

von Der Besucher (Gast)


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;

von Christian R. (supachris)


Lesenswert?

Das wird doch sicher als ROM synthetisiert...?

von Der Besucher (Gast)


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

von Der Besucher (Gast)


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

von Der Besucher (Gast)


Lesenswert?

Dennoch haben Da Dieter und Xenu Recht und man sollte anders an das 
Problem herangehen.

Der Besucher

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


Lesenswert?

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

von Blinky (Gast)


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
1
 
2
 when others  => output <= "0000000";    -- default

Wenn man das weglassen könnte?!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Blinky schrieb:
> Das liegt an
Wenn du das sagst...

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

von Iulius (Gast)


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.

von BorisM (Gast)


Lesenswert?

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

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


Lesenswert?

> when others => NULL;
Damit gibt es Latches:
1
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:
1
    when others  => output <= "1111011";    
2
    when others  => output <= "-------";    
3
    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.

von Der Besucher (Gast)


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

von Der Besucher (Gast)


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

von Der Besucher (Gast)


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

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


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.

von Lötknecht (Gast)


Lesenswert?

Bin mit ein wenig probieren auf diese einfache Lösung gekommen:
1
A <= I4;
2
B <= I0;
3
C <= I1 OR I2;
4
D <= I4 AND (I3 OR I2);
5
E <= I4 AND NOT I1;
6
F <= I2;
7
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
1
    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ß?

von Blinky (Gast)


Lesenswert?

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

von Der Besucher (Gast)


Lesenswert?

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

Der Besucher

von Blinky (Gast)


Angehängte Dateien:

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.

von Da D. (dieter)


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.

von Der Besucher (Gast)


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

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


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... :-/

von Läubi .. (laeubi) Benutzerseite


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?

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


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.

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.