Forum: FPGA, VHDL & Co. Daten in flash speichern und abrufen?


von Igor (Gast)


Lesenswert?

Hallo,


ich hätt da mal ne frage: Ich möchte gerne werte in ein Flash speicher 
einlesen und sie bei bedarf ausgeben. Ich hab aber leider keine Ahnung 
wie ich das machen soll :(..... bin zwischen Anfänger und 
Fortgeschrittener...


Z.B ich lege werte für eine Efunkion ab. und möchte sie ausgeben?


Wie müsst ich das macheN?


Kann mir da jemand etwas helfen?



Danke


Gruß

von Igor (Gast)


Lesenswert?

Ach ja ich verwende ein Spartan 6, SP601 board mit ISE als 
entwicklung...

von Iulius (Gast)


Lesenswert?

Mit den Infos kann dir echt niemand helfen...

- welches board ?
- adressierung ?
- datenblatt vom flash ?
- Wo ist das konkrete Problem ?

wird dir wohl niemand hier mal eben den kompletten Flash "Controller" 
schreiben.

von Igor (Gast)


Lesenswert?

Hi,



- welches board ?   >SP601 Board XC6SLX16-CS324-2CES FPGA
- adressierung ?    > ?
- datenblatt vom flash ? > 
http://www.numonyx.com/Documents/Datasheets/308551_J3D_Discrete_DS.pdf.
- Wo ist das konkrete Problem ? > welchen weg gibt es überhaupt daten 
einzulesen und auszugeben.


Beispiel. Ich möchte eine E funktion abspeichern und diese ausgeben bei 
z.B jeder fallenden flanke vom clock.


Wie müsst ich da vorgehen? um die daten einzuspeichern und auszugeben?



Gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Wie müsst ich da vorgehen? um die daten einzuspeichern und auszugeben?
Das steht im Datenblatt des Flashs.
Ja, ich weiß, die Antwort ist etwas flapsig, aber deine Frage ist 
übertragen etwa: Wie starte und lande ich einen Airbus A380?
Keiner weiß, ob du einen Pilotenschein hast, schon mal irgendein 
Flugzeug geflogen hast, und was für ein Typ das war.
Zurückübertragen heißt das: welche Kenntnisse hast du?

> welchen weg gibt es überhaupt daten einzulesen und auszugeben.
Du könntest einen uC auf dem FPGA implementieren, der das macht.
Du könntest eine Statemachine auf dem FPGA implementieren.

BTW: woher bekommst du die Werte dieser e-Funktion?


> Beispiel. Ich möchte eine E funktion abspeichern und diese ausgeben bei
> z.B jeder fallenden flanke vom clock.
Dann mußt du den Takt erst mal vervielfachen, denn um einen Wert aus dem 
Flash zu lesen sind einige aktionen nötig, von denen jede einen 
Taktzyklus braucht.

von Igor (Gast)


Lesenswert?

:) also da mit dem aribus trifft es genau.


Ich möchte die werte selber erstellen und sie im Flash speichern und 
dann abrufen....

Gibt es den irgendein Beispiel?




Gruß

von M. (Gast)


Lesenswert?

Hallo,


bzw. für den Anfang wie kann ich über Impact eine Datei in ein Flash 
ablegen?


Flash hat 16 Mb größe.... und ich möchte 2 12bit breite werte 
einspeichern z.b "111111111111" und "000000000000";


Wie muss meine Datei ausschauen?



Gruß

von mki (Gast)


Lesenswert?

Bestimmt gibt es da ein paar Beispiele. Der Flash hat bestimmt ein 
ChipEnable, ein ReadEnable oder WriteEnable, ein paar Addressleitungen 
und ein paar Datenleitungen als input und output (alles nur geraten). 
Wenn dem so ist dann ist es ja ganz einfach:
- ChipEnable auf 1
- Read/WriteEnable auf 1 oder 0 (je nach dem was man machen will)
- Addresse anlegen
- Daten anlegen
- ein Takt warten und die Daten sind gespeicher (bzw. wurden gelesen)

Welche Leitungen genau da sind und wie die heißen, steht im Datenblatt. 
Wie die angesprochen werden und welche Zeitanforderungen die haben, 
steht irgentwo darunter.

von igor (Gast)


Lesenswert?

Hi,

ja das Datenblatt hab ich mir angeschaut und da steht die Grafik mit den 
Taktanforderungen... ich wollte für den Anfang einfach mal versuchen 
über Impact ins flash zu laden.

Ich dachte sowas wie ein .coe file wo ich quasi daten hinterlege. Sowas 
wollte ich mal in flash reinladen, eine datei wo daten sind....


Und da komm ich nicht so drauf...



Gruß

von Marcus W. (Gast)


Lesenswert?

Auch wenn du den Flash mit einem Muster füllst, so musst du dir dannach 
ein VHDL-Modul schreiben, dass den Flash auch wieder lesen kann.
Denke eher das ist dein primäres Problem.

Und wenn du ein Modul zum Auslesen hast, dann kannst du auch problemlos 
die Schreibfunktion dazu schreiben. Nur wird dir das hier keiner 
abnehmen, das musst du schon selbst machen oder du schaust mal auf 
Opencores.org und holst dir da ein paar Anregungen.

von Iulius (Gast)


Lesenswert?

Bitte bedenken das es sich um einen Configurationsflash beinhaltet.

Das man so einfach da rein schreiben kann ist nicht gesichert. Beim 
Virtex 5 z.b. geht das mit dem Startup Block von Xilinx, beim Spartan 6 
weiß ichs nicht.

Jedenfalls kann man den Takt- sowie Schreibpin nicht ohne weiteres 
nutzen.

von igor (Gast)


Lesenswert?

Ok,

danke für die Antwort. Ich weiß das ich das Auslesen selber machen muss 
in vhdl, ich wollte einfach mal probieren etwas in den flash zu 
speichern und zwar mit der impact.


Kann mir jemand nur bitte sagen wie es den ungefähr gehen müsste mit der 
impact?hat das jemand mal gemacht?  Wie muss dann meine Datei aussehen? 
welche endung muss sie haben? Wie müssen die daten aussehen?




Danke

von Iulius (Gast)


Lesenswert?

Impact frisst das intel hex format mcs, das (nach kurzer suche per 
google) recht einfach zu verstehen ist.

Eventuell musst du ihm aber vorgaukeln das da eine Konfiguration für den 
Spartan drinne steht, damit er es flasht, so genau weiß ich das nicht, 
hab bisher den config-flash noch nicht für sowas missbraucht.



Aber denk dran, du kannst den flash nur auslesen wenn du die config pins 
des spartans nutzen kannst, das geht nicht einfach per ucf.

siehe z.b. xapp 1020.


sinvoller wäre wohl in jedem Fall den ddr2 zu nutzen, der nicht nur 
bedeutend schneller ist, sondern auch größer, langlebiger und mit 
Referenzdesign.

