Forum: FPGA, VHDL & Co. MIG-Interface in VHDL, ansteuerung korrekt, problem mit IF-Abfrage?


von Matze (Gast)


Lesenswert?

Hi,

Habe einen fehler in einer IF-Abfrage den ich mir nicht erklären kann,
vielleicht könnt ihr es:

In diesem Stück code soll ein MIG-Memmory-Interface so angesprochen 
werden, dass ein lesen und schreiben ermöglicht.

Problem ist die abrage des rdy-Signals, dieses Signal kommt von der MIG 
und sollte anzeigen, dass ein Kommando angenommen wurde.

Scheinbar ist diese Abfrage immer wahr. Da der state-Zustand sonst nicht 
auf 2 besetzt werden könnte, und ein signal write_ok <= '1'; niemals mit 
1 erscheinen dürfte.

Doch obwohl ich messtechnisch emitteln kann, dass rdy nie true wird, 
läuft die state-Maschiene weiter.

Ziel ist an ein Interface Daten+Addressen anzulegen, und ein 
read/write-Anable zu setzen.
Die State-Maschiene  sollte durch read/write_ok zurückgeben wenn die 
Daten geschrieben oder gelesen wurden.

Habt ihr einen Rat?
Dies ist mein 1. Versuch einen IP-Block (MIG7) für DDR2-Ram anzusteuern.
1
        if (rising_edge(ui_clk)) then
2
            addr <= address;
3
            if write_en = '1' then
4
                if state = 0 then 
5
                    en <= '0';
6
                    wdf_wren <= '0';
7
                    cmd <= CMD_WRITE;
8
                    wdf_end <= '0';
9
                    wdf_mask <= "11111100";
10
                    debug <=x"1"; 
11
                    write_ok <= '0';
12
                    if wdf_rdy = '1' then
13
                        wdf_data(15 downto 0) <= data_in;
14
                        state := 1;
15
                        debug <= x"2";
16
                    end if;
17
                elsif state = 1 then
18
                    en <= '1';
19
                    wdf_wren <= '1';
20
                    cmd <= CMD_WRITE;
21
                    wdf_end <= '0';
22
                    wdf_mask <= "11111100";
23
                    debug <=x"3";
24
                    wdf_data(15 downto 0) <= data_in;
25
                    write_ok <= '0';
26
                    if rdy = '1' then    --Hier!
27
                        debug <=x"4";
28
                        state := 2;
29
                    end if;
30
                elsif state = 2 then
31
                    en <= '1';
32
                    wdf_wren <= '1';
33
                    cmd <= CMD_WRITE;
34
                    wdf_end <= '1';
35
                    wdf_mask <= "11111100";
36
                    state := 3;
37
                    debug <=x"5";
38
                    write_ok <= '0';
39
                elsif state = 3 then
40
                    en <= '0';
41
                    wdf_wren <= '0';
42
                    cmd <= CMD_READ;
43
                    wdf_end <= '0';
44
                    wdf_mask <= "11111100";
45
                    state := 4;
46
                    write_ok <= '1';
47
                    debug <=x"6";
48
                else 
49
                    debug <=x"7";
50
                    state := 0;
51
                    write_ok <= '0';
52
                end if;
53
            end if;
54
            if read_en = '1' then
55
                if state2 = 0 then
56
                    en <= '1';
57
                    cmd <= CMD_READ;
58
                    debug <=x"8";
59
                    if rd_data_valid = '1' then
60
                        if rd_data_end = '1' then
61
                            data_out <= rd_data(15 downto 0);
62
                            read_ok <= '1';
63
                            state2 := 1;
64
                            debug <=x"9";
65
                        end if;
66
                    end if;
67
                elsif state2 = 1 then
68
                    read_ok <= '0';
69
                    en <= '0';
70
                    cmd <= CMD_READ;
71
                    state2 := 3;
72
                    debug <=x"A";
73
                else
74
                    read_ok <= '0';
75
                    state2 := 0;
76
                    debug <=x"B";
77
                end if;
78
            end if;
79
        end if;

von Burkhard K. (buks)


Lesenswert?

Matze schrieb:
> Hi,

> In diesem Stück code soll ein MIG-Memmory-Interface so angesprochen
> werden, dass ein lesen und schreiben ermöglicht.
>
> Problem ist die abrage des rdy-Signals, dieses Signal kommt von der MIG
> und sollte anzeigen, dass ein Kommando angenommen wurde.

Hi Matze, das mem_rdy Signal des UserInterfaces ist tatsichlich 99% der 
Zeit auf '1', bewegt sich aber doch auf '0' - nämlich bei zwei 
Gelegenheiten:

  * sobald das Write Kommando akzeptiert wurde, also als Reaktion auf 
das Setzen von "mem_wdf_wren" UND "mem_wdf_end"
  * ohne vorausgegangenes Kommando - wohl während des Autorefresh

Diese Zustandswechsel sehe ich tatsächlich "messtechnisch" - mit einem 
USB-Logicanalyzer, sie liegen wohl nur eine Periode an.

BTW: In meinen Design benutze ich mem_rdy, um aus dem State "CmdWr" in 
den State "Idle" zu wechseln. Wenn Dein "debug"-Signal in einer anderen 
Clk-Domäne weiterverarbeitet wird, muss es noch einsynchronisiert 
werden, die mem_ui_clk läuft mit einem Viertel  bzw. der Hälfte (2:1 
Mode) der DDR2 Clk.

Gruß, Burkhard

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Reden wir hier vom Data Ready oder vom Command Ready?

In der statemachine wird das debug Signal auch gelachted, statt 
geswitched, weil es keinen else zweig gibt.

auch weiter unten bei rd_data_valid gehört n.m.E ein Else hin

von Burkhard K. (buks)


Lesenswert?

Wir reden von "mem_rdy" - das wäre wohl "Command ready".

Ich muss meine obige Darstellung korrigieren - mem_rdy >>kann<< während 
des Schreibvorgangs auf '0' gehen - muss aber nicht. Wenn das passiert, 
müssen das WriteCmd, wdf_wren, wdf_end usw. solange gehalten werden, bis 
mem_rdy wieder asserted wird.

Tatsächlich gibt es gleich mehrere mögliche Reihenfolgen, in denen 
Daten, WDF Maske und Schreibkommando präsentiert werden können, bitte am 
besten selbst im MIG User Guide, Abschnitt "User Interface" nachlesen - 
und zwar in der neuesten Version (Zynq-7000 AP SoC and 7 Series Devices 
Memory Interface Solutions v2.4)! In älteren Versionen des Dokuments ist 
die Abfolge unvollständig dargestellt, was mich einige Zeit gekostet 
hat.

Gruß,
Burkhard

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


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #4508945:
> In der statemachine wird das debug Signal auch gelachted, statt
> geswitched, weil es keinen else zweig gibt.
Da wird zum Glück nichts mit einem Latch gemacht sondern alles hübsch 
synchron mit Registern, weil das Ganze ja getaktet ist...

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.