Forum: FPGA, VHDL & Co. Multiplikation mit einem std_logic möglich?


von BoLLe (Gast)


Lesenswert?

Hallo in die Runde,

ich versuche schon seit einiger Zeit Xilinx bei der Synthese zu 
überreden einen std_logic (kein vector) mit einer Zahl zu 
multiplizieren. Ziel ist es, die Zahl abhängig vom Zustand der Leitung 
mit 0 oder 1 zu multiplizieren.

Folgendes hab ich probiert:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
 ...
6
 ...
7
8
 process (clk) begin
9
   if clk'event and clk='1'then
10
     ergebnis <= to_integer(unsigned( datain(20) ))*3;
11
   end if;
12
 end process;

Da aber das Casting zu unsigned nur klappt wenn es ein vector ist, dacht 
ich mir, ich hänge noch eine Null davor.

 ergebnis <= to_integer(unsigned( '0' & datain(20) ))*3;

Nur dann kommt der folgender Fehler:
ERROR:HDLParsers:3329 - "..." Line ... Expression in type conversion to 
unsigned has 4 possible definitions in this scope, for example, SIGNED 
and UNSIGNED.

Gibt es in diese Richtung irgendeine Lösung? Wenn nicht, werd ich die 
Berechnung wohl in zwei Takte aufteilen müssen und alle Leitungen mit 
einem if abfragen :(.

Grüße und ein schönes Wochenende noch
Bolle

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


Lesenswert?

BoLLe schrieb:
> ERROR:HDLParsers:3329 - "..." Line ... Expression in type conversion to
> unsigned has 4 possible definitions in this scope, for example, SIGNED
> and UNSIGNED.
http://www.lothar-miller.de/s9y/archives/82-Qualifier.html

BoLLe schrieb:
> ich versuche schon seit einiger Zeit Xilinx bei der Synthese zu
> überreden einen std_logic (kein vector) mit einer Zahl zu
> multiplizieren. Ziel ist es, die Zahl abhängig vom Zustand der Leitung
> mit 0 oder 1 zu multiplizieren.
Ähmmm..... Null oder Eins?
Warum dann multiplizieren?
Ich würde das ganz ohne Prozess und Takt mit einem Multiplexer machen:
1
  -- falls ergebnis ein Vektor ist
2
  ergebnis <= std_logic_vector(to_unsigned(3,ergebnis'length)) when datain(20)='1' else (others=>'0');
3
4
  -- falls ergebnis ein Integer ist
5
  ergebnis <= 3 when datain(20)='1' else 0;

von BoLLe (Gast)


Lesenswert?

Hallo Lothar,

danke für die schnelle Antwort. Es lag am fehlenden Hochkomma 
unsigned'(..). Wo liegt da der Unterschied? Wird da das unsigned nach 
innen in die Klammer hineinkommuniziert, nach außen oder beides? Die 
Frage kommt daher weil, wenn ich den Cast unsigned() aufrufe dacht ich, 
dass ich dem dem Kompiler implizit erzähle das ich ein unsigned haben 
will.



> Ähmmm..... Null oder Eins?
Beides :). Die Null oder Eins schaltet die Multiplikation an oder aus.

> Warum dann multiplizieren?
Weil ich dann folgendes realisieren möchte:
1
ergebnis <= to_integer(unsigned'( '0' & datain(20) ))*1  +
2
            to_integer(unsigned'( '0' & datain(21) ))*2  +
3
            ...
4
            to_integer(unsigned'( '0' & datain(24) ))*10 +
5
            to_integer(unsigned'( '0' & datain(25) ))*20;


Grüße
 Bolle

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


Lesenswert?

BoLLe schrieb:
> Wo liegt da der Unterschied?
Ein Qualifier ist etwas anderes als ein Cast...

> Wird da das unsigned nach
> innen in die Klammer hineinkommuniziert, nach außen oder beides?
Es wird gesagt: das was jetzt kommt, ist ein unsigned-Vektor.
Die Konvertierung mit to_integer funktioniert nur, wenn der Datentyp 
bekannt ist, und dieser Datentyp wird mit dem Qualifier angegeben. Denn 
für den Synthesizer kann '0'&std_logic ja auch ein Signed oder Unsigned 
Vektor sein...

BoLLe schrieb:
> ergebnis <= to_integer(unsigned'( '0' & datain(20) ))*1  +
>             to_integer(unsigned'( '0' & datain(21) ))*2  +
>             ...
Was käme da anstelle der Punkte? Die Zahlen 4 und 8?
Dann würdest du aber besser gleich den datain(23 downto 20) als Vektor 
nehmen. Denn dann wäre das hier
1
 einer    <= to_integer(unsigned'( '0' & datain(20) ))*1  +
2
             to_integer(unsigned'( '0' & datain(21) ))*2  +
3
             to_integer(unsigned'( '0' & datain(22) ))*4  +
4
             to_integer(unsigned'( '0' & datain(23) ))*8;
funktionell genau das selbe wie das hier:
1
 einer    <= to_integer(unsigned(datain(23 downto 20)));
Allerdings ist da keine Multiplikation beteiligt...

Und dann machst du das noch mit den Zehnern (27 downto 24), und dann 
multiplizierst du die Zehner mit 10 und addierst die beiden Zusammen. 
Fertig...

von BoLLe (Gast)


Lesenswert?

Stimmt, diese Idee ist noch einfacher und platzsparender. Danke, werd 
ich gleich umsetzen.


Hmmm ich erkenne noch nicht den Unterschied.

Typ: std_logic_vector == [ '0' & datain(20) ]
Typ: unsigned         == [ unsigned'( '0' & datain(20) ) ]
Typ: ???              == [ unsigned( '0' & datain(20) ) ]

Kann es sein, das der Unterschied im Zeitpunkt der Betrachtung liegt?


Dann noch was zu deiner Homepage. Da muss ich ein großes Lob 
aussprechen. Hat mir in vielen Dinge weitergeholfen. Nur ist mir gerade 
aufgefallen, dass der Link, den du mir in deiner ersten Antwort gegeben 
hast, nicht links im Menü verlinkt ist. Über die Suche ist er 
auffindbar. Aber die Suche benutze ich generell nicht und es wäre 
schade, wenn weiteres Wissen oder gute Tipps durch fehlende Links 
verloren gehen.

Zur Suche: wenn ich nach "cast" suchen lasse, findet er nichts. Da 
dachte ich, dass er mir die Seite "Numeric_Std" zeigt.

Grüße
 Bolle

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


Lesenswert?

BoLLe schrieb:
> Typ: std_logic_vector == [ '0' & datain(20) ]
Falsch. Typ unbekannt.
> Typ: unsigned         == [ unsigned'( '0' & datain(20) ) ]
Typ wird mit Qualifier explizit als unsigned angegeben
> Typ: ???              == [ unsigned( '0' & datain(20) ) ]
Ein unbekannter Typ (s.o.) soll nach unsigned gecastet werden.


BoLLe schrieb:
> Nur ist mir gerade aufgefallen, dass der Link, den du mir in deiner ersten
> Antwort gegeben hast, nicht links im Menü verlinkt ist.
Der liegt in den Code-Schnipseln:
http://www.lothar-miller.de/s9y/categories/48-Code-Schnipsel

BoLLe schrieb:
> Zur Suche: wenn ich nach "cast" suchen lasse, findet er nichts.
Danke für den Hinweis. Habe das Keyword in den Beitrag aufgenommen... 
;-)

von BoLLe (Gast)


Lesenswert?

Alles klar, nun geht mir ein Licht auf. Danke für deine Hilfe.

BoLLe

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.