VHDL for loop simulation /= synthese

Gast #3212883
Lesenswert?

Hallo zusammen,
vielleicht kann mir ja hier jemand erklären, warum mein code nicht das 
tut, was er soll.
1
-- entity ports:
2
cols_i : in  STD_ULOGIC_VECTOR (15 downto 0);
3
rows_io : inout  STD_ULOGIC_VECTOR(7 downto 0);
4

5
-- in der architecture declaration:
6
col_s : std_ulogic_vector(3 downto 0);
7
row_s : std_ulogic_vector(2 downto 0);
8
press_s : std_ulogic := '0';
9

10
-- im architecture body:
11
process(col_s, row_s, cols_i, press_s)
12
 variable rval : std_ulogic;
13
begin
14
  if press_s = '1' then
15
    for row in 0 to 7 loop
16
      rval := 'Z';
17
      for col in 0 to 15 loop
18
        --Test: if col = 4 and row = 2 and cols_i(col) = '0' then
19
        if col = to_integer(unsigned(col_s)) and row = to_integer(unsigned(row_s)) and cols_i(col) = '0' then
20
          rval := '0';
21
        end if;
22
      end loop;
23
      rows_io(row) <= rval;
24
    end loop;
25
  end if;
26
end process;

Was das Ding tun soll: Ein Keyboard nachbilden (bei dem nur eine Taste 
auf einmal gedrückt werden kann).
Am kbd-Controller sind die rows Eingänge mit pullups, die columns sind 
open-drain.
Über col_s und row_s können dann col+row ausgewählt werden, die 
verbunden werden sollen und wenn press_s aktiv ist, dann wird ein low 
von der selektierten Spalte auf die selektierte Reihe weitergegeben.
So weit die Theorie. In der Simulation funktioniert das auch 
einwandfrei, nur mit dem FPGA nicht. Er nimmt scheinbar immer Reihe 0 
(und Spalte 0?), habe das mitm Oszi angeguckt.
col_s und row_s haben die richtigen Werte, die Signale hab ich mir über 
LEDs schon angeguckt.
Wenn ich aber oben die hier auskommentierte Test-if-Zeile mit 
hardgecodeten Werten nehmen funktioniert alles wie gewünscht.

Wo liegt der Fehler?

Danke & viele Grüße!
#3212901
Lesenswert?

Soweit verstanden willst du synthetisieren.
Was passiert mit einer Schleife die als Software sequentiell ausgeführt 
wird wenn diese auf eine Hardware abgebildet wird ?
Die einzelnen Schleifendurchläufe werden parallel ausgeführt.
Würde dein Programm auch dann noch funktionieren wenn alle 
Schleifendurchläufe gleichzeitig parallel ausgeführt werden ?
Wie erzwingt man die sequenzielle Ausführung einer Loop ?
In dem man die Schliefe in eine Zustandsmaschine überführt.
Moderator (Firma: Titel) Persönliche Seite #3213090
Lesenswert?

Mich würde der Rest der Beschreibung interessieren. Immerhin ist hier 
ein massiv paralleler Tastaturdecoder zu sehen. Der könnte in jeden Takt 
einmal die Tastatur scannen. Bist du im Tippen so schnell?

Die überaus extensive Verwendung von Variablen deutet darauf hin, dass 
hier ein Softie (nicht böse gemeint) mit der "Programmiersprache" VHDL 
Hardware "programmieren" will. Hab ich recht?
Gast #3213198
Lesenswert?

Ich glaube in der Tat, er will einen Loop schreiben, der sequenziell die 
Daten prüft und hat einen 2D-Konstrukt aufgezogen.

Sowas sollte aber im ModelSim auffallen, weil da verdächtig viele 
Signale auftauchen! :-)

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