Schleifen in Zustandsmaschinen die Zweite

Gast #1117515
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;
Gast #1117716
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';

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren