signal aktualisiert nicht im Prozesse

Gast #3887475
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?
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #3887506
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!
Gast #3887543
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.
Gast #3887772
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.
Gast #3888680
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, ... ).

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