Forum: FPGA, VHDL & Co. signal aktualisiert nicht im Prozesse


von sergej (Gast)


Angehängte Dateien:

Lesenswert?

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?

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


Lesenswert?

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
von sergej (Gast)


Lesenswert?

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.

von sergej (Gast)


Lesenswert?

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

von Lattice User (Gast)


Lesenswert?

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.

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


Lesenswert?

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!

von Sergej (Gast)


Lesenswert?

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?

von Sergej (Gast)


Lesenswert?

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?

von Lattice User (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.