Forum: FPGA, VHDL & Co. NIOSII mit SDRAM startet nicht.


von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

Hallo.
ich bin verzweifelt. Ich versuche schon seit  einigen Tagen   ein 
NIOSII+SDRAM Controller  aid DE1 Altera Board zum laufen kriegen, doch 
es geht einfach nicht.

Ich verwende NIOSII/e Version. Wenn ich nur on-chip memory lasse, also 
ohne SDRAM, dann läuft alles super (zum testen nehme ich Hallo_World 
beispiel).
Füge ich SDRAM controller hinzu,  kommt die Fehlermeldung:

"Verify failed between address 0x800000 and 0x8001E3".

Daher ist es vollkommen egal ob ich reset und exception  vector memory 
auf on-chip oder sdram stelle.
Ich habe schon versucht mit PLL die Phasenverschiebung von +/- 54° zu 
wählen, oder als Clock 100Mhz oder 133 Mhz nehmen (so steht im 
Datenblatt des SDRAM Chip) in verschiedenen Kombinationen.

Im Eclipse NIOSII werden die ID's und Timestamp richtig ausgelesen.
Ich mache alles nach  Altera Tutorial "SDRAM  on DE1 BOard"

ftp://ftp.altera.com/up/pub/Altera_Material/9.1/Computer_Organization/DE 
1/Tutorials/VHDL/tut_DE1_sdram_vhdl.pdf

Dort wird zwar SOPC  verwenden, und ich nutze Qsys, daher leichte 
Abweichungen im Code, aber die Pinzuweisung ist 1 zu 1.

Anbei ist die Qsys Konfiguration.
C0 ist 100Mhz Clock
C1 ist  Phasenverschobener Clock.


Hilft mir bitte:)

von Sigi (Gast)


Lesenswert?

<jtag_uart_0:avalon_jtag_slave> ist mit <nios2_qsys_0:data_master>
verbunden. Wäre der <nios2_qsys_0:instruction_master> nicht besser?

von Kest (Gast)


Lesenswert?

Schaue Dir bitte genau die Resets an! Mit QSYS ist es verdammt wichtig, 
dass die Resets (falls mehrere) in der richtigen Reihenfolge hochkommen.

Bis jetzt kommt Dein NIOS mit clk_0 reset, wobei SDRAM und die PLL noch 
gar nicht fertig sind! Das ist die Krux. Also, implementiere einen Reset 
Controller, dann noch denn mit PLL-locked füttern und erst dann ans NIOS 
und SDRAM heranführen. Dann sollte es funzen (falls die Phase stimmt)

Kest

von Test (Gast)


Lesenswert?

Und immer schön in Qsys Assign new Base Adresses klicken!!

von Ich (Gast)


Lesenswert?

Das SDRAM Interface und der Prozessor haben nicht dieselbe Clock-Quelle. 
Entweder dieselbe Quelle verwenden oder eine Clock crossing bridge 
einsetzen.

von Kest (Gast)


Lesenswert?

QSYS und SOPC bauen automatisch Clock-Crossing bridges ein, falls die 
Clock-Domänen unterschiedlich sind.
Aber stimmt schon, es ist viel sinnvoller beide mit gleicher 
Clock-Quelle zu betreiben (fürs Interna ist die Phase sowieso egal)

Kest

von Ich (Gast)


Lesenswert?

Kest schrieb:
> QSYS und SOPC bauen automatisch Clock-Crossing bridges ein, falls die
> Clock-Domänen unterschiedlich sind.

Oh, das ist mir bisher nicht bekannt gewesen. Hast Du eine Quelle für 
diese Information?

Gruss

von Kest (Gast)


Lesenswert?

Quelle habe ich nicht parat, aber das ist so :-)
Kest

von GS (chromosoma)


Lesenswert?

Ich schrieb:
> Das SDRAM Interface und der Prozessor haben nicht dieselbe Clock-Quelle.
> Entweder dieselbe Quelle verwenden oder eine Clock crossing bridge
> einsetzen.

