Forum: FPGA, VHDL & Co. verilog Flash beschreiben und lesen


von Paulus P. (sudoku)


Angehängte Dateien:

Lesenswert?

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?

von Rick Dangerus (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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.

von Paulus P. (sudoku)


Lesenswert?

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

von Morin (Gast)


Lesenswert?

> 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.

von Mike (Gast)


Lesenswert?

> 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.

von Günter -. (guenter)


Lesenswert?

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
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
wire   [15:0]  Data;
30
31
32
reg [15:0] data_reg;
33
34
assign OE = SW_OE;
35
assign WE = SW_WE;
36
assign Adress = 1;
37
38
assign Data = (SW_WE & ~SW_OE) ? data_reg : 16'hz;
39
40
always @(posedge CLK_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
  else if ((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.

von Paulus P. (sudoku)


Lesenswert?

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ß

von Günter -. (guenter)


Lesenswert?

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.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.

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.

von Paulus P. (sudoku)


Lesenswert?

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

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.