mikrocontroller.net

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


Autor: Cyrex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
entity mem_ctrl is
    port(    clk  : in    std_logic;
        rst  : in    std_logic;
        led  : out   std_logic;
        EN   : in    std_logic; --Enable (from Flash_slow.vhd)
--       ***RS232***
        RDA  : in    std_logic; --Read Data Available
        RST232   : out   std_logic;  --Master Reset 
        RD    : out   std_logic;          --Read RS232
            WR     : out   std_logic;          --Write RS232
            DBIN : in    std_logic_vector (7 downto 0);
--       ***I/O***        
         DBOUT: out   std_logic_vector (15 downto 0);
--       ***Intel Flash***            
            RP   : out   std_logic := '1'; -- Reset Flash 
            DR   : out   std_logic; -- data redy
            addr : out    std_logic_vector (23 downto 1);
            data : inout std_logic_vector (15 downto 0);
        OE   : out   std_logic; -- Output Enable active low
        WE   : out   std_logic; -- Write Enable  active low
        --STS  : out   std_logic; -- Status
        CE   : out   std_logic -- Chip Enable   active low
        );
    end mem_ctrl;

type t_state is (IDLE, wri, wri2, red, red2); 
signal s_state : t_state;         
signal cnt : std_logic_vector (23 downto 1); -- connect to addr   
signal toggle : std_logic; -- switch between high an low word
signal s_led : std_logic; -- to read the output

...
...
...

--*************************************************************
-- State: Reset RS232
--*************************************************************
               when wri =>
                   RD <= '1';
                   s_state <= wri2;
                   OE <= '1';
             WE <= '0';
             CE <= '0';
--*************************************************************
-- State: write to Flash
--*************************************************************
          when wri2=>
             s_led <= '1';
                  WE <= '1';
                  CE <= '0';
                  RD <= '0';
                  if DBIN = "00110001" then --ASCII: 1
                    cnt <= (others => '0');
                    toggle<= '0';
                    OE <= '1';
                    s_state <= red2;
                  --elsif (used later to control the FPGA via RS232
                  elsif DBIN = "00110010" then --ASCII: 2
                    s_state <= IDLE;
                    cnt <= (others => '0');
                    RD   <= '0';
                     WR   <= '0';
                  else
                    if RDA = '1' then 
                s_state <= wri;
                 --RD <= '1';
                if toggle = '0' then
                  data (7 downto 0) <= DBIN;
                  OE <= '1';
                  --WE <= '1';
                  --CE <= '1';
                  toggle <= not toggle;
                else
                  data (15 downto 8) <= DBIN;
                  OE <= '1';
                  --WE <= '1';
                  --CE <= '1';
                  toggle <= not toggle;
                  if cnt = "11111111111111111111111"  then -- End of Memory
                      cnt <= (others => '0');
                  else
                      cnt <= unsigned(cnt) + 1;
                  end if;
                  --RD <= '1';
                 end if;
                else
                s_state <= wri2;
                  end if;
            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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Cyrex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marketing Studentin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Cyrex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Cyrex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
neuerste Codeversion
--*************************************************************
-- State: IDLE
--*************************************************************    
          when IDLE =>
             if    DBIN = "00110000" then --ASCII: 0
                    cnt <= (others => '0');
                    toggle<= '0';
                    s_state <= wri;
                    s_led <= '1';
                    RD   <= '1';
                     WR   <= '1';
                  elsif DBIN = "00110001" then --ASCII: 1
                    cnt <= (others => '0');
                    toggle<= '0';
                    s_state <= red2;
                    RD   <= '1';
                     WR   <= '1';
                  --elsif (used later to control the FPGA via RS232
                  else
                    s_state <= s_state;
                  end if;
--*************************************************************

ist schon x mal umgeschrieben worden deshalb ist der Stil nicht wirklich berauschend (ok, er ist fürchterlich). 

LG
Cyrex

-- State: Reset RS232 
--*************************************************************
               --when wri0 => 
               --    ce <= '0';
               --    s_state <= wri;
               when wri =>
                   RD <= '0';      
                   WE <= '1';
                   CE <= '1';
                   if RDA = '1' then 
                      
                      RD <= '0'; 
                      OE <= '1';
                --################################################################
                if DBIN = "00110001" then --ASCII: 1
                        cnt <= (others => '0');
                        toggle<= '0';
                        OE <= '1';
                        CE <= '0';
                        s_state <= red2;
                      --elsif (used later to control the FPGA via RS232
                      elsif DBIN = "00110010" then --ASCII: 2
                        s_state <= IDLE;
                        cnt <= (others => '0');
                        RD   <= '0';
                         WR   <= '0';
                      else
                      --################################################################
                   if toggle = '0' then
                     data (7 downto 0) <= DBIN;
                     toggle <= not toggle;
                    s_state <= wri3;
                  else
                        data (15 downto 8) <= DBIN;
                     toggle <= not toggle;
                     s_state <= wri2;
                     if cnt = "11111111111111111111111"  then -- End of Memory
                                              cnt <= (others => '0');
                                          else
                                              cnt <= unsigned(cnt) + 1;
                                          end if;
                  end if;
                end if;
             end if;
--*************************************************************
-- State: write to Flash
--*************************************************************
          when wri2=>
             
             s_led <= '1';
            we <= '0';
            CE <= '0';
            --RD <= '1';
            s_state <= wri3;  
          when wri3=>
             RD <= '1';
             s_state <= wri;  
--*************************************************************

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.