Forum: FPGA, VHDL & Co. Hilfe beim Serielle Rechenwerk


von sergej (Gast)


Lesenswert?

Ich habe ein problem mit meinem seriellen Subb/Add Rechenwerk.
Es handelt sich dabei um einen normalen 1 bit Adder bei dem mit einer 
Sel Leitung gesteurt wird, ob addiert oder subtrahiert wird. Beim 
subtrahieren wird Y mit einem XOR invertiert und dann müsste noch das 
Cin zu Beginn aus 1 gesetzt werden. und genau hier ist das Problem. wie 
schaffe ich es Cin genau bei Counter=0 für einen Takt auf 1 zu setzen 
ohne es vorher schon bei counter = 15 zu wissen?.

1
entity Adder is
2
    Port ( 
3
        Adder_CLK       : in  STD_LOGIC;
4
        Adder_Enable    : in  STD_LOGIC;
5
        Adder_Sum       : out  STD_LOGIC;
6
        Adder_X         : in  STD_LOGIC;
7
        Adder_Y         : in  STD_LOGIC;
8
        Adder_SubAddSell   : in STD_LOGIC    :='0');
9
end Adder;
10
11
architecture Behavioral of Adder is
12
13
signal Cin, Cout :STD_LOGIC;
14
signal YTemp  :STD_LOGIC;
15
signal Counter : integer range 16 downto 0;
16
17
begin
18
19
20
process (Adder_CLK, Adder_Enable)
21
begin
22
   if (rising_edge(Adder_CLK))  then
23
    if Adder_Enable = '1' then
24
        Cin <= Cout;
25
      if(Counter = 15) then
26
        Counter <= 0;
27
      else
28
        Counter <= Counter +1;
29
      end if;          
30
    end if;
31
   end if;
32
end process ;
33
34
35
YTemp <= Adder_Y xor Adder_SubAddSell;
36
    
37
38
Adder_Sum   <=  Adder_X xor YTemp xor Cin;
39
Cout <= (Adder_X and YTemp) or (Adder_X and Cin) or (Cin and YTemp);
40
41
42
end Behavioral;

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


Lesenswert?

sergej schrieb:
> Counter <= 0;
Genau in dieser Zeile weißt du es.

von Sergej (Gast)


Lesenswert?

Ok ich war glaube ich ein wenig undeutlich. bei 15 weiß ich noch nicht 
ob im nächsten Takt ein Subtraktion gemacht werden muss weil es ein 
externes signal ist auf das ich kein Einfluss habe. Es müsste also 
kombinatorisch irgendwie durchgeschaltet werden

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


Lesenswert?

Sergej schrieb:
> . bei 15 weiß ich noch nicht ob im nächsten Takt ein Subtraktion gemacht
> werden muss weil es ein externes signal ist auf das ich kein Einfluss
> habe.
Wie "extern" ist das Signal? Ist es auch asynchron?

Wie auch immmer: du stolperst mental noch ein wenig über "Takt" und 
"Rechenzeit" bzw "Laufzeit" für die Kombinatorik. Es sieht so aus:
1
           .---------.         .---------.         .---------.         .----
2
           |         |         |         |         |         |         |
3
    -------'         '---------'         '---------'         '---------'
4
         Takt   Rechenzeit   Takt   Rechenzeit   Takt   Rechenzeit   
5
          0        0          1        1          2        2
In der Rechenzeit wird die eigentliche Arbeit gemacht: Addierer und 
Multiplizierer berechnen neue Ergebnisse, FSM ermitteln neue Zustände, 
usw.
Mit einem Takt werden nur Ergebnisse aus der jweweils vorangegangenen 
Rechenzeit übernommen. Wenn du also mit dem Takt 2 etwas übernehmen 
willst, dann muss es vorher berechnet werden. Logischerweise musst du 
also, wenn du mit dem Takt 1 etwas übernehmen willst, das Ergebnis in 
der Rechenzeit 0 ermitteln. Das ist das Modell in dem ich denke: ein 
Takt führt zu hektischen Neuberechnung von Ergebnissen. Danach kommt 
(irgendwann mal oder ganz schnell) wieder ein Takt.

Aber jetzt kommt ein Trick. Du darfst ganz ungestraft auch in diesem 
Modell denken:
1
            .---------.         .---------.         .---------.         .----
2
            |         |         |         |         |         |         |
3
     -------'         '---------'         '---------'         '---------'
4
Rechenzeit Takt   Rechenzeit   Takt   Rechenzeit   Takt   Rechenzeit   
5
   0        0          1        1          2        2         3
Nur darfst du die beiden Denkweisen nicht vermischen, was du aber gerade 
tust!

Zeichne dir mal auf, wann was berechnet und wann was gespeichert wird. 
Dann dürfte dir schnell klar werden, dass du mit der geeigneten Ansicht 
eigentlich gar kein Problem hast, weil die Definition "Takt 15" einfach 
noch nicht stimmt. Oder andersrum: du kannst in der Rechenzeit vom Takt 
0 ganz unbeschadet das externe Signal einfließen lassen (es muss 
natürlich synchron sein und nicht kurz vor dem Takt 1 noch Unruhe ins 
FPGA bringen), dann wird mit dem Takt 1 das in der Rechnezeit 0 
ermittelte Additions- oder Subtraktionsergebnis übernommen...

: Bearbeitet durch Moderator
von sergej (Gast)


Lesenswert?

Hallo Lothar, ich glaube der Groschen ist bei mir endlich gefallen(hoffe 
ich;-)).
Das bedeutet dann dass, wenn das signal sich genau zum Takt 0 ändert,ich 
es erst beim takt 1 übernehmen kann, ist das richtig?

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


Lesenswert?

sergej schrieb:
> wenn das signal sich genau zum Takt 0 ändert,ich es erst beim takt 1
> übernehmen kann, ist das richtig?
Ja. Denn idR ändert es sich nicht zum Takt, sondern wegen des 
Taktes. Und somit automatisch erst nach dem Takt...

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.