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
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<=highProductRegandlowProductShiftReg;
Ich hoffe jetzt er addiert die zahlen vorher nicht sondern mapt die
genau so wie er es soll. Sind alles signed
Danke aber schonmal
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:
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.
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.
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.
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...
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
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
> 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?
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.
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...
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.
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...
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.
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.
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.
> 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.
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...
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 :)
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