Hallo zusammen,
Ich möchte eine kleine FSM bauen, welche einen MCP23S17 mit
ausgabewerten beschreibt...
Nun habe ich in der Simulation ein nicht nachvollziehbares Verhalten...
hier die FSM:
1
ifstate=set_csthen
2
spi_opcode<=x"F550";
3
cs<='0';
4
time_cnt<="0101";--50ns von setzen des Cs bis zum 1. Bit
few schrieb:> Hab mir den Code nicht angeguckt, es heißt aber else if und nicht> elseif.
Nein, es heißt elsif...
Sebastian S. schrieb:>>Welchen sehr grundlegenden Fehler mache ich?> Uns Prosa schicken und die Fehlermeldungen, die der Compiler> unzweifelhaft ausgibt, unterschlägst.
Wenn der Compiler welche geben würde, würde ich sie euch weitergeben...
In deiner Wave ist an der Position der Markierung state gleich set_cs
somit ist folgendes wahr
if state = set_cs then --ist wahr
-- das hier wird gemacht
elsif .... -- das hier mag auch wahr sein, wird aber nicht ausgewertet,
weil das im else Fall ist (elsif = else if)
Matthias schrieb:> Welchen sehr grundlegenden Fehler mache ich?
wenn state erst mal = set_cs ist, wie soll sich das jemals ändern?
Im gezeigten Code jedenfalls nicht.
Matthias schrieb:> if state = set_cs then> spi_opcode <= x"F550";> cs <= '0';> time_cnt <= "0101"; --50ns von setzen des Cs bis> zum 1. Bit> nxstate <= set_clk;> count := 0;> so <= spi_opcode(count);> elsif (zero = '1') and (nxstate = set_clk) then //Diese> Aussage ist nie True!
hi,
du hast state und nxstate. Wie verhalten dies sich zueinander? Soll das
die typische 2 Process-FSM sein? Wie/wo ist der Takt?
Sprich, der Code ist nicht vollständig und zeigt dein Problem nicht.
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
ifstate=set_csthen//DieseAbfragehatVorrang!
2
spi_opcode<=x"F550";
3
cs<='0';
4
time_cnt<="0101";--50ns von setzen des Cs bis zum 1. Bit
time_cnt<="0101";--50ns bis zur fallenden sck-Flankle
7
elsifstate=set_csthen
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.
user schrieb:> In deiner Wave ist an der Position der Markierung state gleich set_cs>> somit ist folgendes wahr> if state = set_cs then --ist wahr> -- das hier wird gemacht> elsif .... -- das hier mag auch wahr sein, wird aber nicht ausgewertet,> weil das im else Fall ist (elsif = else if)
Vielen Dank, genau dass war der Fehler, so funktioniert es nun :)
Lothar M. schrieb:> 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.
Ihr habt Recht, das war nicht korrekt/sinvoll...
Vielen Dank auch für alle Anderen Antworten :)
Übrigens der MCP23S17 läuft mit 50MHz SPI-Takt auch wenn
laut Datenblatt nur 10MHZ drin sind...
Bei 60MHz macht er nicht mehr mit..