Ich möchte mir mit dem coregen ein DP-RAM bauen, brauche aber einen asynchronen CLR zur Laufzeit. Wo findet man den?
Du suchst ein gleichzeitiges Löschen des kompletten RAMs? Das wird von der Hardware nicht unterstützt.
> Dual Ported RAMs
Das könnte evtl. gehen bei Distributed-Ram, weil das komplett asynchron
ist.
Mit BRAMs geht das aber nicht, weil für das Schreiben jedes einzelnen
Wortes ein Takt nötig ist. Selbst bei der Initialisierung (Startup) geht
das nur Bit für Bit mit dem Config-Clock.
Aber wieso brauchst du überhaupt einen asynchronen Reset?
Ich würde einfach mal so sagen, dass das auch anders geht...
Lothar Miller wrote: >> Dual Ported RAMs > Das könnte evtl. gehen bei Distributed-Ram, weil das komplett asynchron > ist. Distributed RAM setzt sich aber aus LUTs zusammen und diese können ebenfalls nicht komplett zurückgesetzt werden. Nur bei einem "diskreten" RAM aus Flipflops funktioniert ein asynchroner Reset.
@ gefrusteter FPGA-Progger (Gast) >Ich möchte mir mit dem coregen ein DP-RAM bauen, brauche aber einen >asynchronen CLR zur Laufzeit. Wo findet man den? Gibt es nicht, braucht auch keiner. Wenn du die Daten WIRKLICH löschen musst, muss das deine State Machine "zu Fuß" machen. Und asynchron ist sowieso Pfui ;-) MFG Falk
Mir stellt sich immer die Frage, ob am Ende im FPGA überhaupt ein asynchroner Reset realisiert wird, da der Reset ja meistens mehrfach eingetaktet wird.
Franke wrote: > Mir stellt sich immer die Frage, ob am Ende im FPGA überhaupt ein > asynchroner Reset realisiert wird, da der Reset ja meistens mehrfach > eingetaktet wird. Ja, was soll das Synthesetool da machen, wenn ich dem explizit sage, wie ein Reset zu verwenden sei? Es muss die entspechenden FFs verwenden. Als kleines Beispiel (damit wir vom Raten wegkommen) das hier:
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity RSAS is |
6 | Port ( din : in STD_LOGIC_VECTOR (1 downto 0); |
7 | dout : out STD_LOGIC_VECTOR (1 downto 0); |
8 | rst : in STD_LOGIC; |
9 | clk : in STD_LOGIC); |
10 | end RSAS; |
11 | |
12 | architecture Behavioral of RSAS is |
13 | signal dsync : std_logic; |
14 | signal dasync : std_logic; |
15 | signal rstsr : std_logic_vector(2 downto 0); |
16 | begin
|
17 | -- Reset einsynchronisieren
|
18 | process begin |
19 | wait until rising_edge(clk); |
20 | rstsr<=rstsr(1 downto 0)&rst; |
21 | end process; |
22 | |
23 | -- Synchroner Reset
|
24 | process begin |
25 | wait until rising_edge(clk); |
26 | if (rstsr(2)='1') then |
27 | dsync<='0'; |
28 | else
|
29 | dsync<=din(0); |
30 | end if; |
31 | end process; |
32 | |
33 | -- Asynchroner Reset
|
34 | process (clk, rstsr) begin |
35 | if (rstsr(2)='1') then |
36 | dasync<='0'; |
37 | elsif rising_edge(clk) then |
38 | dasync<=din(1); |
39 | end if; |
40 | end process; |
41 | |
42 | -- Ausgabe
|
43 | dout <= dasync & dsync; |
44 | end Behavioral; |
Die RTL-Schematics (Bild) zeigen: der Snythesizer macht trotz des über 4 D-FFs (FD) synchronisierten Reset-Signals genau das, was beschrieben wurde. Den asynchronen Reset mit einem asynchronen Clear-FF (FDC), den synchronen Reset mit einem synchronen Reset-FF (FDR). Also: wird der Reset asynchron beschrieben, wird das entsprechende Register auch asynchron implementiert.
@ Lothar Miller (lkmiller) >Also: wird der Reset asynchron beschrieben, >wird das entsprechende Register auch asynchron implementiert. Wäre ja auch noch "Schöner" wenn das Tool ungefragt was verschlimmbessern würde. Aber solche Resets an BRAMs sind sowieso sinnlos, an vielen FlipFlops ebenso. MFG Falk
> Aber solche Resets an BRAMs sind sowieso sinnlos, > an vielen FlipFlops ebenso. Von der Sinnhaltigkeit abgesehen gibt es keinen "globalen" Reset für BRAMs und genausowenig für LUT-RAMs (distributed RAM). Da musste ich mich noch kurz (wieder) einlesen: LUTs sind 16x1 RAMs. Die können auch nicht irgendwie zu 1x16 umgebogen werden. Ich kann also nur 1 Bit auswählen, und das ändern. Um eine komplette LUT zu löschen, müssen also 16 Schreibzugriffe stattfinden, um jedes einzelne Bit auf 0 zu setzen. Damit wären wir wieder mit einer State Machine "zu Fuß" unterwegs ;-)
Aber kann das nicht ein Problem werden? Der asynch Reset kommt doch dann einsynchronisiert genau zur Flanke des Taktes. Abgesehen davon, dass es keine andere Funktion macht, als ein synchroner Reset ist es nicht schicklich einen Takt an den synchronen und asynchronen Port eines FF zu legen. Das meckern die Synthesetools auch zurecht an. Sinn macht das IMO nur bei clock domain crossing, wenn ganze Busse linksseitig eingetaktet werden und rechtsseitig (anderer clock) ausgelsen werden. Z.B. beim Zähler reset von Fifos.
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.