Hallo,
hab folgendes Probelm... ich will in Adresse 1 einen Hexcode abspeichern
im flash und nachdem ich die schalterstellung wechseln soll er mir diese
auf LED's ausgeben.
Ich benutze von Altera das DE2-70 Cyclone II board, im Anhang ist das
Datenblatt vom Flash(ich hab den S29GL064A90TFIR4).
Hier mein Code:
1
module test_veri(
2
SW_OE,
3
SW_WE,
4
CLK_50,
5
LEDG,
6
7
OE,
8
WE,
9
Adress,
10
Data,
11
LED
12
);
13
14
input CLK_50;
15
input SW_OE;
16
input SW_WE;
17
18
output [2:0] LEDG;
19
20
output OE;
21
output WE;
22
output [21:0] Adress;
23
output [15:0] LED;
24
25
inout [15:0] Data;
26
27
reg [2:0] LEDG;
28
reg [15:0] LED;
29
reg [15:0] Data;
30
31
32
assign OE = SW_OE;
33
assign WE = SW_WE;
34
assign Adress = 1;
35
36
always @(posedge CLK_50)
37
begin
38
if((SW_OE==1)&&(SW_WE==0))
39
begin
40
LEDG = 3'b100;
41
LED = Data;
42
end
43
else if ((SW_OE==0)&&(SW_WE==1))
44
begin
45
LEDG = 3'b010;
46
Data = 16'hBDE7;
47
end
48
else
49
begin
50
LEDG = 3'b001;
51
LED = 0;
52
end
53
end
54
55
endmodule
die LEDG dienen zur Kontrolle wo ich mich in der IF-Bedingung
befinde...aber mein flash wird nicht beschrieben... also er gibt den
code schon auf die LED's aus aber er umgeht den flash... was mache ich
falsch?
Mach Dir mal eine Testbench und schau nach, ob sich die Signale so
verhalten, wie Du bzw. das Datenblatt es erwarten.
Rick
P.S.: Du kannst auch gern die Testbench hier einstellen und wir können
gemeinsam nach Fehlern suchen.
Einen Wert in einen Flash zu schreiben ist deutlich komplizierter als
z.B. bei einem SRAM. Damit die Daten nicht versehentlich überschrieben
werden musst du bestimmte Adress- und Datenmuster anlegen (im Datenblatt
mal nach "Command Definitions" schauen). Falls schon Daten drin stehen
musst du sie ggf. vorher löschen. Das passiert immer für alle Daten in
einem Datenblock.
Die Kapitel über die "Word Program Command Sequence", die "Unlock Bypass
Command Sequence" und eventuell noch über "Write Buffer Programming"
solltest du dir auch anschauen. Vielleicht versuchst du zuerst einmal
die Kennung des Flashs auszulesen.
Dann bitte noch dran denken das die Anzahl der Löschzyklen begrenzt ist
(immerhin 100.000). Also bitte nichts designen was in einer
Endlosschleife Sektoren löscht ;).
In deinem Code vermisse ich eine Stelle an der die Ausgänge abgeschaltet
werden (Tristate). In VHDL weist man dazu 'Z' zu, müsste in Verilog
eigentlich genauso aussehen.
das mit dem testbench funktioniert leider bei der software nicht...wenn
ich den machen will sagt er mir "no EDA simulations tool specified",
muss dazu sagen dass dies meine erstes board dieser art ist und ich
damit nicht viel erfahrung hab...
das ich die ausgänge abschalten muss hab ich shcon mitbekommen, jedoch
weiß ich nicht wie ich das realisieren soll... ich will ja dann quasi
über die gleichen pins Z's anlegen und gleichzeitig daten lesen....das
will mir nicht in den kopf...
jemand hat mir gesagt dass ich das aufteilen soll in data_in und
data_out und dann mit einer padzelle verbinden, was ich jedoch auch
nicht realisieren soll...
hab auf dem board noch ein SDRAM und ein SSRAM... sind diese einfacher
zu beschrieben? ich muss 81 werte abscheichern... und dann später
auslesen...
danke
> ich will ja dann quasi über die gleichen pins Z's> anlegen und gleichzeitig daten lesen
Genau. Wenn du an einem Pin Z anlegst und gleichzeitig den Wert
ausliest, dann bekommst du den Wert von außen.
> hab auf dem board noch ein SDRAM und ein SSRAM... sind diese einfacher> zu beschrieben? ich muss 81 werte abscheichern... und dann später> auslesen...
Für den SSRAM ist wohl ein Beispiel auf der CD dabei. Aber wenn du nur
81 Werte speichern willst, dann kannst du auch einen internen Blockram
verwenden. Oder du speicherst die Werte in einer entsprechenden Anzahl
Register ab (diese Lösung ist bei Altera FPGAs aber eher unschön). Das
sollten die bei weitem einfachsten Lösungen sein.
Paulus P. wrote:
[...]
> die LEDG dienen zur Kontrolle wo ich mich in der IF-Bedingung> befinde...aber mein flash wird nicht beschrieben... also er gibt den> code schon auf die LED's aus aber er umgeht den flash... was mache ich> falsch?
Ohne die Funktion zu überprüfen, habe ich mal deinen Code abgeändert um
mit dem bidirektionalen Bus zu arbeiten:
1
moduletest_veri(
2
SW_OE,
3
SW_WE,
4
CLK_50,
5
LEDG,
6
7
OE,
8
WE,
9
Adress,
10
Data,
11
LED
12
);
13
14
inputCLK_50;
15
inputSW_OE;
16
inputSW_WE;
17
18
output[2:0]LEDG;
19
20
outputOE;
21
outputWE;
22
output[21:0]Adress;
23
output[15:0]LED;
24
25
inout[15:0]Data;
26
27
reg[2:0]LEDG;
28
reg[15:0]LED;
29
wire[15:0]Data;
30
31
32
reg[15:0]data_reg;
33
34
assignOE=SW_OE;
35
assignWE=SW_WE;
36
assignAdress=1;
37
38
assignData=(SW_WE&~SW_OE)?data_reg:16'hz;
39
40
always@(posedgeCLK_50)
41
begin
42
43
data_reg<=16'hBDE7;
44
45
if((SW_OE==1)&&(SW_WE==0))
46
begin
47
LEDG<=3'b100;
48
LED<=Data;
49
end
50
elseif((SW_OE==0)&&(SW_WE==1))
51
begin
52
LEDG<=3'b010;
53
end
54
else
55
begin
56
LEDG<=3'b001;
57
LED<=0;
58
end
59
end
60
61
endmodule
Weiterhin habe ich alle Zuweisungen in nicht-blockierende (Non-blocking)
geändert. Da dein always-Block synchron zum CLK_50-Takt arbeitet, ist es
sinnvoll nur nicht-blockierende Zuweisungen zu verwenden. Dann ist
sichergestellt das die Simulation sich genauso verhält wie später das
implementierte Design.
Du musst hier eins beachten, SW_OE und SW_WE sind asynchrone Signale,
die irgendwann den Datenbus freischalten, bzw. von Schreiben auf Lesen
umschalten. Das darfst du dann in deiner Logik nicht synchron zu CLK_50
machen. Sonst wird von außen signalisiert das der Datenbus z.B. von
Schreiben auf Lesen umgeschaltet werden soll, weil z.B. ein anderes
Gerät darauf schreiben will und dein Modul wartet aber immer noch mit
dem Umschalten bis zum nächsten CLK_50-Takt damit.
Servus,
danke dass du dir die Mühe gemacht hast mit dem Code,
er funktioniert zwar aber er umgeht auch den flash... er speichert das
in einem internet register ab nehm ich an und nicht auf dem flash... bei
dem Code ist ja nichtmal der Chipenable aufgelistet...deswegen ist der
flash ja nichtmal angesprochen und trotzdem fürht er das programm
aus...dewegen würd ich behaupten dass er den flash umgeht..
oder seh ich das falsch?
vielleicht werd ich auch den ssram dann benutzen...aber würde trotzdem
das mit dem flash gerne hinkriegen...
Das man die ausgänge hochohmig beim lesen setzen muss...damit komm ich
mitlerweile klar...
aber was fehlt an dem code noch?
danke und gruß
Paulus P. wrote:
> Servus,> danke dass du dir die Mühe gemacht hast mit dem Code,> er funktioniert zwar aber er umgeht auch den flash... er speichert das> in einem internet register ab nehm ich an und nicht auf dem flash... bei> dem Code ist ja nichtmal der Chipenable aufgelistet...deswegen ist der> flash ja nichtmal angesprochen und trotzdem fürht er das programm> aus...dewegen würd ich behaupten dass er den flash umgeht..
Das verstehe ich nicht ganz. Jetzt muss ich sagen ich kenne das Board
nicht. Hab nur mal nach dem Benutzerhandbuch und dem Datenblatt von dem
Flash gesucht:
http://www.altera.com/literature/manual/mnl_cii_starter_board_rm.pdfhttp://www.spansion.com/datasheets/s29al032d_00_a8_e.pdf
Laut Benutzerhandbuch ist der Flash an andere Pins angeschlossen als der
SRAM. Damit steht und fällt das ganze erst mal damit an was für Pins des
FPGA du deine Ports gehängt hast. Laut Benutzerhandbuch sind die Flash
Data pins AB16, AA16 ... AB19, AA19. Wenn der inout Data Port daran
hängt, kann er eigentlich nichts umgehen.
Data muss als wire definiert sein und dann kannst du auch nichts von
einem internen Register zurück lesen.
...
> vielleicht werd ich auch den ssram dann benutzen...aber würde trotzdem> das mit dem flash gerne hinkriegen...>
Im Abschnitt 7.3 des Flash Datenblattes wird das Schreiben erklärt. Was
mir auffällt und was du auch schon erwähnt hast ist das CE nicht
angeschlossen ist in deiner Logik. Da sind aber noch mehr Signal die
erwähnt werden.
Zum Beispiel wird in dem Abschnitt was von den verschiedenen
Schreibmoden wie Byte oder Word Mode erwähnt.
Auch wird was von geschützten Bereichen geschrieben. Hast du denn
sichergestellt das du den richtigen Schreibmodus nimmst und nicht auf
einen geschützten Bereich zugreifen willst?
...
> aber was fehlt an dem code noch?
Weiterhin wird in Abschnitt 11.5 das Kommando zum Programmieren
beschrieben. Da steht unter anderem das es ein 4-Buszyklen langer Befehl
ist. Das bedeutet du musst eine State-Machine kreieren, die dir diesen
Zyklus erzeugt.
Auch musst du die Zeiten einhalten die im Abschnitt 17 (17.4) vorgegeben
werden.
Ich vermute mal, was auch Mike schon gesagt hat, das du wahrscheinlich
sogar erst mal einen Löschzyklus vorhängen musst, um den Bereich zu
löschen bevor du Daten reinschreibst.
Günter .. wrote:
> Das verstehe ich nicht ganz. Jetzt muss ich sagen ich kenne das Board> nicht. Hab nur mal nach dem Benutzerhandbuch und dem Datenblatt von dem> Flash gesucht:>> http://www.altera.com/literature/manual/mnl_cii_starter_board_rm.pdf>> http://www.spansion.com/datasheets/s29al032d_00_a8_e.pdf>> Laut Benutzerhandbuch ist der Flash an andere Pins angeschlossen als der> SRAM. Damit steht und fällt das ganze erst mal damit an was für Pins des> FPGA du deine Ports gehängt hast. Laut Benutzerhandbuch sind die Flash> Data pins AB16, AA16 ... AB19, AA19. Wenn der inout Data Port daran> hängt, kann er eigentlich nichts umgehen.
Das Handbuch was du hast ist vom Starter Board...ich hab aber das DE2-70
board...da sind die Pins etwas anders, die datenpins liegen da auf AF29,
AE28...AA30,AE24.
Aber das ja nur nebensächlich, die Pins habe ich angeschlossen gehabt an
den inout Data.
...
> Im Abschnitt 7.3 des Flash Datenblattes wird das Schreiben erklärt. Was> mir auffällt und was du auch schon erwähnt hast ist das CE nicht> angeschlossen ist in deiner Logik. Da sind aber noch mehr Signal die> erwähnt werden.> Zum Beispiel wird in dem Abschnitt was von den verschiedenen> Schreibmoden wie Byte oder Word Mode erwähnt.
Ja genau habe noch den BYTE, den WP, den RESET und den CE denn ich da
beim code ausversehen vergessen hatt, weil ich diese immer rausgemacht
hab um zu gucken ob es auch ohne diese ansteuerung geht, und da es ohne
ging, geh ich davn aus dass er den flash nicht benutzt da das programm
trotzdem funktioniert hat.
Hab die Signale wie folgt gestetzt:
1
assign BYTE = 1; //Damit alle 16 Bit des Datenbuses genutzt werden
2
assign WP = 1; // Da ich kein Schreibschutz brauche
3
assign RESET = 1; //Der Reset soll nicht durchgeführt werden
4
assign CE = 0; // Der chip soll aktiviert werden.
diese sind laut datenblatt für den schreib und lese vorgang gleich,
deswegen hab ich die im vorfeld deklariert.
die Signale sind ja active Low.
wobei ich beim WP nicht sicher bin was mti dem gemeint ist, ich habs so
verstanden dass ich damit bestimmte bits schützen kann, was ich ja nicht
möchte.
...
> Auch wird was von geschützten Bereichen geschrieben. Hast du denn> sichergestellt das du den richtigen Schreibmodus nimmst und nicht auf> einen geschützten Bereich zugreifen willst?
ist das vielleicht das was du meinst mit dem WP? habe nix von geschützen
bereichen festgestellt...wie kann ich das denn prüfen?
...
> Weiterhin wird in Abschnitt 11.5 das Kommando zum Programmieren> beschrieben. Da steht unter anderem das es ein 4-Buszyklen langer Befehl> ist. Das bedeutet du musst eine State-Machine kreieren, die dir diesen> Zyklus erzeugt.
Welche Zyklen brauch ich denn? ich dachte nur schreiben und dann lesen,
und vorher noch einen löschvorgang...aber was ist denn der vierte?
kann leider das datenblatt was du benutzt hast nicht öffnen..er läd nur
400kb und dann hört er auf...
...
> Ich vermute mal, was auch Mike schon gesagt hat, das du wahrscheinlich> sogar erst mal einen Löschzyklus vorhängen musst, um den Bereich zu> löschen bevor du Daten reinschreibst.
bei dem Datenblatt was ich hier dazugestellt hab beim ersten post bei
der tabelle auf seite 22 die zweite zeile beim Write steht noch dabei
(Programm/Erase) dachte dass er dabei den löschvorgang durchführt oder
sollte ich nen kompletten reset vorher durchführen?
danke schonmal