mit VHDL optimieren

Gast #1447997
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  ;-)
Gast
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?
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...
Gast
@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?
Gast
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;
Gast
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
Gast
@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
Gast
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?!
Gast
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.
Gast
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...
Moderator (Firma: Titel) Persönliche Seite
> 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.
Gast
@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
Gast
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
Gast
Wobei...die Idee mit einfach ein kleines ROM (32x8) einzusetzen hat auch 
einen gewissen Charm und sollte günstig zu realisieren sein.

Der Besucher
Gast
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ß?
Gast
@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
Gast
>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.
Angehängte Dateien:
Gast
@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
Moderator (Firma: Titel) Persönliche Seite
> 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... :-/
Persönliche Seite
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?
Moderator (Firma: Titel) Persönliche Seite
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.