Forum: FPGA, VHDL & Co. VHDL for loop simulation /= synthese


von halp (Gast)


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!

von halp (Gast)


Lesenswert?

ARGH!
PEBKAC: Hatte das Terminalprogramm mit dem ich die Werte gesendet hab 
auf ASCII statt Hex.
Jetzt gehts sigh

von Hans-werner M. (hanswerner)


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.

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


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?

von Edi M. (Gast)


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! :-)

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.