Matthias schrieb:
> Wenn der Compiler welche geben würde, würde ich sie euch weitergeben...
Das ist kein Compilerproblem, sondern ein Logikproblem.
Matthias schrieb:
> Das Verhalten der behav-Simulation kann ich nicht nachvollziehen,
> hier wird zero gesetzt, gleichzeitig ist nxstate = set_clk
> obwohl die elsif (zero = '1') and (nxstate = set_clk) then
> somit eindeutig wahr ist, kann nicht in den nächsten Zustand gesprungen
> werden...
Weil vorher was Anderes abgefragt wird. Nimm einfach mal die Zustände
und durchlauf deinen Code. Du hast offenbar ein Prioritätsproblem bei
deinen if-Abfragen.
1 | if state = set_cs then // Diese Abfrage hat Vorrang!
|
2 | spi_opcode <= x"F550";
|
3 | cs <= '0';
|
4 | time_cnt <= "0101"; --50ns von setzen des Cs bis zum 1. Bit
|
5 | nxstate <= set_clk;
|
6 | count := 0;
|
7 | so <= spi_opcode(count);
|
8 | elsif (zero = '1') and (nxstate = set_clk) then // Diese Aussage wird gar nie abgefragt!
|
9 | state <= nxstate;
|
10 | nxstate <= rst_clk;
|
11 | sck <= '1';
|
12 | count := count + 1;
|
13 | time_cnt <= "0101"; --50ns bis zur fallenden sck-Flankle
|
Ein klassisches Layer 8 Problem... ;-)
Wenn du deinen Code so abänderst, dann konnt der nächste Zustand:
1 | if (zero = '1') and (nxstate = set_clk) then // Diese Aussage ist nie True!
|
2 | state <= nxstate;
|
3 | nxstate <= rst_clk;
|
4 | sck <= '1';
|
5 | count := count + 1;
|
6 | time_cnt <= "0101"; --50ns bis zur fallenden sck-Flankle
|
7 | elsif state = set_cs then
|
8 | spi_opcode <= x"F550";
|
9 | cs <= '0';
|
10 | time_cnt <= "0101"; --50ns von setzen des Cs bis zum 1. Bit
|
11 | nxstate <= set_clk;
|
12 | count := 0;
|
13 | so <= spi_opcode(count);
|
14 | ...
|
Ob dann das restliche Verhalten aber noch passt, steht auf einem anderen
Blatt...
daniel__m schrieb:
> du hast state und nxstate. Wie verhalten dies sich zueinander?
Und einmal wird state und ein andres Mal nxstate abgefragt. Das scheint
mir dubios.