Hallo zusammen,
ich habe hier ein Projekt bei dem ein PIC32 und ein CPLD über SPI
kommunizieren. Das CPLD schaltet je nach Daten die vom PIC kommen
bestimmte Eingänge auf Ausgänge.
Jedoch habe ich nun folgendes Problem.
PIC sendet 0x0001 (MSB 0000 0000 0000 0001 LSB)
Diese werden wie folgt in einen logic vector gespeichert:
1 | architecture FOO_beh of FOO is
|
2 |
|
3 | signal SpiReg : std_logic_vector (15 downto 0):=(others=>'0');
|
4 | signal bar0 : std_logic_vector (1 downto 0):=(others=>'0');
|
5 |
|
6 | p40: process (SpiClk)
|
7 | begin
|
8 | if rising_edge (SpiClk) then
|
9 | if nSpiCs='0' then
|
10 | SpiReg(15 downto 1)<=SpiReg(14 downto 0);
|
11 | SpiReg(0)<=MOSI;
|
12 |
|
13 | end if;
|
14 | end if;
|
15 | end process p40;
|
Dann sollen je nachdem was für Daten gesendet wurden ein Eingang auf
einen Ausgang gesetzt werden:
1 | bar0<=SpiReg (1 downto 0);
|
2 |
|
3 | pBAR0: process (bar0, fooIn0, fooIn1, fooIn2, fooIn3)
|
4 | begin
|
5 | case bar0 is
|
6 | when "00" => foo0Out<=fooIn0;
|
7 | when "01" => foo0Out<=fooIn1;
|
8 | when "10" => foo0Out<=fooIn2;
|
9 | when "11" => foo0Out<=fooIn3;
|
10 | when others => foo0Out<='0';
|
11 | end case;
|
12 | end process pBAR0;
|
Bei 0x0001 (MSB 0000 0000 0000 0001 LSB), würden ich jetzt erwarten das
der Ausgang fooIn1 auf foo0Out geschalten wird. Jedoch ist dies nicht
so, sondern es wird auf fooIn2 geschalten.
Sende ich nun ein 0x0002 (MSB 0000 0000 0000 0010 LSB), ist es genau
umgekehrt und der Ausgang wird auf fooIn1 geschaltet, so wie ich es bei
0x0001 erwartet hätte.
Aber wo ist hier der Fehler? Es scheint ja die Endianness zu sein. Aber
wo werden die 2 Bits vertauscht?
Der Quelltext wurde nur auf das nötigste beschränkt um es zu
vereinfachen.
Ich danke für jeden Hinweis oder jede Aufklärung :)
LG
mvollmer