Forum: FPGA, VHDL & Co. Alle '0'en in std_logic_vector in 'Z' ändern.


von Gustl B. (-gb-)


Lesenswert?

Hallo,

ich will über VGA ein Bild ausgeben aus einem FPGA mit 3Bit je Farbe.
Dafür habe ich die Widerstände

LSB
BIT0 :   1kOhm
BIT1 : 0.5kOhm
BIT2 : 0.25kOhm
MSB

genommen. Jetzt ist das aber so, dass wenn ich z. B. eine "011" ausgebe, 
der Ausgang also über 250 Ohm mit Masse verbunden ist weil das 
höchstwertige Bit eben eine '0' ist. Schön wäre es, wenn da eine 'Z' 
stünde.
Gibt es da eine elegante Möglichkeit alle '0' in einem std_logic_vector 
zu 'Z' zu ändern?
Vielen Dank!

von Tasg (Gast)


Lesenswert?

jo

von Gustl B. (-gb-)


Lesenswert?

Sie bringen in die vielschichtige Diskussion interessante neue
Aspekte ein, die die Problematik von einer völlig neuen Seite
beleuchten. Ihre Ausführungen zeugen von hoher Sachkenntnis und
überzeugen auch im Detail. Besonders im Mittelteil transportieren sie
eine Fülle hochwertiger Informationen, die dem Kreis der betroffenen
Nutzer nicht vorenthalten werden dürfen. Aber trotz guter B-Note nur so 
mittel ...

von Sigi (Gast)


Lesenswert?

Deine VGA-Farbansteuerung funktioniert ja
per Spannungsteiler. Wenn Du da 'Z' ansteuerst,
dann hast Du ja permanent VCC oder bei "000"
GND. Machst also so wie in allen anderen
Controllern.

von Georg A. (georga)


Lesenswert?

Wenn du ein R-2R-Netzwerk nimmst, hast du das Problem nicht und noch 
dazu eine konstante Impedanz (was bei VGA nicht so verkehrt ist):

https://de.wikipedia.org/wiki/R2R-Netzwerk

Wenn du das nicht willst:

Unelegant wäre ja das:
1
vga_out(0)<='Z' when val(0)='0' else '1';
2
vga_out(1)<='Z' when val(1)='0' else '1';
3
vga_out(2)<='Z' when val(2)='0' else '1';

Eleganter und unabhängig von der Länge (als concurrent statement und 
hoffentlich ohne Syntaxfehler ;) )
1
xloop: for i in val'range generate
2
         vga_out(i)<='Z' when val(i)='0' else '1';
3
       end generate xloop;

Sicher gibts noch mehr Tricks, lesbarer wirds aber wohl eher nicht.

von Gustl B. (-gb-)


Lesenswert?

Sigi schrieb:
> Deine VGA-Farbansteuerung funktioniert ja
> per Spannungsteiler. Wenn Du da 'Z' ansteuerst,
> dann hast Du ja permanent VCC oder bei "000"
> GND. Machst also so wie in allen anderen
> Controllern.

Wieso? Ich habe das jetzt vom Prinzip her wie hier 
https://reference.digilentinc.com/_media/basys3-vga_circuit_diagram.png
Wenn ich da ein Bit '0' setze dann ziehe ich doch das Signal nach unten, 
ich müsste also 'Z' setzen.

Georg A. schrieb:
> Wenn du ein R-2R-Netzwerk nimmst, hast du das Problem nicht und noch
> dazu eine konstante Impedanz (was bei VGA nicht so verkehrt ist):

Hier mal ein Bildchen dazu wie das vom Prinzip her aussieht:
http://kampis-elektroecke.de/wp-content/uploads/2014/08/VGA3.png
Wenn ich da jetzt ein Bit auf '0' setze, dann zeiht das doch ebenfalls 
das Signal nach unten?! Oder wieso sollte das hier nicht so sein?
Aber vielen Dank für Deine beiden Lösungen. Hatte nur gehofft es gäbe da 
irgendeine fertige Funktion in VHDL oder Einstellung/Constraint für den 
IO dass der entweder '1' oder 'Z' ist aber nie '0'.

: Bearbeitet durch User
von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> Gibt es da eine elegante Möglichkeit alle '0' in einem std_logic_vector
> zu 'Z' zu ändern?
> Vielen Dank!

Schreibe eine Funkion, für die Umwandlung.
als Idee nimm diese Funktionen

http://www.stefanvhdl.com/vhdl/vhdl/txt_util.vhd

von Gustl B. (-gb-)


Lesenswert?

Ich hab das jetzt schon mit einer Loop gelöst. Gefragt hatte ich weil 
ich doch eine Standardfunktion vermutet hatte.

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.