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


von Hans-Werner (Gast)


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 ?
1
case load_key_state is
2
  when zero => -- Vorgang nicht abgeschlossen
3
    done <= '0';
4
    -- Schreiberlaubnis erteilen
5
    write_enable_key <= '1';            -- Adresse und Daten zuweisen
6
    address_key <= (others => '0');
7
    data_in_key <= key_in;
8
    load_key_state <= one;
9
          
10
  when one =>     if unsigned(address_key) < 255
11
    then
12
      -- Adresse inkrementieren
13
      address_key <= std_logic_vector(unsigned(address_key) + 1);
14
      -- Daten zuweisen
15
      data_in_key <= key_in;
16
    else
17
      -- Schreiberlaubnis entziehen
18
      write_enable_key <= '0';
19
      -- Vorgang abgeschlossen
20
      done <= '1';
21
      -- Ende
22
      load_key_state <= two;
23
    end if;
24
25
  when two =>  null;
26
end case;

von Jan M. (mueschel)


Lesenswert?

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

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


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?

von Hans-Werner (Gast)


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 ?)
1
key(1 to 30)   <= "This key should be kept secret";
2
inbuf(1 to 43) <= "The quick brown fox jumps over the lazy dog";
3
-- Ergänzung auf 256 Zeichen
4
for i in inbuf'length+1 to 256 loop
5
  inbuf <= inbuf & " ";
6
end loop;
7
-- Ergänzung auf 256 Zeichen
8
for i in key'length+1 to 256 loop
9
  key <= key & " ";
10
end loop;
11
-- Warte auf steigende Taktflanke
12
wait for clock_period/2;
13
-- Start
14
enable <= '1';
15
-- Load Key
16
load_key <= '1';
17
for i in key'range loop      
18
         -- Character in std_logic_vector konvertieren
19
         key_in <= std_logic_vector(to_unsigned(character'pos(key(i)),8));
20
         wait for clock_period;
21
end loop;
22
load_key <= '0';

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


Lesenswert?

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

von Hans-Werner (Gast)


Lesenswert?

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

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


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 ;-)

von Klaus F. (kfalser)


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?

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.