Signal auf bestimte Range von Port mappen

Gast #3478225
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
#3478260
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
Gast #3478284
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...
Moderator (Firma: Titel) Persönliche Seite #3478462
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...
Gast #3478580
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
#3478765
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
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #3478788
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?
Gast #3478801
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
#3478813
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.
Moderator (Firma: Titel) Persönliche Seite #3478995
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...
Gast #3479071
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
       |_________|______________________|
Moderator (Firma: Titel) Persönliche Seite #3479507
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.
Angehängte Dateien:
#3479710
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #3479716
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.
Moderator (Firma: Titel) Persönliche Seite #3480144
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren