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:)
<jtag_uart_0:avalon_jtag_slave> ist mit <nios2_qsys_0:data_master> verbunden. Wäre der <nios2_qsys_0:instruction_master> nicht besser?
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
Das SDRAM Interface und der Prozessor haben nicht dieselbe Clock-Quelle. Entweder dieselbe Quelle verwenden oder eine Clock crossing bridge einsetzen.
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
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
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
Hallo, hier gibt es eine kleine Beschreibung für NiosII und ChibiOS auf DE1: http://www.emb4fun.de/fpga/niosii1/index.html Gruß, Michael
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?
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.
Jetzt, wo ich grad dabei bin, wie sehen Deine Timing-Constraints aus?
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
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; |
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
Wohl ein generelles Problem von Kommunisten (ob böse oder nicht) und Sozialisten, sie begreifen es einfach nicht...
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
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
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
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 .
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.