ich habe ein problem bei meinen Prozessen. Im Anhang befindet sich ein Code der später mal für einen bit seriellen Cordic verwendet werden soll. Bis jetzt habe ich zwei shiftregister mit einem adder implementiert der mir das berechnete ergebnis wieder in dem ersten register abspeichert. jetzt habe ich ein signal XoTemp welches das Komplement des XoReg beinhaltet. dieses weise ich bei Addcounter = 5 dem Signal XoReg zu aber in der simulation tut sich nichts, sprich, XoReg bleibt wie es ist Auf dem Screenshot sieht man wie bei AccCounter =101 der Wert 0100 im XReg steht, allerdings sollte da 1100 stehen. Kann mir da jemand helfen?
sergej schrieb: > Kann mir da jemand helfen?
1 | if (AddCounter= 5) then |
2 | XoReg <= XoTemp; |
3 | end if; |
4 | if (Load='1') then |
5 | ....
|
6 | XoReg <= Xoin & XoReg(3 downto 1); -- *** s.u. |
*** Das XoReg hat hier nicht den Wert von XoTemp, sondern den Wert, den XoReg zu Beginn des Prozesses hatte. Ein Signal behält seinen "alten" Wert durch den gesamten Prozess hindurch. Erst am Prozessende bekommt es (evtl.) einen "neuen" Wert. Und zwar den Wert, der im Verlauf des Prozesses zuletzt an das Signal zugewiesen wurde. Und das hier bringt dir nur einen unnötigen Takt Latency:
1 | Adder: process (Adder_CLK) |
2 | begin
|
3 | if rising_edge(Adder_CLK) then |
4 | Xoin <= XoOut xor YoOut xor Cin; |
5 | Cin <= (XoOut and YoOut) or (XoOut and Cin) or (Cin and YoOut); |
6 | end if; |
7 | end process Adder; |
Lass das ganze Prozess-Zeug weg und schreib die Zuweisungen concurrent:
1 | --Adder: process (Adder_CLK)
|
2 | --begin
|
3 | -- if rising_edge(Adder_CLK) then
|
4 | Xoin <= XoOut xor YoOut xor Cin; |
5 | Cin <= (XoOut and YoOut) or (XoOut and Cin) or (Cin and YoOut); |
6 | -- end if;
|
7 | --end process Adder;
|
Merke: es muss nicht jede klitzekleine Zuweisung in einen Prozess eingepackt werden!
:
Bearbeitet durch Moderator
Lothar Miller schrieb: > *** Das XoReg hat hier nicht den Wert von XoTemp, sondern den Wert, den > XoReg zu Beginn des Prozesses hatte. Ein Signal behält seinen "alten" > Wert durch den gesamten Prozess hindurch. Erst am Prozessende bekommt > es (evtl.) einen "neuen" Wert. Und zwar den Wert, der im Verlauf des > Prozesses zuletzt an das Signal zugewiesen wurde. Danke für deine Hilfe Lother, das problem ist mir jetzt klar geworden. hast du eventuell einen tipp wie man das elegant lösen kann? Lothar Miller schrieb: > Lass das ganze Prozess-Zeug weg und schreib die Zuweisungen > concurrent:--Adder: process (Adder_CLK) > --begin > -- if rising_edge(Adder_CLK) then > Xoin <= XoOut xor YoOut xor Cin; > Cin <= (XoOut and YoOut) or (XoOut and Cin) or (Cin and YoOut); > -- end if; > --end process Adder; > Merke: es muss nicht jede klitzekleine Zuweisung in einen Prozess > eingepackt werden! ich hatte es zuerst ohne den Prozess allerdings macht er falsche berechnungen wenn ich zum Beispiel 011 und 010 addieren möchte. beim zweiten bit hat er XoOut und YoOut auf 1 und zusätzlich rechnet er noch das Cin mit 1 dazu obwohl es im nächsten schritt verwendet werden sollte. Sprich, das Cin muss für den nächsten Takt aufbewahrt werden.
gerade fällt mir ein, ich kann ja einfach nur das Cin um ein takt verzögern und da habe ich ja auch kein takt latency
sergej schrieb: > > Danke für deine Hilfe Lother, das problem ist mir jetzt klar geworden. > hast du eventuell einen tipp wie man das elegant lösen kann? >
1 | XoRegister: process (Adder_CLK) |
2 | begin
|
3 | if rising_edge(Adder_CLK) then |
4 | if (Load='1') then |
5 | XoReg <= Xo; |
6 | Addcounter <= 0; |
7 | else
|
8 | if (AddCounter= 5) then |
9 | XoReg <= XoTemp; |
10 | else
|
11 | XoReg <= Xoin & XoReg(3 downto 1); |
12 | Addcounter <= Addcounter + 1; |
13 | end if; |
14 | end if; |
15 | end if; |
16 | end process XoRegister; |
> beim zweiten bit hat er XoOut und YoOut auf 1 und zusätzlich rechnet er > noch das Cin mit 1 dazu obwohl es im nächsten schritt verwendet werden > sollte. > > Sprich, das Cin muss für den nächsten Takt aufbewahrt werden. >> Cin <= (XoOut and YoOut) or (XoOut and Cin) or (Cin and YoOut); Lothar hat da übersehen dass Cin auch auf der rechten Seite der Zuweisung vorkommt und versehentlich eine kombinatorische Schleife gebaut.
Lattice User schrieb: > Lothar hat da ... eine kombinatorische Schleife > gebaut. Schlags kaputt! Das ist böse... :-( Also auf jeden Fall den Takt wieder drum rum!
Ok hab's um einen Takt verzögert und es klappt. Habt ihr noch ein Tipp wie ich das XoReg mit dem komplement fühle anstatt dem normalen Wert?
Ups grad den Vorschlag von lattice User gesehen. Das kommt davon wenn man vom Handy schreibt. Du hast die If Anweisungen vertauscht sehe ich gerade. Was ändert sich dadurch?
Sergej schrieb: > Ups grad den Vorschlag von lattice User gesehen. Das kommt davon wenn > man vom Handy schreibt. > > Du hast die If Anweisungen vertauscht sehe ich gerade. Was ändert sich > dadurch? Was kaput ist, hat Lothar hier erklärt. Beitrag "Re: signal aktualisiert nicht im Prozesse" Meine Umstellung sorgt dafür dass immer nur eine Zuweisung aktiv ist. Allerdings bleibt der Addcounter bei 5 bis zum nächsten Load stehen. Bei deiner Variante lief er weiter ( 6,7, ... ).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.