Forum: FPGA, VHDL & Co. Signal auf bestimte Range von Port mappen


von Odatas (Gast)


Lesenswert?

Also ich habe 2 Signale signal1 und signla 2

signla 1 ist ein signed mit länge n. signal 2 ist ein signed mit länge 
m.

Ich  habe ein Port der Länge m+n.

Ich möchte signla1 auf die stellen port'high bis "port'high-n" mappen 
und signal 2 auf "port'high-n-1" bis "port(0)".

Hätte das signal die gleiche Länge wie der Port würde ich einfach
1
port<=signal;

machen.

Aber wie mache ich das wenn ich die Range beachten muss? Danke

von Student (Gast)


Lesenswert?

port <= signal1 & signal2;

von Patrick P. (odatas)


Lesenswert?

1
product<=highProductReg & lowProductShiftReg;

So ist die Zeile. Er sagt mir aber das er das & nicht kennt:

Isim: Found '0' definitions of operator "&", cannot determinit exact 
overloaded matching definition for "&"

Ich bin unter Sigasi unterwegs falls das hilft die Sprache ist VHDL und 
der simulator ist Isim.


Edit:

So funzt es:
1
product<=highProductReg and lowProductShiftReg;


Ich hoffe jetzt er addiert die zahlen vorher nicht sondern mapt die 
genau so wie er es soll. Sind alles signed

Danke aber schonmal

: Bearbeitet durch User
von Student (Gast)


Lesenswert?

and dürfte nicht das gewünschte Verhalten ergeben.
Das was du brauchst, nennt sich Konkatenation. Soweit ich es in 
Erinnerung habe, geht das bei den std_logic_vector-Datentypen. Deswegen 
findet der Simulator bei Verwendung von signed keinen 
Konkatenierungsoperator.

Deswegen versuche es mal mit dem folgendend Cast:
1
product <= std_logic_vector(highProductReg) & std_logic_vector(lowProductShiftReg);

Kann aber sein, dass ich mich vertue, bin gerade nur am Handy.
Sonst muss du mal nach Concatenation VHDL oder so googlen...

von Patrick P. (odatas)


Lesenswert?

Krieg ich leider genau den gleichen Fehler.


Edit: Achso das Mapping mach ich übrigends nicht als Prozzes sondern 
direkt als ...hmm wie heißt das noch? Architekturbeschreibung? Daran 
wirds wohl liegen.

: Bearbeitet durch User
von Student (Gast)


Lesenswert?

Ich vergaß, dass wahrscheinlich auch product dann signed ist?

Dann versuch mal folgendes ^^:
1
product <= signed(std_logic_vector(highProductReg) & std_logic_vector(lowProductShiftReg));

von Patrick P. (odatas)


Lesenswert?

Ja Produkt ist auch signed. Und tatsächlich jetzt funktioniert. Ich 
hatte versucht product auch als std_ulogic_vector zu machen aber das 
wollte er auch nicht naja egal vielen Dank.

Edit: Wobei ich grad noch an der TEstbench sitze und erst danach sagen 
kann ob es wirklich klappt :D Aber ich hab keinen Fehler mehr angezeigt.

: Bearbeitet durch User
von Patrick P. (odatas)


Lesenswert?

