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!