Vorneweg:
fragender schrieb:
> P_N_D: process(D_N_DATA,S_SYSCLK)
D_N_DATA ist in der Sensitivliste nicht nötig. Es ist nur der Takt
nötig.
fragender schrieb:
> variable addr: integer := 0;
> variable V_TMPA: std_logic_vector(8 downto 0);
> variable ADDR: integer := 0;
> variable V_SHIFT: natural := 0;
Warum so viele Variablen? Ich würde empfehlen erst mal überhaupt keine
einzige Variable zu nehmen...
Warum uneingeschränkte Integer und Natural? So kann der Simulator
niemals einen Überlauf oder eine Bereichsverletzung erkennen und melden.
Und jetzt zum eigentlichen Problem:
fragender schrieb:
> Genau im Fall wo der erste Prozess die D_A_DATA aktualisiert habe ich
> das Problem, das die Bedingung im zweiten Prozess war wird
Dein Ansatz, das Problem zu lösen ist falsch. Du willst hier irgendwie
"Prozesse interagieren lassen". VHDL ist aber keine
"Prozessinteraktionssprache", sondern eine
"Hardwarebeschreibungssprache".
Was du da also beschrieben hast, sind getaktete D-Flipflops mit Logik
dazwischen. Und die können ihren Zustand immmer nur mit einem Takt
ändern, und übernehmen dann den Wert, der zu diesem Zeitpunkt am Eingang
anliegt.
Du brauchst also ein "Bild" deiner Zielhardware. Und dieses
beschreibst du dann mit VHDL. Also: was soll denn da passieren?
fragender schrieb:
> Genau im Fall wo der erste Prozess die D_A_DATA aktualisiert habe ich
> das Problem, das die Bedingung im zweiten Prozess war wird.
Verstehe ich jetzt nicht, ich vermute aber, das läuft letztlich auf 1
Takt Latency raus, weil erst beim nächsten Takt der P_DIN den "neuen"
Wert der an die im P_N_D zugewiesenen Signale verwendet.
> Ich weiß, dass ich das Problem umgehen kann in dem ich den ersten
> Prozess mit fallender Flanke bediene.
Das wäre fast schon ein Kündigungsgrund... :-/
Letztlich verdoppelst du damit einfach deine Taktfrequenz.
fragender schrieb:
> Nun stehe ich vor dem Problem das der Simulator einen undefinierten
> zustand für den Ausgangspin hat.
Wo? Lass sehen...
BTW:
1 | if D_N_DATA = '1' and D_N_DATA_SHD /= D_N_DATA then
|
2 | D_A_DATA <= BRAM(addr);
|
3 | D_N_DATA_SHD <= D_N_DATA;
|
4 | end process P_N_D;
|
Dir ist schon klar, dass es kaum noch nichtssagendere und unleselichere
Namen gibt?
BTW2:
Warum brauchst/nimmst du da 2 Prozesse?