von Igor (Gast)


Lesenswert?

Hallo,

also ich habe es geschaft meine Konfiguration ins Flash zu laden. Meine 
Frage:

Kann ich eine quasi Konfiguration erstellen in dem mehrere Daten dem 
ausgang zuweise . Diese Konfig ins flash lade.

Dann würd ich eine zweite Konfig erstellen in dem ich einen Eingang hab 
dem ich dem Ausgang von der KOnfig vom Flash zuweise und quasi diese 
Daten dann für den Eingang benutze. Die Konfig würd ich dann ganz normal 
gleich in den Spartan laden...



Würde dies theoretisch gehen?



Gruß

von Christian R. (supachris)


Lesenswert?

Wie bitte was?

von Igor (Gast)


Lesenswert?

Sorry etwas umständlich beschrieben...

Ich möchte ja Daten ins Flash speichern und diese verwenden. So um dies 
zu tuen erstelle ich eine quasi Konfiguration, diese ist aber nur mit 
Daten versehen die auf einem Ausgang anliegen. Um es ins Flash zu laden 
via Impact, muss es ja ein .mcs Datei sein.


Dann möchte ich mir diese Daten aus dem Flash (die ja eingespeichert 
sind) verwenden.

Die Verwendung passiert dann in der richtigen Konfiguration von meine 
Program welches ich dann direkt in den Chip lade.

Beispiel.

Im Flash sind 6 Werte 8 bit breit eingespeichert. Diese 6 Werte lade ich 
dann aus dem Flash und multiplizere sie mit einem Wert von meine 
Program....


Ich hoffe etwas besser beschrieben...



Gruß

von Iulius (Gast)


Lesenswert?

Vorgehensweise :

- Controller im FPGA implementieren der nach oben verlinktem Datenblatt 
arbeitet

Dürfte nicht allzu wild sein.. Adressleitung ensprechend dem zu ladenden 
Wert  + die paar enables und dann kannst 1 Takt später den Wert an den D 
Pins abgreifen. BPI Flash ist da wohl ziemlich simpel gestrickt.

- Die Pins musst natürlich korrekt zuweisen.

Da dies ein Konfigurationsflash ist wirst du höchstenswarscheinlich 
keinen direkten Zugriff auf die Pins haben.

Du musst also eine xilinx Primitive instantiieren anstatt diese Pins 
einfach als in/out des top levels zu beschreiben.

nennt sich "STARTUP_SPARTAN6". Allerdings findet man kaum Informationen 
dazu. Im zweifelsfall an die Beschreibung im xapp 1020 halten (natürlich 
musst du trotzdem die STARTUP_SPARTAN6 instantieren und nicht die 
virtex5 primitive !)

- per Impact flash beschreiben (mit deinen Werten)
- per Impact FPGA laden (mit Bitfile)


Bei konkreten Fragen kann man sicher auch mehr dazu sagen.

von Christian R. (supachris)


Lesenswert?

Am besten schaust du mal im Configuration User Guide, wie man zusätzlich 
zum Config-File noch andere Daten in den Flash mit packt, die man dann 
benutzen kann. Beim Spartan 3 stand es irgendwo drin, glaube bei 
MultiBoot, wahrscheinlich gehts beim S6 ähnlich. Auf jeden Fall muss der 
FPGA erst mit dem konfig-File aus dem Flash geladen werden, bevor du mit 
dem eben geladenen Programm auf den Flash zugreifen kannst. Sonst 
müsstest du ja den FPGA erst mal über JTAG oder sonstwas anderes 
konfigurieren. Wieso nimmst du nicht den SPI Flash x4 auf dem Board für 
die Config? Dann hast du den BPI Flash ganz für das Design alleine....

von Igor (Gast)


Lesenswert?

Ok, danke erstmal!

Hab mir schon das Datenblatt angeschaut vom Flash, und da steht ja wie 
mann die Signal anlegen muss wenn man daten schreiben bzw. lesen muss. 
Werde mich mal dran versuchen, und werde mich dann nochmal an euch 
wenden und wenn ihr lust habt könntet ihr mir vielleicht nochmal solche 
hilfreichen Tipps geben...wofür ich euch SEHR dankbar bin/wäre.




Gruß


Igor

von Igor (Gast)


Lesenswert?

Hallo,

ich hab mir jetzt mal das intel hex format angeschaut. Angenommen ich 
möchte wie oben schon mal beschrieben daten im Flash ablegen z.B paar 
werte,  das ich mir diese werte als daten im hex format schreibe z.B

:10010000214601360121470136007EFE09D2190140 - WERT 1
:10010000214601360121470146807EFE0982190140 - WERT 2
:10010000214601360121470136007EFE09D2190140 - WERT 3... usw

diese dann im BPI ablege als mcs. Und dann im SPI eine Konfig erstelle 
die dann diese ausließt?



Kann man es so machen ?


Gruß

von Igor (Gast)


Lesenswert?

Hallo,

also habe es jetzt mal so versucht. Ich habe eine .mcs datei erstellt 
und folgendes eingefügt

:10000000FFB07A543A281C130D09060403020101BB
:00000001FF

Dies bedeutet das ich 16 Werte 8bit breit abgespeichert habe.

Ich habe dann mich nach dem Datenblatt gehalten und habe folgendes 
geschrieben
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity FLASH_CONTROLLER is
12
    Port (   FLASH_RESET    : in  STD_LOGIC;
13
          FLASH_CLK     : in  STD_LOGIC;
14
          FLASH_ADD    : out   std_logic_vector (23 downto 0);
15
          FLASH_CE      : out std_logic;                 -- CHIP ENABLE
16
          FLASH_OE      : out std_logic;                  -- OUT ENABLE
17
          FLASH_DATA    : in STD_LOGIC_vector (7 downto 0);
18
          DATAOUT      : out std_logic_vector (7 downto 0));
19
end FLASH_CONTROLLER;
20
21
architecture Behavioral of FLASH_CONTROLLER is
22
23
Signal cnt     : integer range 0 to 3;
24
Signal CE,OE   : std_logic:='1';
25
Signal ADD,ADD1: std_logic_vector(23 downto 0);
26
Signal DA      : std_logic_vector(7 downto 0);
27
Signal ADD_ENABLE: std_logic;
28
begin
29
  
30
  FLASH_CE  <= CE;
31
  FLASH_OE  <= OE;
32
  FLASH_ADD <=ADD;
33
  ---------------------------------------------
34
  COUNT:process (FLASH_CLK) 
35
  begin
36
    if rising_edge (FLASH_CLK) then
37
      if cnt = 0 then
38
        ADD_ENABLE<= '1';
39
      elsif cnt = 3 then
40
        cnt<=0;
41
      else
42
        ADD_ENABLE<= '0';
43
        cnt <=cnt +1;
44
      end if;
45
    end if;
46
  end process COUNT;
47
  -----------------------------------------------
48
  FLASH_ADDRESSEN: process (FLASH_CLK)
49
  begin
50
    if rising_edge(FLASH_CLK) then
51
      if ADD_ENABLE = '1' then
52
        ADD1<=ADD1+1;
53
      elsif ADD1 = "111111111111111111111111" then
54
        ADD1<=   "000000000000000000000000";
55
      else
56
        ADD1<=ADD1;
57
      end if;
58
    end if;
59
  end process FLASH_ADDRESSEN;
60
  -------------------------------------------------
61
  FLASH: process (cnt)
62
  begin
63
    case cnt is
64
    
65
      when 0 =>  ADD <= ADD1;
66
              CE  <= '0';
67
              OE  <= '0';
68
    
69
      when 1 =>  ADD <= ADD;
70
              CE  <= '0';
71
              OE  <= '0';
72
    
73
      when 2 =>  ADD<=ADD;
74
              CE <='0';
75
              OE <='0';
76
              DATAOUT <= FLASH_DATA;
77
    
78
      when 3 =>  ADD<=ADD;
79
              CE <='1';
80
              OE <='1';
81
      end case;
82
  end process FLASH;
83
  --------------------------------------------------
84
end Behavioral;


Habe es jetzt trotzdem mal mit UCF probiert da Sie im Xilinx Datenblatt 
standen. Dies hab ich direkt programiert und die mcs ins Flash abgelegt, 
also zumindestens denk ich das...


Funzt natürlich nicht... was denkt ihr darüber?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Igor schrieb:
> Funzt natürlich nicht... was denkt ihr darüber?
Du hast ein Latch gebaut, das würde ich mir mal genauer ansehen:
1
  FLASH: process (cnt)
2
  begin
3
    case cnt is
4
      when 0 =>  ADD <= ADD1;
5
              CE  <= '0';
6
              OE  <= '0';
7
    
8
      when 1 =>  ADD <= ADD;
9
               :

Und dann ist auch noch die Sensitivliste unvollständig. In diesen 
kombinatorischen Prozess gehören eigentlich FLASH_DATA und ADD und ADD1 
auch mit rein. Aber das ist dein kleinstes Problem...


> Signal CE,OE   : std_logic:='1';
Das ist unnötig, weil es für kombinatorisch erzeugte Signale keinen 
Defaultwert geben kann.


> Funzt natürlich nicht... was denkt ihr darüber?
Was sagt die Simulation?

von Igor (Gast)


Lesenswert?

Hallo,

danke für den Tipp. Woher kommt der Latch ich hab doch alle Fälle 
ausformuliert? Oder nicht?


So wie ich das jetzt gesehen habe ist eigentlich das größte Problem 
Daten  ins Flash zu kriegen, denn einfach eine .mcs zu erstellen mit den 
Zeilen:

:10000000FFB07A543A281C130D09060403020101BB
:00000001FF

will er mir nicht reinschreiben => Wahrscheinlich weil ich ihm 
vorgaukeln müsste das es um eine Konfig file handelt... nur was muss ich 
noch in die mcs einfügen das er mir die obigen Daten auch reinschreibt? 
:(



Das mit der Simulation ist so ein Ding, hab nicht verstanden wie ich das 
Simuliere ... ich weis ist mir etwas peinlich...


Gruß

von Igor (Gast)


Lesenswert?

Hallo,

folgendes ist mir aufgefallen, als ich den schalter auf SPI Flash gelegt 
hatte und somit BPI aus war, hatt er die datei regeschrieben. Wenn der 
Schalter auf Bpi ist, und spi flash aus ist, dann schreibt er die datei 
nicht ...hm wieso?


Und ich verstehe nicht warum ich latch produziere, ich hab doch alle 
Fälle ausformuliert. Hier nochmal der veränderte Code
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    17:15:57 12/21/2009 
6
-- Design Name: 
7
-- Module Name:    FLASH_CONTROLLER - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_ARITH.ALL;
23
use IEEE.STD_LOGIC_UNSIGNED.ALL;
24
25
---- Uncomment the following library declaration if instantiating
26
---- any Xilinx primitives in this code.
27
--library UNISIM;
28
--use UNISIM.VComponents.all;
29
30
entity FLASH_CONTROLLER is
31
    Port (   FLASH_RESET    : in  STD_LOGIC;
32
          FLASH_CLK     : in  STD_LOGIC;
33
          FLASH_ADD    : out   std_logic_vector (23 downto 0);
34
          FLASH_CE      : out std_logic;                 -- CHIP ENABLE
35
          FLASH_OE      : out std_logic;                  -- OUT ENABLE
36
          FLASH_DATA    : in STD_LOGIC_vector (7 downto 0);
37
          DATAOUT      : out std_logic_vector (7 downto 0));
38
end FLASH_CONTROLLER;
39
40
architecture Behavioral of FLASH_CONTROLLER is
41
42
Signal cnt             : integer range 0 to 3;
43
Signal CE,OE           : std_logic;
44
Signal ADD            : std_logic_vector(23 downto 0);
45
Signal ADD1            : std_logic_vector(23 downto 0):="000000000000000000000000";
46
Signal DA              : std_logic_vector(7 downto 0);
47
Signal ADD_ENABLE        : std_logic;
48
begin
49
  
50
  FLASH_CE  <= CE;
51
  FLASH_OE  <= OE;
52
  FLASH_ADD <=ADD;
53
  ---------------------------------------------
54
  COUNT:process (FLASH_CLK) 
55
  begin
56
    if rising_edge (FLASH_CLK) then
57
      if cnt <=3 then
58
        cnt<=cnt+1;
59
      elsif cnt = 0 then
60
        ADD_ENABLE<= '1';
61
      elsif cnt = 3 then
62
        cnt<=0;
63
      else
64
        ADD_ENABLE<= '0';
65
      end if;
66
    end if;
67
  end process COUNT;
68
  -----------------------------------------------
69
  FLASH_ADDRESSEN: process (FLASH_CLK)
70
  begin
71
    if rising_edge(FLASH_CLK) then
72
      if ADD_ENABLE = '1' then
73
        ADD1<=ADD1+1;
74
      elsif ADD1 = "111111111111111111111111" then
75
        ADD1<=   "000000000000000000000000";
76
      else
77
        ADD1<=ADD1;
78
      end if;
79
    end if;
80
  end process FLASH_ADDRESSEN;
81
  -------------------------------------------------
82
  FLASH: process (FLASH_CLK)
83
  begin
84
    case cnt is
85
    
86
      when 0 =>  ADD <= ADD1;
87
              CE  <= '0';
88
              OE  <= '0';
89
              DA <=DA;
90
      when 1 =>  ADD <= ADD;
91
              CE  <= '0';
92
              OE  <= '0';
93
              DA  <=DA;
94
      when 2 =>  ADD<=ADD;
95
              CE <='0';
96
              OE <='0';
97
              DA <= FLASH_DATA;
98
      when 3 =>  ADD<=ADD;
99
              CE <='1';
100
              OE <='1';
101
              DA<=DA;
102
      when others=>ADD<=ADD;
103
              CE <='1';
104
              OE <='1'; 
105
              DA <=DA;
106
      end case;
107
  end process FLASH;
108
  --------------------------------------------------
109
    DATAOUT<=DA;
110
111
112
113
114
end Behavioral;



mann das macht langsam kein spaß mehr.. :(

von Christian R. (supachris)


Lesenswert?

Igor schrieb:

> mann das macht langsam kein spaß mehr.. :(

Kein Wunder, wenn man so unstrukturiert, ohne Simulation und ohne 
Vorkenntnisse da ran geht. Da musst du jetzt durch. Als erstes würde ich 
empfehlen, dass du einen kompletten Flash-Controller in VHDL schreibst, 
der sich an das Datenblatt des Chips hält. Wenn du das erfolgreich 
simuliert hast, und die Waveforms genauso aussehen wie im Datenblatt des 
Flashes kannst du an der ImPact-Geschichte weiter arbeiten. Da musst du 
halt etwas tiefer eindringen, vielleicht will Impact noch irgendwelche 
Checksummen und sowas. Ich bekomme auch immer mal seltsame Warnungen, 
von wegen x4-Modus und sowas. Also irgendwie ist da noch mehr ins mcs 
File rein codiert. Ohne eine Verifikation des Designs ist das alles nur 
Rätsel-Raten. Also lerne Modelsim zuerst....dann kommst du auch voran.

von Igor (Gast)


Lesenswert?

Hallo,

so jetzt hat es geklappt. Hier der Code
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    17:15:57 12/21/2009 
6
-- Design Name: 
7
-- Module Name:    FLASH_CONTROLLER - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_ARITH.ALL;
23
use IEEE.STD_LOGIC_UNSIGNED.ALL;
24
25
---- Uncomment the following library declaration if instantiating
26
---- any Xilinx primitives in this code.
27
--library UNISIM;
28
--use UNISIM.VComponents.all;
29
30
entity FLASH_CONTROLLER is
31
    Port (   FLASH_RESET    : in  STD_LOGIC;
32
          FLASH_CLK     : in  STD_LOGIC;
33
          FLASH_ADD    : out   std_logic_vector (23 downto 0);
34
          FLASH_RP      : out  std_logic; 
35
          FLASH_CE      : out std_logic;                 -- CHIP ENABLE
36
          FLASH_OE      : out std_logic;                  -- OUT ENABLE
37
          FLASH_DATA    : in STD_LOGIC_vector (7 downto 0);
38
          DATAOUT      : out std_logic_vector (7 downto 0));
39
end FLASH_CONTROLLER;
40
41
architecture Behavioral of FLASH_CONTROLLER is
42
---------------------------------------------
43
Signal cnt             : integer range 0 to 3:=0;
44
Signal CE,OE,RP         : std_logic;
45
Signal ADD            : std_logic_vector(23 downto 0):="111111111111111111111111";
46
Signal DATA_ENABLE      : std_logic;
47
Signal DA              : std_logic_vector(7 downto 0);
48
Signal ADD_ENABLE        : std_logic;
49
---------------------------------------------
50
begin
51
52
  ---------------------------------------------
53
  COUNT:process (FLASH_CLK) 
54
  begin
55
    if FLASH_RESET = '1' then
56
      cnt<=0;
57
    elsif falling_edge (FLASH_CLK) then
58
      cnt<=cnt+1;
59
    elsif cnt = 3 then
60
      cnt<=0;
61
    else
62
      cnt <=cnt;
63
    end if;
64
  end process COUNT;
65
  ---------------------------------------------
66
  TEST: process (cnt)
67
  begin
68
    case cnt is
69
    when 0 =>     ADD_ENABLE <= '1'; 
70
              DATA_ENABLE <= '0';
71
              CE        <=  '0';
72
              OE        <=  '0';
73
              RP        <=  '1';
74
    
75
    when 1 =>     ADD_ENABLE <= '0'; 
76
              DATA_ENABLE <= '0';
77
              CE        <=  '0';
78
              OE        <=  '0';
79
              RP        <=  '1';
80
    
81
    when 2 =>     ADD_ENABLE <= '0'; 
82
              DATA_ENABLE <= '1';
83
              CE        <=  '0';
84
              OE        <=  '0';
85
              RP        <=  '1';
86
    
87
    when 3 =>    ADD_ENABLE <= '0'; 
88
              DATA_ENABLE <= '0';
89
              CE        <=  '1';
90
              OE        <=  '1';
91
              RP        <=  '1';
92
    when others  => ADD_ENABLE <= '0'; 
93
              DATA_ENABLE <= '0';
94
              CE        <= '1';
95
              OE        <= '1';
96
              RP        <=  '1';
97
    end case;
98
  end process TEST;  
99
  -----------------------------------------------
100
  FLASH_DATEN_EINLESEN: process (FLASH_CLK)
101
  begin
102
    if falling_edge(FLASH_CLK) then
103
      if DATA_ENABLE = '1' then
104
        DA<=FLASH_DATA;
105
      else
106
        DA<=DA;
107
      end if;
108
    end if;
109
  end process FLASH_DATEN_EINLESEN;
110
  -------------------------------------------------
111
  FLASH_ADDRESSEN_AUSLESEN: process (FLASH_CLK)
112
  begin
113
    if falling_edge(FLASH_CLK) then
114
      if ADD_ENABLE = '1' then
115
        ADD<=ADD+1;
116
      elsif ADD = "000000000000000000011111" then
117
          ADD<= "000000000000000000000000";
118
      else
119
        ADD<=ADD;
120
      end if;
121
    end if;
122
  end process FLASH_ADDRESSEN_AUSLESEN;
123
  -------------------------------------------------
124
  
125
    DATAOUT  <=  DA;
126
    FLASH_RP <= RP;
127
    FLASH_CE  <= CE;
128
    FLASH_OE  <= OE;
129
    FLASH_ADD <=ADD;
130
131
end Behavioral;

Ich denke das ich noch bei der Addresszuweisung noch ein Fehler hab, 
weil ich nie auf Wert 0 komme, das behebe ich noch.

Danke an euch alle.


Gruß

von Igor (Gast)


Lesenswert?

Hallo,


da mein Flash nur 8 bit Daten hergeben kann, und ich aber 12 bit brauche 
muss ich also alle 2 zyklen 2 byte zusammensetzen. Dazu habe ich oben 
den Code umgeschriebn und ein Zusandsautomat erstellt.

Meine Frage, mein Ausgang ist 12 bit breit. Wie weise ich den unteren 
bits das untere byte aus den Flash und den höreren bits das höhere byte 
aus den Flash zu?

Wie ich das über den Zustandautomaten mache, weiß ich schon, mir gehts 
nur um Teil wo ich die Zuweisung machen soll. ICh habs mal im code 
geschrieben.
Ich wäre euch für ein Tipp Dankbar!

Hier mal der VHDL CODE
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity FLASH_CONTROLLER is
12
    Port (   FLASH_RESET    : in  STD_LOGIC;
13
          FLASH_CLK     : in  STD_LOGIC;
14
          FLASH_ADD    : out   std_logic_vector (23 downto 0);
15
          FLASH_RP      : out  std_logic; 
16
          FLASH_CE      : out std_logic;                 -- CHIP ENABLE
17
          FLASH_OE      : out std_logic;                  -- OUT ENABLE
18
          FLASH_DATA    : in STD_LOGIC_vector (7 downto 0);
19
          DATAOUT      : out std_logic_vector (16 downto 0));
20
end FLASH_CONTROLLER;
21
22
architecture Behavioral of FLASH_CONTROLLER is
23
---------------------------------------------
24
Signal cnt1,cnt2                : integer range 0 to 4;
25
Signal CE,OE,RP                 : std_logic;
26
Signal ADD                    : std_logic_vector(23 downto 0);
27
Signal DATA_ENABLE_HI,DATA_ENABLE_LOW  : std_logic;
28
Signal DA_HI                  : std_logic_vector(15 downto 8);
29
Signal DA_LOW                  : std_logic_vector (7 downto 0);
30
Signal BYTE_SCHREIBEN            : std_logic;
31
Signal ADD_ENABLE,COUNT_ENABLE1,COUNT_ENABLE2  : std_logic;
32
type STATE_TYPE is (Grundzustand,Vorbereiten,Warten,Lesen_HI,Lesen_LOW,Anlegen_LOW,Anlegen_HI); 
33
Signal naechster_zustand: STATE_TYPE;
34
Signal aktueller_zustand: STATE_TYPE:=Grundzustand;
35
36
---------------------------------------------
37
begin
38
39
  --------------- ENABLE SIGNALE--------------
40
            
41
  ---------------------------------------------
42
43
  ZUSTAND_WEITERGEBEN:process (FLASH_CLK)
44
    begin
45
      if FLASH_RESET = '1' then
46
        aktueller_zustand<=Grundzustand;
47
      elsif rising_edge(Flash_CLK) then
48
        aktueller_zustand <= naechster_zustand;
49
      end if;
50
  end process ZUSTAND_WEITERGEBEN;  
51
  ---------------------------------------------
52
  
53
  Zustandsautomat:process (aktueller_zustand,ADD) 
54
  begin
55
  case aktueller_zustand is
56
    
57
    when Grundzustand =>    ADD_ENABLE       <= '0'; 
58
                    BYTE_SCHREIBEN    <= '0';
59
                    DATA_ENABLE_HI    <= '0';
60
                    DATA_ENABLE_LOW  <= '0';
61
                    CE            <=  '1';
62
                    OE            <=  '1';
63
                    RP            <=  '1';
64
                    naechster_zustand <= Vorbereiten;
65
        
66
    when Vorbereiten   =>   ADD_ENABLE       <= '1'; 
67
                    BYTE_SCHREIBEN    <= '0';
68
                    DATA_ENABLE_HI    <= '0';
69
                    DATA_ENABLE_LOW  <= '0';
70
                    CE            <=  '0';
71
                    OE            <=  '0';
72
                    RP            <=  '1';
73
                    naechster_zustand <= Warten;
74
    
75
    when Warten      =>    ADD_ENABLE       <= '0'; 
76
                    BYTE_SCHREIBEN    <= '0';
77
                    DATA_ENABLE_HI    <= '0';
78
                    DATA_ENABLE_LOW  <= '0';
79
                    CE            <=  '0';
80
                    OE            <=  '0';
81
                    RP            <=  '1';
82
                    naechster_zustand <= Lesen_HI;
83
    
84
    
85
    when Lesen_HI      =>  ADD_ENABLE       <= '0'; 
86
                    BYTE_SCHREIBEN    <= '0';
87
                    DATA_ENABLE_HI    <= '1';
88
                    DATA_ENABLE_LOW  <= '0';
89
                    CE            <=  '0';
90
                    OE            <=  '0';
91
                    RP            <=  '1';
92
                    naechster_zustand <= Anlegen_LOW;
93
      
94
    when Anlegen_LOW    =>  ADD_ENABLE       <= '1'; 
95
                    BYTE_SCHREIBEN    <= '0';
96
                    DATA_ENABLE_HI    <= '0';
97
                    DATA_ENABLE_LOW  <= '0';
98
                    CE            <=  '0';
99
                    OE            <=  '0';
100
                    RP            <=  '1';          
101
                    if ADD = "000000000000000000011111" then
102
                    naechster_zustand <= Grundzustand;  
103
                    else
104
                    naechster_zustand <= Lesen_LOW;
105
                    end if;
106
    
107
    when Lesen_LOW      =>  ADD_ENABLE       <= '0'; 
108
                    BYTE_SCHREIBEN    <= '1';
109
                    DATA_ENABLE_HI    <= '0';
110
                    DATA_ENABLE_LOW  <= '1';
111
                    CE            <=  '0';
112
                    OE            <=  '0';
113
                    RP            <=  '1';
114
                    naechster_zustand <= Anlegen_HI;
115
    
116
    when Anlegen_HI    =>  ADD_ENABLE       <= '1'; 
117
                    BYTE_SCHREIBEN    <= '0';
118
                    DATA_ENABLE_HI    <= '0';
119
                    DATA_ENABLE_LOW  <= '0';
120
                    CE            <=  '0';
121
                    OE            <=  '0';
122
                    RP            <=  '1';          
123
                    if ADD = "000000000000000000011111" then
124
                    naechster_zustand <= Grundzustand;  
125
                    else
126
                    naechster_zustand <= Lesen_HI;
127
                    end if;
128
    
129
    
130
    end case;
131
  end process Zustandsautomat;
132
  -------------------------------------------------  
133
  FLASH_ADDRESSEN_AUSLESEN: process (FLASH_CLK)
134
  begin
135
    if falling_edge(FLASH_CLK) then
136
      if ADD = "000000000000000000011111" then
137
        COUNT_ENABLE1<= '1';
138
        ADD<= "000000000000000000000000";
139
      elsif ADD_ENABLE = '1' then
140
        ADD<=ADD+1;
141
      else
142
        COUNT_ENABLE1<= '0';
143
        ADD<=ADD;
144
      end if;
145
    end if;
146
  end process FLASH_ADDRESSEN_AUSLESEN;
147
  -------------------------------------------------
148
  FLASH_DATEN_EINLESEN_HI_BITS: process (FLASH_CLK)
149
  begin
150
    if rising_edge(FLASH_CLK) then
151
      if DATA_ENABLE_HI = '1' then
152
        DA_HI<=FLASH_DATA;
153
      else
154
        DA_HI<=DA_HI;
155
      end if;
156
    end if;
157
  end process FLASH_DATEN_EINLESEN_HI_BITS;
158
  -------------------------------------------------
159
  FLASH_DATEN_EINLESEN_LOW_BITS: process (FLASH_CLK)
160
  begin
161
    if rising_edge(FLASH_CLK) then
162
      if DATA_ENABLE_LOW = '1' then
163
        DA_LOW<=FLASH_DATA;
164
      else
165
        DA_LOW<=DA_LOW;
166
      end if;
167
    end if;
168
  end process FLASH_DATEN_EINLESEN_LOW_BITS;
169
  -------------------------------------------------
170
  2BYTE_ZUSAMENSETZEN: process (FLASH_CLk)
171
  begin
172
    if falling_edge (FLASH_CLK) then
173
      if BYTE_SCHREIBEN  = '1'; then
174
        (DATAOUT 15 downto 8) <= DA_HI; ------------ HIER WIE MACHE ICH DAS? 
175
        (DATAOUT downto 0 <= DA_LOW;
176
      else
177
        DATAOUT<=DATAOUT;
178
      end if;
179
    
180
    end if;
181
  end process 2BYTE_ZUSAMENSETZEN;
182
  
183
  
184
  
185
  
186
  -------------------------------------------------
187
  --DATAOUT  <=  DA;
188
  FLASH_RP <= RP;
189
  FLASH_CE  <= CE;
190
  FLASH_OE  <= OE;
191
  FLASH_ADD <=ADD;
192
  -------------------------------------------------
193
end Behavioral;

von Iulius (Gast)


Lesenswert?

meinst du das so ?

DATAOUT(15 downto 8) <= DA_HI;
DATAOUT(7 downto 0 <= DA_LOW;

alternativ :

dataout <= da_hi & da_low;

ansonsten kann ich mir nicht vorstellen was du meinst.


Achja : dein dataout soll 17 bit(16 downto 0) breit sein ?

Falls ja musst du natürlich noch vorne oder hinten ein bit anhängen.

von Igor (Gast)


Lesenswert?

Ja genau das meine ich,

Mein Ausgang ist 12 bit breit, aus den Flash kommt 2 mal 8 bit, wobei 
halt die oberen 4 bit leer sind.


> dataout <= da_hi & da_low;

Wie kann man sich das vorstellen, denn ich muss halt das erste byte von 
FLASH meinem ausgang 12 downto 7, und das zweite byte vom FLASH meinem 
ausgang 7 downto 0 zuweisen!


Dazu kommt noch das ich 4 bits nicht brauche... den 2 byte sind 16 bit, 
davon brauche ich aber nur 12. Muss ich dann mein Ausgang auf 16 bit 
erweitern, aber in der ucf nichts machen? oder



Danke Gruß

von Christian R. (supachris)


Lesenswert?

1
DATAOUT <= DA_High(3 downto 0) & DA_LOW;

& ist in VHDL ein Verkettungs-Operator. Hier verkettet er das untere 
Nibble vom Highbyte mit dem gesamten Lowbyte. Somit ergibts 12 Bit.
Das gleiche nur anders geschrieben wäre:
1
DATAOUT(11 downto 8) <= DA_High(3 downto 0);
2
DATAOUT(7 downto 0) <= DA_LOW;

von Igor (Gast)


Lesenswert?

Hi,


genau das hab ich gemeint, vielen vielen Dank!

Wenn ich jetzt den  Dezimalwert 4095 => binär 111111111111 => HEX FFF,
in 2 byte zerlege, dann kriegt für das hi_byte den wert 0F und das low 
byte den wert FF? => (0FFF) und wenn es unter 8 bit ist, dann ist das hi 
byte immer 00 ?



Gruß

von Iulius (Gast)


Lesenswert?

Nein, du bekommst exakt x"FFF" und nicht x"0FFF" und ein high"byte" gibt 
es bei 12 bit nicht.

Für letzteres müsstest du volle 16 Bit benutzen.

Das würde dann z.b. so aussehen :

DATAOUT <= "0000" & DA_High(3 downto 0) & DA_LOW;


Allerdings ist mir immer noch unklar was du nun eigentlich willst : 12 
oder 16 bit.

Dein code ist ausgerichtet auf 16, aber du schreibst ständig von 12...

von Igor (Gast)


Lesenswert?

Oh, ich will nur 12 bit haben. Vom Flash kommen 8 bit, also muss ich 2 
mal auslesen! Und die daten  im Flash müssen gesplitet sein.


Aber das verwirrt mich halt, meine daten aus den flash sind nur 12 bit, 
da ich aber 2 mal auslesen muss komme ich ja auf 16 bit... :) jetzt 
verplannt es mich selber!


Ich wusste halt nicht wass ich mit den 4 bits vom HI_Byte machen soll 
die ich nicht brauche....?

Also was müsst ich jetzt ändern?

Gruß

von Iulius (Gast)


Lesenswert?

Du solltest dir erstmal im Klaren darüber sein wie du speicherst.

Möglichkeit 1 (einfach und verschwenderisch) :

Du speicherst 2 8 byte werte und verwendest davon nur die unteren 12 
Bit. D.h. 4 bit vom auslesen werden immer weggeworfen.

Hier wäre es sinnvoll 2 * 6 bit zu verwenden und z.b. immer die oberen 2 
bit weg zu werfen.

Dann musst du nicht 2 unterschiedliche schaltungen für high und lowbyte 
aufbauen wie du es bisher tust.


Möglichkeit 2(nicht viel schwerer + schneller + sparsamer) :

du nutzt den vollen Speicherbereich aus und die oberen 4 bit sind 
praktisch shcon die unteren 4 bit des nächsten 12 Bit wertes.

D.h. du müsstest nur 3 mal lesen um 2 12 Bit Werte zu bekommen.



Hier kommts eben drauf an was du willst : für einen ersten Versuch 
reicht Methode 1 sicher auch und dein Aufbau warscheinlich auch.

Ist also nur ein Tipp wie ich es machen würde.


In jedem Fall sollte aber dein Dataout nur 12 bit breit sein (11 downto 
0) wenn du nur 12 bit haben möchtest.


Und beachten musst du natürlich auch wie du die Daten im Flash 
speicherst, das muss ja genauso passieren wie du auslesen willst später.

von Igor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielen Dank für die Ratschläge. Ich habe es nach der ersten Methode 
gemacht und wollte jetzt mal ein Zahlenbeispiel geben und wollte mal 
fragen ob es so passt und ob der vhdl code dazu passt.

Ich habe die Zahl 4095 => in hexadezimal 0FFF. Ich habe dann das erste 
byte in 0F und das zweite byte FF in der mcs datei geschrieben. Und mein 
zustandsautomat funktioniert so:


Grundzustand =>
=> Vorbereiten (Hier wird Addresse angelegt) =>
=> Warten =>
=> Lesen_HI (Hier wird das erste Byte gelesen was ja den 0F wert hat)
=> Anlegen_low (Nächste Addresse wird angelegt)
=> Lesen_low(Hier wird das zweite byte gelesen was ja den FF Wert hat 
und ich gebe hier die daten Aus)
=> Anlegen_HI => (Nächst Addresse anlegen) Lesen_HI (Hier wieder zurück 
ans LesenHI)


--------
Nach den Ratschlag Simulieren zu sollen, hab ich mir Modelsim instaliert 
und lese mir ein Tutorail durch. Ich komme aber nicht so ganz zu recht. 
Ich habe eine Testbench erstellt, und auch ins Modelsim geladen, aber es 
wird nicht so simuliert wie ich es programmiert habe. Ich habe mal ein 
Bild angehängt. Muss ich noch was beachten, oder gibt es ein 
verständlichers Tutorial als das von Xilinx??

Hier jetzt mal der vhdl code
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    17:15:57 12/21/2009 
6
-- Design Name: 
7
-- Module Name:    FLASH_CONTROLLER - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.STD_LOGIC_ARITH.ALL;
23
use IEEE.STD_LOGIC_UNSIGNED.ALL;
24
25
---- Uncomment the following library declaration if instantiating
26
---- any Xilinx primitives in this code.
27
--library UNISIM;
28
--use UNISIM.VComponents.all;
29
30
entity FLASH_CONTROLLER is
31
    Port (   FLASH_RESET    : in  STD_LOGIC;
32
          FLASH_CLK     : in  STD_LOGIC;
33
          FLASH_ADD    : out   std_logic_vector (23 downto 0);
34
          FLASH_RP      : out  std_logic; 
35
          FLASH_CE      : out std_logic;                 -- CHIP ENABLE
36
          FLASH_OE      : out std_logic;                  -- OUT ENABLE
37
          FLASH_DATA    : in STD_LOGIC_vector (7 downto 0);
38
          DATAOUT      : out std_logic_vector (11 downto 0));
39
end FLASH_CONTROLLER;
40
41
architecture Behavioral of FLASH_CONTROLLER is
42
---------------------------------------------
43
44
Signal CE,OE,RP                 : std_logic;
45
Signal ADD                    : std_logic_vector(23 downto 0);
46
Signal DATA_ENABLE_HI,DATA_ENABLE_LOW  : std_logic;
47
Signal DA_HI                  : std_logic_vector(7 downto 0);
48
Signal DA_LOW                  : std_logic_vector (7 downto 0);
49
Signal BYTE_SCHREIBEN            : std_logic;
50
Signal ADD_ENABLE,ADD_VOLL          : std_logic;
51
-------------------------------- ZUSTANDSAUTOMAT ----------------------------------------------
52
type STATE_TYPE is (Grundzustand,Vorbereiten,Warten,Lesen_HI,Lesen_LOW,Anlegen_LOW,Anlegen_HI); 
53
Signal naechster_zustand: STATE_TYPE;
54
Signal aktueller_zustand: STATE_TYPE:=Grundzustand;
55
56
-----------------------------------------------------------------------------------------------
57
begin
58
59
  --------------- ENABLE SIGNALE--------------
60
            
61
  ---------------------------------------------
62
63
  ZUSTAND_WEITERGEBEN:process (FLASH_CLK)
64
    begin
65
      if FLASH_RESET = '1' then
66
        aktueller_zustand<=Grundzustand;
67
      elsif rising_edge(Flash_CLK) then
68
        aktueller_zustand <= naechster_zustand;
69
      end if;
70
  end process ZUSTAND_WEITERGEBEN;  
71
  ---------------------------------------------
72
  
73
  Zustandsautomat:process (aktueller_zustand,ADD_VOLL) 
74
  begin
75
  case aktueller_zustand is
76
    
77
    when Grundzustand =>    ADD_ENABLE       <= '0'; 
78
                    BYTE_SCHREIBEN    <= '0';
79
                    DATA_ENABLE_HI    <= '0';
80
                    DATA_ENABLE_LOW  <= '0';
81
                    CE            <=  '1';
82
                    OE            <=  '1';
83
                    RP            <=  '1';
84
                    naechster_zustand <= Vorbereiten;
85
        
86
    when Vorbereiten   =>   ADD_ENABLE       <= '1'; 
87
                    BYTE_SCHREIBEN    <= '0';
88
                    DATA_ENABLE_HI    <= '0';
89
                    DATA_ENABLE_LOW  <= '0';
90
                    CE            <=  '0';
91
                    OE            <=  '0';
92
                    RP            <=  '1';
93
                    naechster_zustand <= Warten;
94
    
95
    when Warten      =>    ADD_ENABLE       <= '0'; 
96
                    BYTE_SCHREIBEN    <= '0';
97
                    DATA_ENABLE_HI    <= '0';
98
                    DATA_ENABLE_LOW  <= '0';
99
                    CE            <=  '0';
100
                    OE            <=  '0';
101
                    RP            <=  '1';
102
                    naechster_zustand <= Lesen_HI;
103
    
104
    
105
    when Lesen_HI      =>  ADD_ENABLE       <= '0'; 
106
                    BYTE_SCHREIBEN    <= '0';
107
                    DATA_ENABLE_HI    <= '1';
108
                    DATA_ENABLE_LOW  <= '0';
109
                    CE            <=  '0';
110
                    OE            <=  '0';
111
                    RP            <=  '1';
112
                    naechster_zustand <= Anlegen_LOW;
113
      
114
    when Anlegen_LOW    =>  ADD_ENABLE       <= '1'; 
115
                    BYTE_SCHREIBEN    <= '0';
116
                    DATA_ENABLE_HI    <= '0';
117
                    DATA_ENABLE_LOW  <= '0';
118
                    CE            <=  '0';
119
                    OE            <=  '0';
120
                    RP            <=  '1';          
121
                    if ADD_VOLL = '1'  then
122
                    naechster_zustand <= Grundzustand;  
123
                    else
124
                    naechster_zustand <= Lesen_LOW;
125
                    end if;
126
    
127
    when Lesen_LOW      =>  ADD_ENABLE       <= '0'; 
128
                    BYTE_SCHREIBEN    <= '1';
129
                    DATA_ENABLE_HI    <= '0';
130
                    DATA_ENABLE_LOW  <= '1';
131
                    CE            <=  '0';
132
                    OE            <=  '0';
133
                    RP            <=  '1';
134
                    naechster_zustand <= Anlegen_HI;
135
    
136
    when Anlegen_HI    =>  ADD_ENABLE       <= '1'; 
137
                    BYTE_SCHREIBEN    <= '0';
138
                    DATA_ENABLE_HI    <= '0';
139
                    DATA_ENABLE_LOW  <= '0';
140
                    CE            <=  '0';
141
                    OE            <=  '0';
142
                    RP            <=  '1';          
143
                    if ADD_VOLL = '1'  then
144
                    naechster_zustand <= Grundzustand;  
145
                    else
146
                    naechster_zustand <= Lesen_HI;
147
                    end if;
148
    
149
    
150
    end case;
151
  end process Zustandsautomat;
152
  -------------------------------------------------  
153
  FLASH_ADDRESSEN_AUSLESEN: process (FLASH_CLK)
154
  begin
155
    if falling_edge(FLASH_CLK) then
156
      if ADD = "000000000000000000011111" then
157
        ADD_VOLL<='1';
158
        ADD<= "000000000000000000000000";
159
      elsif ADD_ENABLE = '1' then
160
        ADD<=ADD+1;
161
      else
162
        ADD_VOLL<= '0';
163
        ADD<=ADD;
164
      end if;
165
    end if;
166
  end process FLASH_ADDRESSEN_AUSLESEN;
167
  -------------------------------------------------
168
  FLASH_DATEN_EINLESEN_HI_BITS: process (FLASH_CLK)
169
  begin
170
    if rising_edge(FLASH_CLK) then
171
      if DATA_ENABLE_HI = '1' then
172
        DA_HI<=FLASH_DATA;
173
      else
174
        DA_HI<=DA_HI;
175
      end if;
176
    end if;
177
  end process FLASH_DATEN_EINLESEN_HI_BITS;
178
  -------------------------------------------------
179
  FLASH_DATEN_EINLESEN_LOW_BITS: process (FLASH_CLK)
180
  begin
181
    if rising_edge(FLASH_CLK) then
182
      if DATA_ENABLE_LOW = '1' then
183
        DA_LOW<=FLASH_DATA;
184
      else
185
        DA_LOW<=DA_LOW;
186
      end if;
187
    end if;
188
  end process FLASH_DATEN_EINLESEN_LOW_BITS;
189
  -------------------------------------------------
190
  BYTE_ZUSAMENSETZEN: process (FLASH_CLK)
191
  begin
192
    if falling_edge (FLASH_CLK) then
193
      if BYTE_SCHREIBEN  = '1' then
194
        DATAOUT <= DA_HI(3 downto 0) & DA_LOW; 
195
      end if;
196
    
197
    end if;
198
  end process BYTE_ZUSAMENSETZEN;
199
  
200
  
201
  
202
  
203
  -------------------------------------------------
204
  --DATAOUT  <=  DA;
205
  FLASH_RP <= RP;
206
  FLASH_CE  <= CE;
207
  FLASH_OE  <= OE;
208
  FLASH_ADD <=ADD;
209
  -------------------------------------------------
210
end Behavioral;



Danke Gruß

von Christian R. (supachris)


Lesenswert?

Gib mal noch die Testbench dazu, da schau ich mal. Prinzipiell simuliert 
Modelsim das, was du beschrieben hast.

von Igor (Gast)


Angehängte Dateien:

Lesenswert?

Ah ok, hier mal die Bench! Danke

von Christian R. (supachris)


Lesenswert?

Ja, das Hauptprobelm ist, dass ADD keinen definierten Anfangszustand hat 
und du außerdem den Reset aus der Testbench heraus gar nicht bedienst. 
Wenn du das beides nachrüstet, läuft die Simulation.

von Igor (Gast)


Lesenswert?

Hi,

also vielen Dank werd es gleich machen!

>Reset aus der Testbench heraus gar nicht bedienst.

Wie ist das gemeint? Ich muss den Wert für reset im modelsim eingeben?




Gruß

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Nein. Die Testbench stellt die äußere "Beschaltung" deines Moduls oder 
gesamten Designs dar. Alle externen Signale, die in das Modul herin 
gehen, musst du irgendwie bedienen. Wenn du alles verifizieren willst, 
müsstest du auch noch ein simples Modell für den Flash beschrieben, also 
dessen Funktion in VHDL nachbilden. Für den einfachsten Fall reicht es 
bei dir hier sicherlich das Reset mal kurz auf 1 gehen zu lassen, um 
alles zu intialisieren.

von Igor (Gast)


Lesenswert?

Also so ganz hat das noch nicht funktioniert, ich wollte z.B alle Enable 
Signale aus dem Zustandsautomat simulieren, da zeigt er mir nichts an 
bzw. no data? Das Clocksignal hat ne größere Periode als im Vhdl. Ich 
dachte er erkennt was ich programiert habe und simuliert es nach.. oder?

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Er simuliert das, was du vorgibst. Das CLK Signal wird ja in der 
Testbench erzeugt und hatte dort bei deinem File 1µs Periodendauer. Bei 
mir klappte die Simulation, der Adress-Zähler zählt hoch und wird dann 
irgendwann zurück gesetzt. Wenn etwas nicht wie erwartet geht, kannst du 
anhand der Simulation herausfinden, was schief läuft. Bei No Data kann 
es sein, dass du die Simulation noch mal neu starten musst. Benutze mal 
das .do File im Anhang, das kannst du in Modelsim direkt starten. Es 
startet die Simulation, zeigt alle Signale an und lässt die Simulation 
einige zeit laufen. Das File kannst din Modelsim zum Projekt hinzufügen 
und dann mit Execute ausführen.

von Igor (Gast)


Lesenswert?

Hi,

ja das mit der Addresse klappt auch, ich wollte nur auch alle anderen 
Signale mal anschauen. Ich hab es umgebaut um die daten schneller aus 
den falsh zu kriegen und hab das ganze jetzt mit 40 Mhz betrieben was ja 
einer Periodendauer von 25 ns wäre. Wie der auf 1 us kommt ist mir 
schleierhaft. naja ich teste mal weiter, danke für deine Mühe :)

von Christian R. (supachris)


Lesenswert?

Durch diese Definition in der Testbench ist die Periodendauer 
festgelegt:
1
-- Clock period definitions
2
   constant FLASH_CLK_period : time := 1us;

Das musst du halt anpassen. Dem Simulator ist das völlig egal, welche 
Periodendauer du angibst...der simuliert ja erst mal nur Logik.

von Igor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

so jetzt hab ich mal die Signale die ich wollte. 2 Fragen,

wieso wird alle data signale nicht weiter geändert?

Wie kann man den Abstand der  weißen senkrechten Striche in Modelsim 
verkleinern, das sie auf die Flanken passen?



Gruß


Igor

von Christian R. (supachris)


Lesenswert?

Igor schrieb:

> wieso wird alle data signale nicht weiter geändert?

Weil du ja vom Flash keine Daten lieferst. Du müsstest den Flash in der 
Testbench so nachbilden, dass er bei unterschiedlichen Adressen 
unterschiedliche Daten liefert am Ausgang.

> Wie kann man den Abstand der  weißen senkrechten Striche in Modelsim
> verkleinern, das sie auf die Flanken passen?

Die sind durch den Zoom-Faktor so vorgegeben. Vielleicht kannst du mit 
Cursorn arbeiten um die Flankenbeziehungen zu sehen. Du kannst beliebig 
viele davon einfügen.

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.