Na, so steht es doch überall.
PLL produziert zwei Clock Quellen,  eine ist "normal" und geht an NIOS, 
und die verschobene geht an SDRAM.
Ok, ich versuche gleich alles mit der selber Quelle zu betreiben.



PS
 "Assign new Base Adresses" habe ich   mehrmals geklickt

von Michael (Gast)


Lesenswert?

Hallo,

hier gibt es eine kleine Beschreibung für NiosII und ChibiOS auf DE1:
http://www.emb4fun.de/fpga/niosii1/index.html

Gruß,
Michael

von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

Hallo,

emb4fun habe  ich auch gesehen. Leider wird dort  alles in SOPC gemacht, 
deswegen sieht man nicht wie die RESET und CLK  miteinander verbunden 
werden.


Ich habe jetzt alle mit einer Taktquelle versucht, ohne Erfolg.
Ich denke alles liegt an RESET Verbindungen.

 clk_0_clk_in_reset   wird mit einem Schalter auf DE1 Board  verbunden, 
so dass ich das System manuell resetten kann, im "normalen" Betrieb  ist 
dieser Schalter immer An (logic '1'). Kann es die Ursache sein?

von Ich (Gast)


Lesenswert?

Böser Kommunist schrieb:
> Na, so steht es doch überall.
> PLL produziert zwei Clock Quellen,  eine ist "normal" und geht an NIOS,
> und die verschobene geht an SDRAM.

Nein, die Clock im QSYS wird für das Avalon Interface genutzt. Die SDRAM 
Clock verschiebe ich ausserhalb vom QSYS-System.

von Ich (Gast)


Angehängte Dateien:

Lesenswert?

Hier findest Du ein Beispiel.

von Ich (Gast)


Lesenswert?

Du kannst auch gut sehen, wie ich das Reset verschalte.

von Ich (Gast)


Lesenswert?

Jetzt, wo ich grad dabei bin, wie sehen Deine Timing-Constraints aus?

von Ich (Gast)


Angehängte Dateien:

Lesenswert?

Ein funktionierendes Beispiel.

von Michael (Gast)


Lesenswert?

Hallo,

>emb4fun habe  ich auch gesehen. Leider wird dort  alles in SOPC gemacht,
>deswegen sieht man nicht wie die RESET und CLK  miteinander verbunden
>werden.

Reset und CLK werden extern im TopLevel erzeugt:
1
pll_sys           pll_sys_inst
2
(
3
   .inclk0(CLOCK_50),    /* in:   50 MHz */
4
   .c0(CLK_SYS),         /* out: 100 MHz */
5
   .c1(SDRAM_CLK),       /* out: 100 MHz */
6
   .c2(CLK_10),          /* out:  10 MHz */
7
   .locked(pll_locked)
8
);
9
10
de1_sopc          de1_sopc_inst
11
(
12
   .clk_sys(CLK_SYS),
13
14
   .reset_n(pll_locked)
15
);

Eine VHDL Version ist auch vorhanden. Der CLK vom SDRAM
ist gegenüber den CLK_SYS verschoben.

Gruß,
Michael

von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

Die Götter haben mich verlassen. Nach einer schlafloser Nacht, habe ich 
es trotzdem nicht geschafft,  SDRAM zum laufen zu bringen.
Hier ist nochmals meine Qsys Konfiguration, jetzt mit PLL-Lockin 
Geschichte.


Ich habe jetzt alle unnötige Sachen weggelassen.

Clock_50 geht in das PLL rein. Dort wird er auf 133 MHZ  multipliziert, 
Ein 133 Mhz signal geht direkt ins NIOSII, ein andere Clock wird um 52° 
verschoben, und geht   an SDRAM.

Und hier  noch der VHDL Code.
1
   