Ok jetzt hab ich noch ein kleines Problem. Das hier:
1
highProductReg <= std_ulogic_vector(partialSum(partialSum'high downto 1));

Ich will alle bis auf die letzte Stelle auf das highProductReg mappen. 
Aber so scheint das nicht zu gehen :(

von Student (Gast)


Lesenswert?

Wie soll es auch, wenn highProductReg doch signed ist?
Dann sollte man nicht versuchen, dem signed-Signal ohne einen Cast ein 
Datum vom  Typ std_ulogic_vector zuzuweisen.

Hilft das? Wenn nicht melde dich noch einmal.

von Student (Gast)


Lesenswert?

Ach ja, wie alles vom Herrn Miller, sehr empfehlenswert ist folgendes: 
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

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


Lesenswert?

Student schrieb:
> vom Herrn Miller
Ach sch...lags kaputt, man siezt mich. Ich werde alt... :-/

Patrick Philipiak schrieb:
> Aber so scheint das nicht zu gehen :(
Nur um uns nicht dumm sterben zu lassen: mit welcher Fehlermeldung 
scheint das nicht zu gehen?

Odatas schrieb:
> die Range
Range (engl.) = Bereich (deutsch)
Also steht da "die Bereich". Hört sich blöd an...

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


Lesenswert?

> ERROR: at 4 ns(10000): Iteration limit 10000 is reached.
Du kämpfst sehr wahrscheinlich mit einer kombinatorischen Schleife:
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Häng doch einfach mal deine VHDL-Datei hier an...

: Bearbeitet durch Moderator
von Student (Gast)


Lesenswert?

Patrick Philipiak schrieb:
> Edit: Achso das Mapping mach ich übrigends nicht als Prozzes sondern
> direkt als ...hmm wie heißt das noch? Architekturbeschreibung? Daran
> wirds wohl liegen.

Im Übrigen heißt das nicht Architekturbeschreibung, sondern es sollte 
sicherlich Concurrent Signal Assignment (oder falls Lothar es lieber auf 
Deutsch mag: nebenläufige Signalzuweisung ;)) heißen?

Lothar Miller schrieb:
> Student schrieb:
>> vom Herrn Miller
> Ach sch...lags kaputt, man siezt mich. Ich werde alt... :-

Am Alter lags wohl nicht (auch wenn ich es um ehrlich zu sein garnicht 
kenne :D), sondern eher an der Überlegenheit :S

von Patrick P. (odatas)


Angehängte Dateien:

Lesenswert?

Ok ich habs zwar jetzt zum Laufen gebracht aber es funktioniert so nicht 
wie ich will...Besser gesagt es stimmt hinten und vorne nicht.

Der Sinn dahinter ist ein serieller Multiplizier. Das Schema und meinen 
code habe ich angehangen.

Bei Fragen Anregungen usw bin ich sehr dankbar

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


Lesenswert?

> std_ulogic
Meint dein Prof auch noch, dass unresolved logic einen 
Geschwindigkeitsvorteil in der Simulation bringt? Sag hm, dass das nicht 
mehr stimmt und der Rest der Welt inzwischen mit std_logic arbeitet...

> Ok ich habs zwar jetzt zum Laufen gebracht
Gut.

> aber es funktioniert so nicht wie ich will...
Schlecht.

> Besser gesagt es stimmt hinten und vorne nicht.
Was stimmt nicht und wie hast du das herausgefunden? Was erwartest du? 
Was bekommst du stattdessen?

von dden (Gast)


Lesenswert?

Hallo,
versuch doch mal deinen folgenden Code zu verstehen.
1
begin
2
3
  partialProduct                              <= '0' & multiplicandReg when multiplicatorShiftReg(0) = '1' else dienull;
4
  partialSum                                  <= signed(partialProduct) + signed(highProductReg);
5
  lowProductShiftReg(lowProductShiftReg'high) <= std_ulogic(partialSum(0));
6
  highProductReg                              <= '0' & std_ulogic_vector(partialSum(partialSum'high downto 1));
7
  product                                     <= signed(std_logic_vector(highProductReg(highProductReg'high-1 downto 0)) & std_logic_vector(lowProductShiftReg));
8
  done                                        <= processingShiftReg(0);

Was passiert da wohl mit partialSum und highProductReg ?
Wie hast du das denn simuliert bekommen?

Mfg

von Patrick P. (odatas)


Lesenswert?

Also er soll die halt multiplizieren und das macht er nicht wirklich.

Das mit std_ulogic hat er nicht wegen einem Geschwindigkeitsvorteil 
gesagt. Es ging ihm um was anderes weiß nicht mehr genau was. Muss ich 
nochmal nachschauen.

Zu dem code:

PartialSum sollte eigentlich das Ergebniss der Addition von 
PartialProduct und highProductReg sein. Damit man diese + nuztzen kann 
muss ich die ja zum Signed machen und partialSum ist doch auch signed.

An highProductReg hänge ich vorne einen 0 ran und hinten kommt der rest 
von der PartialSum ran.

Ist das von der Syntax falsch oder hab ich da ein Denkfehler?

Edit: Ich weiß wieder warum std_ulogic

Es geht darum das wir keine Doppelte Signalzuweißung machen.

std_ulogic und std_ulogic_vector unterscheiden sich dahingehend von 
std_logic und
std_logic_vector, dass für sie keine Auflösungsfunktion  definiert ist. 
Diese
Funktion braucht man, wenn ein Signal in mehreren parallelen Anweisungen 
geschrieben wird
und es dadurch zu einer Signalüberlagerung kommt. In einfachen digitalen 
Schaltungen sollte
dieser Zustand unbedingt vermieden werden! Dadurch dass std_ulogic diese 
Funktion nicht besitzt,
wird man sofort vom Compiler auf das fehlerhaftes Design aufmerksam 
gemacht.

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


Lesenswert?

Patrick Philipiak schrieb:
> PartialSum sollte eigentlich das Ergebniss der Addition von
> PartialProduct und highProductReg sein. Damit man diese + nuztzen kann
> muss ich die ja zum Signed machen und partialSum ist doch auch signed.
Warum signed? Ist das ein signed Wert? Warum nicht unsigned? Ist das 
tatsächlich ein signed Multiplizierer?

> hab ich da ein Denkfehler?
Da wird für meinen Geschmack viel zu viel hin- und her- gecastet.
Rechne in deinem Modul intern doch einfach alles mit unsigned Vektoren. 
Und an der Schnittstelle nach aussen castest du die Vektoren von und auf 
std_(u)logic. Ich sehe gerade: die Schnittstelle ist ja schon ein 
eingeschränkter Vektor, warum also intern uneingeschränkte Vektoren 
verwenden. Und: du musst offenbar eine vorzeichenbehaftete 
Multiplikation beherrschen, das hat mehr Anspruch. Fang erst mal mit 
einem unsigned Multiplier an...

> Edit: Ich weiß wieder warum std_ulogic
> Es geht darum das wir keine Doppelte Signalzuweißung machen.
Blöd ist nur, dass man aber genau diese Doppelzuweisung manchmal 
braucht. Z.B. bei einem bidirektionalen Bus: da wird in der Komponente 
ein 'Z' auf den Bus gelegt, und von extern ein fester Pegel dagegen 
getrieben.

Und natürlich sieht man im Simulator auch, wenn bei std_logic ein 
Konflikt mit doppelt getriebenen Signalen auftritt, und der Synthesizer 
haut dir gleich einen Fehler ums Ohr...

: Bearbeitet durch Moderator
von dden (Gast)


Lesenswert?

Hallo,
ich versuch das mal Bildlich darzustellen.
Wohlgemerkt alles Kombinatorik,
und ich wette du hast da ein paar ganz DICKE Warnungen in der Synthese.
So wird das nie funktionieren.
Versuch das ganze erstmal neu aufzuzeichnen und zu verstehen was du 
machen möchtest.Und die speichernden Elemente nicht vergessen, 
üblicherweise ist ein Reg im Name auch ein Register.
1
       |                     ___________
2
       |                    |           |
3
partialProduct       highProductReg     |
4
       |_________ __________|           |
5
                 +                      |
6
      '0'    partialSum                 |
7
       |         |                      |
8
       |_________|______________________|

: Bearbeitet durch Moderator
von Patrick P. (odatas)


Angehängte Dateien:

Lesenswert?

Ich hab jetzt alles unsigned gemacht und die addition in den prozess 
verlegt.

Aber irgendwas ist da immer noch nicht richtig. Die Ergebnisse stimmen 
nicht. Meine Testbanch häng ich auch mal ran...

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


Angehängte Dateien:

Lesenswert?

Patrick Philipiak schrieb:
> Aber irgendwas ist da immer noch nicht richtig.
Ja, und jetzt kommt die Spezialität eines Simulator: das Debuggen.
Du kannst jetzt jedes einzelne Signal im zeitlichen Ablauf ansehen und 
findest beim Vergleich mit dem was du erwartest schnell heraus, was da 
schief läuft.

Zum Thema /vorzeichenbehaftete Multiplikation/: bist du dir sicher, dass 
dieser Rechenweg für Zahlen im Zweierkomplement prinzipiell 
funktioniert?
Sieh dir dort mal die letzte Zeile auf der Seite 3 an:
http://www.xilinx.com/univ/teaching_materials/dsp_primer/sample/lecture_notes/FPGAArithmetic_mult.pdf

Als kleine Denkanregung: für unsigned Vektoren könnte das so gehen wie 
im Anhang...

Und: ich würde an deiner Stelle erst mal einen speziellen Fall mit 
definierten Vektorlängen zum Test hernehmen und den hinterher auf 
generisch umbauen.

von Patrick P. (odatas)


Angehängte Dateien:

Lesenswert?

Ok ich hab es jetzt hinbekommen das Positive werte berechnet werden 
können. Jetzt will ich das auf negative Zahlen erweitern.

Im zweier komplementär steht ja das erste Bit für das Vorzeichen. Kann 
ich im Grunde nicht schauen ob exklusiv eine der beiden Zahlen ein 
Vorzeichen Bit hat und am Ende einfach nochmal invertieren?

Code wie es jetzt funzt ist im Anhang.

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


Lesenswert?

Patrick Philipiak schrieb:
> Kann ich im Grunde nicht schauen ob exklusiv eine der beiden Zahlen ein
> Vorzeichen Bit hat und am Ende einfach nochmal invertieren?
Das ist der richtige Weg: negative Operanden in positive umwandeln, das 
Vorzeichen des Ergebnisses berechnen und ggf. das Ergebnis ine eine 
negative Zahl wandeln.

von Patrick P. (odatas)


Lesenswert?

Ah ok...wenn ich ein std_ulogic_vector invertieren will und dann auf 
einen port mappen kann ich dann einfach schreiben.
1
product <= unsingedproduct when operator = '0' else not unsingedproduct

Oder muss ich alle stellen einzelnd invertieren?

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


Lesenswert?

> wenn ich ein std_ulogic_vector invertieren will
"Invertieren" und das "Zweierkomplement" bilden sind aber 2 Paar Schuhe, 
das ist dir schon bewusst?

> Oder muss ich alle stellen einzelnd invertieren?
Probier es aus oder sieh dir einfach die not() Funktion an. Sie ist in 
einer der Bibliotheken, die du eingebunden hast, definiert.

von Patrick P. (odatas)


Lesenswert?

Achso ja. Wenn ich eine 2er Komplementär Zahl invetriere muss ich noch 
einen abziehen oder?

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


Lesenswert?

Patrick Philipiak schrieb:
> Achso ja. Wenn ich eine 2er Komplementär Zahl invetriere muss ich noch
> einen abziehen oder?
"Oder" stimmt.
Einfach nochmal mit der Binärdarstellung von +1 und -1 und 0 nochmal 
kurz überlegen...

von Patrick P. (odatas)


Lesenswert?

Ok habs auch negative Zahlen jetzt drinne.

Im Grunde wie besprochen.

1.Vorzeichen von Ergebnis berechnen

2. negative Zahlen in Positive umrechnen.

3. Rechnungen ausführen

4. Ergebnis wenn Vorzeichen negativ ist wieder in negative Zahl 
umwandeln.



Danke für eure Hilfe. Ihr habt mir sehr geholfen. Schönes Wochenende 
noch :)

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.