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
entitytopis
2
Port(clk:inSTD_LOGIC;
3
input:instd_logic_vector(4downto0);
4
output:outstd_logic_vector(6downto0));
5
endtop;
6
architectureBehavioraloftopis
7
begin
8
process
9
begin
10
ifrising_edge(clk)then
11
caseinputis
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
whenothers=>NULL;
23
endcase;
24
endif;
25
endprocess;
26
endBehavioral;
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: 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?
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;
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
@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
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
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.
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
whenothers=>output<="1111011";
2
whenothers=>output<="-------";
3
whenothers=>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.
@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
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
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.
Bin mit ein wenig probieren auf diese einfache Lösung gekommen:
1
A<=I4;
2
B<=I0;
3
C<=I1ORI2;
4
D<=I4AND(I3ORI2);
5
E<=I4ANDNOTI1;
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
>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.
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.
@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
> 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... :-/
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?
> 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.