2
library ieee;
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
6
7
8
ENTITY NIOSTEST IS
9
PORT(
10
CLOCK_50: IN STD_LOGIC;
11
LEDR: OUT STD_LOGIC_VECTOR(9 downto 0);
12
SW: IN STD_LOGIC_VECTOR(9 downto 0);
13
DRAM_ADDR: OUT STD_LOGIC_VECTOR(11 downto 0);
14
DRAM_BA_1, DRAM_BA_0 : BUFFER STD_LOGIC;
15
DRAM_CAS_N: OUT STD_LOGIC;
16
DRAM_CKE: OUT STD_LOGIC;
17
DRAM_CLK: OUT STD_LOGIC;
18
DRAM_CS_N: OUT STD_LOGIC;
19
DRAM_DQ: INOUT STD_LOGIC_VECTOR(15 downto 0);
20
DRAM_RAS_N: OUT STD_LOGIC;
21
DRAM_UDQM, DRAM_LDQM : BUFFER STD_LOGIC;
22
DRAM_WE_N: OUT STD_LOGIC
23
);
24
END NIOSTEST;
25
26
27
ARCHITECTURE MAIN OF NIOSTEST IS
28
SIGNAL BA : STD_LOGIC_VECTOR(1 DOWNTO 0);
29
SIGNAL DQM : STD_LOGIC_VECTOR(1 DOWNTO 0);
30
SIGNAL LOCK: STD_LOGIC;
31
SIGNAL RESET: STD_LOGIC;
32
33
     component nios is
34
        port (
35
            clk_0                                        : in    std_logic                     := 'X';             -- clk
36
            
37
            zs_addr_from_the_new_sdram_controller_0      : out   std_logic_vector(11 downto 0);                    -- addr
38
            zs_ba_from_the_new_sdram_controller_0        : out   std_logic_vector(1 downto 0);                     -- ba
39
            zs_cas_n_from_the_new_sdram_controller_0     : out   std_logic;                                        -- cas_n
40
            zs_cke_from_the_new_sdram_controller_0       : out   std_logic;                                        -- cke
41
            zs_cs_n_from_the_new_sdram_controller_0      : out   std_logic;                                        -- cs_n
42
            zs_dq_to_and_from_the_new_sdram_controller_0 : inout std_logic_vector(15 downto 0) := (others => 'X'); -- dq
43
            zs_dqm_from_the_new_sdram_controller_0       : out   std_logic_vector(1 downto 0);                     -- dqm
44
            zs_ras_n_from_the_new_sdram_controller_0     : out   std_logic;                                        -- ras_n
45
            zs_we_n_from_the_new_sdram_controller_0      : out   std_logic;                                        -- we_n
46
            reset_n                                      : in    std_logic                     := 'X';             -- reset_n
47
            locked_export                                : out   std_logic                                         -- export
48
        );
49
      end component nios;
50
      
51
  BEGIN
52
  DRAM_BA_1<= BA(1);
53
  DRAM_BA_0<= BA(0);
54
        DRAM_UDQM<= DQM(1);
55
  DRAM_LDQM<= DQM(0);
56
  RESET<=LOCK;
57
58
C1: nios PORT MAP(CLOCK_50,DRAM_ADDR,BA,DRAM_CAS_N,DRAM_CKE,DRAM_CS_N,DRAM_DQ,DQM,DRAM_RAS_N,DRAM_WE_N,RESET,LOCK);
59
END MAIN;

von Michael (Gast)


Lesenswert?

Hallo,

was ich bei Dir nicht verstehe, wo kommt der Reset her?
Auf dem Bild gibt es ein clk_0_clk_in und ein clk_0_clk_in_reset.

Wer setzt das Signal clk_0_clk_in_reset? Es kann nicht die PLL sein,
denn diese bekommt ja von clk_0 den Reset.

Bei meinen Beispielen habe ich die PLL nicht mit in Qsys gezogen,
sondern mit dem Megawizard außerhalb erstellt. Und dann das locked
Signal als Reset für das Qsys System benutzt.

Viele Grüße,
Michael

von Ich (Gast)


Lesenswert?

Wohl ein generelles Problem von Kommunisten (ob böse oder nicht) und 
Sozialisten,  sie begreifen es einfach nicht...

von Kest (Gast)


Lesenswert?

Das ist immer noch falsch.

Du kannst den SDRAM-Controller nicht reseten, solange PLL nicht gelockt 
ist. Unabhängig, was Du noch mit locked machst, aber Du resetest die PLL 
UND SDRAM Cotrlller mit einem Signal. Das wird nie und nimmer 
funktionieren.

