Eine wahrscheinlich doofe Frage: Ich habe ein design und füge hier drei gleiche Komponenten zur Berechnung einer Gleitkommazahl ein. Die Komponenten haben jeweils zwei eingänge von 32 bit breite und einen genau so breiten ausgang. In der Logik, in die ich die Komponenten gehängt habe, habe ich für jede der Komponenten drei Signale der gleichen bitbreite. Also insgesamt 9 Signale für ein- und Ausgabe der drei Komponenten. Mein IPCore hat zwei writable register, von denen sollen die Daten kommen. Mein Problem: Ich will jetzt abwechselnd auf die erste, dann auf die zweite und dann auf die dritte Komponente die Registerinhalte als Eingangsdaten legen. Ich habe einen Automaten geschrieben, in dem im ersten schritt reg1 und reg2 auf die eingangssignale der ersten komponente gelegt werden. Wenn ich jetzt im zweiten zustand, nach registeränderung, den Inhalt der Registersignale auf die eingangssignale der zweiten komponente lege, "behalten" sich die eingänge für Komponente eins dann die ersten Registerinhalte? Vielen Dank für eure Antworten!
Oder einfacher Ausgedrückt: Wie behalten sich die sechs Eingangssignale für meine Komponenten die Daten, bis die Bereichnung fertig ist?
@ Der Anfänger >Oder einfacher Ausgedrückt: Wie behalten sich die sechs Eingangssignale >für meine Komponenten die Daten, bis die Bereichnung fertig ist? Mittels Register/FlipFlops? MfG Falk
Da bin ich jetzt auch drauf gekommen. Ich mache es jetzt folgendermassen, es wäre super, wenn jemand sagt, ob das totaler Quatsch ist: Ich habe einen synchronisierten Prozess. Das einzige, was er macht, ist zu warten, ob ein std_logic auf 1 ist. Wenn das der Fall ist, mache ich eine Signalzuweisung der Eingangsregister auf die Eingänge meiner Komponenten. Bei 0 macht er nix. Wenn ich jetzt das Signal auf die Eingänge lege, mache ich das nicht per Signalzuweisung, sondern per setzen des std_logic auf 1, im nächsten Takt dann wieder auf Null. Die Eingänge für meine Komponenten müssten den Zustand ja dann wieder halten, oder? @Falk: Danke für dein Engagement im Forum. Ich persönlich habe schon sehr oft davon profitiert.
@ Der Anfänger >Da bin ich jetzt auch drauf gekommen. Ich mache es jetzt >folgendermassen, es wäre super, wenn jemand sagt, ob das totaler Quatsch >ist: Poste mal ein wenig Code (als Anhang), das sagt mehr als tausend allgmeine Worte. >Ich habe einen synchronisierten Prozess. Das einzige, was er macht, ist >zu warten, ob ein std_logic auf 1 ist. Wenn das der Fall ist, mache ich >eine Signalzuweisung der Eingangsregister auf die Eingänge meiner >Komponenten. Bei 0 macht er nix. Wenn ich jetzt das Signal auf die >Eingänge lege, mache ich das nicht per Signalzuweisung, sondern per >setzen des std_logic auf 1, im nächsten Takt dann wieder auf Null. So in etwa passt das. >Die Eingänge für meine Komponenten müssten den Zustand ja dann wieder >halten, oder? Die Eingänge nicht, aber die FlipFlops, welche die Eingänge speisen, schon. ;-) MfG Falk
Hier der Prozess zum Legen der Register auf die Eingänge:
1 | SCHREIBE_EINGANGSREGISTER1 : process( Bus2IP_Clk ) is |
2 | begin |
3 | |
4 | if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then |
5 | if(sax1_eingang_schreiben = '1') then |
6 | sax1_x_in <= slv_reg2(32 to 63); |
7 | sax1_y_in <= slv_reg3(32 to 63); |
8 | end if; |
9 | end if; |
10 | end process SCHREIBE_EINGANGSREGISTER1; |
Hier der Automat, der dann das Signal genau einen Takt auf 1 setzen soll (habs mal auf eine Komponente reduziert):
1 | ADDIERE_PROCESS : process( Bus2IP_Clk ) is |
2 | begin |
3 | if ( Bus2IP_Clk'event and Bus2IP_Clk = '1' ) then |
4 | if ( Bus2IP_Reset = '1' ) then |
5 | addier_zustand <= IDLE; |
6 | sax1_exc_in <= '0'; |
7 | else |
8 | case addier_zustand is |
9 | |
10 | when IDLE=> |
11 | sax1_rdy_in <= '0'; |
12 | addier_zustand <= IDLE; |
13 | if(addiere_aussen = '1') then |
14 | sax1_rdy_in <= '0'; |
15 | sax1_eingang_schreiben <= '1'; |
16 | addier_zustand <= EINS; |
17 | else |
18 | addier_zustand <= IDLE; |
19 | end if; |
20 | |
21 | when EINS => |
22 | sax1_eingang_schreiben <= '0'; |
23 | sax1_rdy_in <= '1'; |
24 | if (fertig_geschrieben = '1') then |
25 | addier_zustand <= IDLE; |
26 | fertig_gerechnet <= '0'; |
27 | fertig_gerechnet <= '0'; |
28 | else |
29 | addier_zustand <= EINS; |
30 | if (sax1_done = '1') then |
31 | fertig_gerechnet <= '1'; |
32 | end if; |
33 | end if; |
34 | when others => |
35 | addier_zustand <= IDLE; |
36 | end case; |
37 | end if; |
38 | end if; |
39 | end process ADDIERE_PROCESS; |
Ja, weiss ich, war auf die schnelle gemacht. Nochmal danke!
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.