NIOSII mit SDRAM startet nicht.

OP #3313039
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:)
Angehängte Dateien:
Gast #3313122
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
Gast #3313325
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
OP #3313977
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
OP #3314030
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?
Angehängte Dateien:
Gast #3314258
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
OP #3315539
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;
Angehängte Dateien:
Gast #3315569
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
Gast #3315934
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
OP #3321334
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
Angehängte Dateien:
Gast #3322661
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren