Forum: FPGA, VHDL & Co. Nexys II Board mit Intel Flash


von Cyrex (Gast)


Angehängte Dateien:

Lesenswert?

Liebe Kollegen!

Ich würde gerne Daten in den Intel Flash (siehe Anhang) von der RS232 
schreiben und auf Knopfdruck wieder ausgeben. Leider scheitere ich immer 
wieder am schreiben. Das Lesen funktioniert.

Egal was ich eingebe, es kommt nicht an.

Für den Code schäme ich mich etwas, er ist nicht (mehr) sehr schön. Ich 
bastel schon länger dran rum und er wird immer fürchterlicher. 
Herrichten uns auskommentieren wollte ich ihn erst wenn das Ding läuft.

Hier der nicht funktionierende Teil.

Ich habe eine Einheit davorgehängt, die mit 1/8 des Takts (50MHz) ein 
Enable Signal gibt (nur eine Taktlänge lang). Das Timins sollte also 
passen.
1
entity mem_ctrl is
2
    port(    clk  : in    std_logic;
3
        rst  : in    std_logic;
4
        led  : out   std_logic;
5
        EN   : in    std_logic; --Enable (from Flash_slow.vhd)
6
--       ***RS232***
7
        RDA  : in    std_logic; --Read Data Available
8
        RST232   : out   std_logic;  --Master Reset 
9
        RD    : out   std_logic;          --Read RS232
10
            WR     : out   std_logic;          --Write RS232
11
            DBIN : in    std_logic_vector (7 downto 0);
12
--       ***I/O***        
13
         DBOUT: out   std_logic_vector (15 downto 0);
14
--       ***Intel Flash***            
15
            RP   : out   std_logic := '1'; -- Reset Flash 
16
            DR   : out   std_logic; -- data redy
17
            addr : out    std_logic_vector (23 downto 1);
18
            data : inout std_logic_vector (15 downto 0);
19
        OE   : out   std_logic; -- Output Enable active low
20
        WE   : out   std_logic; -- Write Enable  active low
21
        --STS  : out   std_logic; -- Status
22
        CE   : out   std_logic -- Chip Enable   active low
23
        );
24
    end mem_ctrl;
25
26
type t_state is (IDLE, wri, wri2, red, red2); 
27
signal s_state : t_state;         
28
signal cnt : std_logic_vector (23 downto 1); -- connect to addr   
29
signal toggle : std_logic; -- switch between high an low word
30
signal s_led : std_logic; -- to read the output
31
32
...
33
...
34
...
35
36
--*************************************************************
37
-- State: Reset RS232
38
--*************************************************************
39
               when wri =>
40
                   RD <= '1';
41
                   s_state <= wri2;
42
                   OE <= '1';
43
             WE <= '0';
44
             CE <= '0';
45
--*************************************************************
46
-- State: write to Flash
47
--*************************************************************
48
          when wri2=>
49
             s_led <= '1';
50
                  WE <= '1';
51
                  CE <= '0';
52
                  RD <= '0';
53
                  if DBIN = "00110001" then --ASCII: 1
54
                    cnt <= (others => '0');
55
                    toggle<= '0';
56
                    OE <= '1';
57
                    s_state <= red2;
58
                  --elsif (used later to control the FPGA via RS232
59
                  elsif DBIN = "00110010" then --ASCII: 2
60
                    s_state <= IDLE;
61
                    cnt <= (others => '0');
62
                    RD   <= '0';
63
                     WR   <= '0';
64
                  else
65
                    if RDA = '1' then 
66
                s_state <= wri;
67
                 --RD <= '1';
68
                if toggle = '0' then
69
                  data (7 downto 0) <= DBIN;
70
                  OE <= '1';
71
                  --WE <= '1';
72
                  --CE <= '1';
73
                  toggle <= not toggle;
74
                else
75
                  data (15 downto 8) <= DBIN;
76
                  OE <= '1';
77
                  --WE <= '1';
78
                  --CE <= '1';
79
                  toggle <= not toggle;
80
                  if cnt = "11111111111111111111111"  then -- End of Memory
81
                      cnt <= (others => '0');
82
                  else
83
                      cnt <= unsigned(cnt) + 1;
84
                  end if;
85
                  --RD <= '1';
86
                 end if;
87
                else
88
                s_state <= wri2;
89
                  end if;
90
            end if;

Vielleicht kann mir jemand einen Tip geben oder eine Idee was ich 
probieren sollte.

Wenn ich nicht auf RDA von der RS232 warte kann ich reinschreiben.

DANKE
CYREX

P.S.: Nexys II mit Spartan 3E (1200K)

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


Lesenswert?

> Wenn ich nicht auf RDA von der RS232 warte kann ich reinschreiben.
Dann solltest du mal kontrollieren, ob irgendwelche Zeiten 
(Write-Timeout) verletzt werden, während du auf RDA wartest.

Das tut zwar nichts zur Sache, aber das hier
>>>> if DBIN = "00110001" then
könntest du so schreiben:
>>>> if DBIN = X"31" then
Dann findet man das leichter in der ASCII-Tabelle.
Oder du könntest so schreiben:
>>>> if DBIN = std_logic_vector(to_unsigend(character'pos('1'),8)) then
Dann steht die ASCII-'1' im Klartext da.
Und wenn du die Konvertierung in ein Package steckst, dann wird das 
sogar leserlich ;-)

von Cyrex (Gast)


Lesenswert?

Stimmt, das sollte ich lesbarer machen.

Ich habe die erste Stelle vom Counter (Adressen vom Speicher) an eine 
Led geschaltet. Sollte also alle 2 Tastendrücke toggeln. Das tut sie 
auch. Das heisst die RS232 sendet brav und RDA arbeitet. Wenn ich das 
ganze unterbrechen möchte (durch drücken von 0 oder 2) geht es auch.

Ich werde auf jeden Fall die Error Flags anzeigen lassen (ev. über die 
RS oder ich schalte Leds ein wenn das Signal einmal auf 1 war).

Danke auf jeden Fall.

von Marketing Studentin (Gast)


Lesenswert?

Ich habe den 2. Speicherbaustein (Micron) ausprobiert und komme zu dem 
selben Ergebnis. Entweder ich mache jedes mal den selben Timingfehler 
oder es liegt doch an der RS232.

Hat jemand ev. noch einen Tip?

von Cyrex (Gast)


Lesenswert?

Ich hab mir das Timing noch mal angesehen. Da sollte alles passen.
Interessant ist, dass ich mit fixer Adressierung (immer die selbe 
Adresse) reinschreiben kann. Nur wenn ich den Speicher vollschreiben 
will geht es nicht.

Vielleicht hat doch jemand einen Tip?

LG
Cyrex

von Cyrex (Gast)


Angehängte Dateien:

Lesenswert?

neuerste Codeversion
1
--*************************************************************
2
-- State: IDLE
3
--*************************************************************    
4
          when IDLE =>
5
             if    DBIN = "00110000" then --ASCII: 0
6
                    cnt <= (others => '0');
7
                    toggle<= '0';
8
                    s_state <= wri;
9
                    s_led <= '1';
10
                    RD   <= '1';
11
                     WR   <= '1';
12
                  elsif DBIN = "00110001" then --ASCII: 1
13
                    cnt <= (others => '0');
14
                    toggle<= '0';
15
                    s_state <= red2;
16
                    RD   <= '1';
17
                     WR   <= '1';
18
                  --elsif (used later to control the FPGA via RS232
19
                  else
20
                    s_state <= s_state;
21
                  end if;
22
--*************************************************************
23
24
ist schon x mal umgeschrieben worden deshalb ist der Stil nicht wirklich berauschend (ok, er ist fürchterlich). 
25
26
LG
27
Cyrex
28
29
-- State: Reset RS232 
30
--*************************************************************
31
               --when wri0 => 
32
               --    ce <= '0';
33
               --    s_state <= wri;
34
               when wri =>
35
                   RD <= '0';      
36
                   WE <= '1';
37
                   CE <= '1';
38
                   if RDA = '1' then 
39
                      
40
                      RD <= '0'; 
41
                      OE <= '1';
42
                --################################################################
43
                if DBIN = "00110001" then --ASCII: 1
44
                        cnt <= (others => '0');
45
                        toggle<= '0';
46
                        OE <= '1';
47
                        CE <= '0';
48
                        s_state <= red2;
49
                      --elsif (used later to control the FPGA via RS232
50
                      elsif DBIN = "00110010" then --ASCII: 2
51
                        s_state <= IDLE;
52
                        cnt <= (others => '0');
53
                        RD   <= '0';
54
                         WR   <= '0';
55
                      else
56
                      --################################################################
57
                   if toggle = '0' then
58
                     data (7 downto 0) <= DBIN;
59
                     toggle <= not toggle;
60
                    s_state <= wri3;
61
                  else
62
                        data (15 downto 8) <= DBIN;
63
                     toggle <= not toggle;
64
                     s_state <= wri2;
65
                     if cnt = "11111111111111111111111"  then -- End of Memory
66
                                              cnt <= (others => '0');
67
                                          else
68
                                              cnt <= unsigned(cnt) + 1;
69
                                          end if;
70
                  end if;
71
                end if;
72
             end if;
73
--*************************************************************
74
-- State: write to Flash
75
--*************************************************************
76
          when wri2=>
77
             
78
             s_led <= '1';
79
            we <= '0';
80
            CE <= '0';
81
            --RD <= '1';
82
            s_state <= wri3;  
83
          when wri3=>
84
             RD <= '1';
85
             s_state <= wri;  
86
--*************************************************************

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.