Noch mal langsam. Erst die PLL reseten, dann locked signal ableiten 
(ggf. invertieren) und an den SDRAM Controller führen (mit einem 
extra-Resetcontroller (oder von mir aus auch mit external)).

Grüße
Kest

von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

Hallo. Ich kriege es trotzdem nicht hin:

Ich habe das gemacht, was du meinst. Das ganze System wartet auf den PLL 
LOCK  Signal. Die PLL selbst bekommt eigenen RESET Signal,  der immer 0 
ist.
Das Hauptreset ist immer "1", weil alle Komponenten außer PLL  mit 
"active Low"-Reset arbeiten

Hier ist noch einmal die Konfiguration.

1
 
2
 component nios1 is
3
        port (
4
            clk_clk          : in    std_logic                     := 'X';             -- clk
5
            plllocked_export : out   std_logic;                                        -- export
6
            sdram_addr       : out   std_logic_vector(11 downto 0);                    -- addr
7
            sdram_ba         : out   std_logic_vector(1 downto 0);                     -- ba
8
            sdram_cas_n      : out   std_logic;                                        -- cas_n
9
            sdram_cke        : out   std_logic;                                        -- cke
10
            sdram_cs_n       : out   std_logic;                                        -- cs_n
11
            sdram_dq         : inout std_logic_vector(15 downto 0) := (others => 'X'); -- dq
12
            sdram_dqm        : out   std_logic_vector(1 downto 0);                     -- dqm
13
            sdram_ras_n      : out   std_logic;                                        -- ras_n
14
            sdram_we_n       : out   std_logic;                                        -- we_n
15
            reset_reset_n    : in    std_logic                     := 'X';             -- reset_n
16
            resetb_reset_n   : in    std_logic                     := 'X';             -- reset_n
17
            pllrst_reset     : in    std_logic                     := 'X'              -- reset
18
        );
19
    end component nios1;
20
21
22
23
BEGIN
24
  DRAM_BA_1<= BA(1);
25
  DRAM_BA_0<= BA(0);
26
   DRAM_UDQM<= DQM(1);
27
  DRAM_LDQM<= DQM(0);
28
  LEDR(0)<=LOCK;
29
  RESETB<= LOCK;
30
  pllrst<=SW(1);
31
  RESETMAIN<=SW(0);
32
  C1: nios1 PORT MAP(CLOCK_50,LOCK,DRAM_ADDR,BA,DRAM_CAS_N,DRAM_CKE,DRAM_CS_N,DRAM_DQ,DQM,DRAM_RAS_N,DRAM_WE_N,RESETMAIN,RESETB,pllrst);


Ich habe das Gefühl ich mache was komplett falsch.
Im SDRAM Datenblatt steht : "Clock frequency: 166, 143 MHz". Ich 
vverwende 100Mhz., obwohl überall wird  50-100Mhz  genommen.
Hilfe

von Kest (Gast)


Lesenswert?

Sorry, ich weiß auch nicht mehr. Aber Du siehst, dass man von Anfang an 
sorgfältig arbeiten muss. Meist ist man zu schnell, ändert zu viele 
Sachen, möchte mal eben ausprobieren. Das kann man sofort vergessen.
Ich habe unzählige Designs mit NIOS und SDRAM/DDR... und div Flashes 
gemacht. Bis jetzt habe ich keine "Bugs" diesbezüglich in 
Altera-Software gefunden. Es ist auch schwierig über so ein Forum 
rauszufinden, woran es liegt. Am Ende ist es doch ein Jumper auf dem 
Board, der zwischen EPCS und Active Parallel  umschaltet ;-)

Grüße
Kest

von GS (chromosoma)


Lesenswert?

Ich IDIOOOOT...:)
Ich verbinde zwar CLK für SDRAM Kontroller, aber DRAM_CLK bleibt doch 
unverbunden.*FACEPALM*
Und keiner hat es gemerkt..:)

Jetzt funktioniert es .

von Kest (Gast)


Lesenswert?

So kanns gehen :-D

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.