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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Odatas (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
port <= signal1 & signal2;

von Patrick P. (odatas)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


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

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [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 Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.