www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Schleifen in Zustandsmaschinen die Zweite


Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich steh immer noch auf dem Schlauch, wahrscheinlich sind es mehrere.
Mein ursprüngliches Problem aus dem vorherigen Posting ist immer noch 
nicht gelöst (Dieses mal ohne unnötige Casts).Laut Simulation wird 
address_key von 0 auf 255 inkrementiert.
Der then-Zweig der If-Abfrage wird ausgeführt, der else-Zweig 
anscheinend nicht. Der Zustand "two" wird nicht erreicht. (Ja, da soll 
null stehen). Das die Zuweisung bei Signalen um einen Takt verzögert 
erfolgt und nach 255, bei 8-Bit, wieder 0 folgt sollte keine Rolle 
spielen. Also wo ist der "Denk"-Fehler ?
case load_key_state is
  when zero => -- Vorgang nicht abgeschlossen
    done <= '0';
    -- Schreiberlaubnis erteilen
    write_enable_key <= '1';            -- Adresse und Daten zuweisen
    address_key <= (others => '0');
    data_in_key <= key_in;
    load_key_state <= one;
          
  when one =>     if unsigned(address_key) < 255
    then
      -- Adresse inkrementieren
      address_key <= std_logic_vector(unsigned(address_key) + 1);
      -- Daten zuweisen
      data_in_key <= key_in;
    else
      -- Schreiberlaubnis entziehen
      write_enable_key <= '0';
      -- Vorgang abgeschlossen
      done <= '1';
      -- Ende
      load_key_state <= two;
    end if;

  when two =>  null;
end case;

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist address_key definiert? 8 Bit breit? Dann kann es nie groesser 
als 255 werden.

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

Bewertung
0 lesenswert
nicht lesenswert
> Dann kann es nie groesser als 255 werden.
>> if unsigned(address_key) < 255
Aber gleich, und das müsste reichen ;-)

> Laut Simulation wird address_key von 0 auf 255 inkrementiert.
Ist das einen Takt lang 255?

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An lkmiller

Nein, das Signal verbleibt auf dem Wert 255.
Wie schon angemerkt, grösser als 255 wird es natürlich nicht.
Es wird von der Testbench ein String in ein RAM geschrieben.
Bei jedem Takt ein Character (Konvertiert in std_logic_vector).
Nachfolgend ein kurzer Ausschnitt aus der Testbench.
Strings beginnen mit dem Index 1. (Oder nicht ?)
key(1 to 30)   <= "This key should be kept secret";
inbuf(1 to 43) <= "The quick brown fox jumps over the lazy dog";
-- Ergänzung auf 256 Zeichen
for i in inbuf'length+1 to 256 loop
  inbuf <= inbuf & " ";
end loop;
-- Ergänzung auf 256 Zeichen
for i in key'length+1 to 256 loop
  key <= key & " ";
end loop;
-- Warte auf steigende Taktflanke
wait for clock_period/2;
-- Start
enable <= '1';
-- Load Key
load_key <= '1';
for i in key'range loop      
         -- Character in std_logic_vector konvertieren
         key_in <= std_logic_vector(to_unsigned(character'pos(key(i)),8));
         wait for clock_period;
end loop;
load_key <= '0';

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

Bewertung
0 lesenswert
nicht lesenswert
> Der Zustand "two" wird nicht erreicht.
Woran siehst du das?
   if unsigned(address_key) < 255
Das funktioniert, ich habe es gerade mal als Zähler ausprobiert.

Autor: Hans-Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, man sieht das halt in der Simulation.
Man kann dort einzelne Signale betrachten.
Der Zustand ist auch ein Signal.
Komische Frage.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans-Werner wrote:
> Na ja, man sieht das halt in der Simulation.
Gut.
> Man kann dort einzelne Signale betrachten.
> Der Zustand ist auch ein Signal.
Mach doch mal einen Screenshot von der Simulation.
Vielleicht sieht man da mehr...

> Komische Frage.
Nein, du glaubst nicht, wie manche Leute zu manchen Schlüssen kommen ;-)

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert mit "done" und "write_enable_key" ?
Gehen diese auf den gewünschten Wert?
An und für sich schaut das Code-Fragment richtig aus, wie ist one, two, 
und load_key_state definiert?
Werden diese irgendwo anders noch überschrieben?

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.