Hallo,
habe ein Problem mit dem Webpack bei einem kleinen Versuch ein LCD
anzusteuern. Ich habe eine FSM implementiert, die auch von Modelsim
ordentlich wir gewünscht simuliert wurde, nur erkennt das Webpack diese
nicht als FSM an, und synthetisiert stattdessen einzelne Register...
Hier mein Codeausschnitt:
1
aktualisierung:process(clk_in)
2
begin
3
ifclk_in'eventandclk_in='0'then
4
ifcs_intern='0'then
5
zustand<=folgezustand;
6
endif;
7
endif;
8
endprocessaktualisierung;
9
10
zustandsermittlung:process(zustand)
11
begin
12
casezustandis
13
when0=>folgezustand<=1;
14
when1=>folgezustand<=2;
15
when2=>folgezustand<=3;
16
when3=>folgezustand<=4;
17
when4=>folgezustand<=5;
18
when5=>folgezustand<=6;
19
when6=>folgezustand<=7;
20
when7=>folgezustand<=8;
21
when8=>folgezustand<=9;
22
when9=>folgezustand<=10;
23
when10=>folgezustand<=11;
24
when11=>folgezustand<=12;
25
when12=>folgezustand<=13;
26
when13=>folgezustand<=14;
27
when14=>folgezustand<=15;
28
when15=>folgezustand<=16;
29
when16=>folgezustand<=17;
30
when17=>folgezustand<=18;
31
when18=>folgezustand<=19;
32
when19=>folgezustand<=20;
33
when20=>folgezustand<=21;
34
when21=>folgezustand<=22;
35
when22=>folgezustand<=23;
36
when23=>folgezustand<=24;
37
when24=>folgezustand<=25;
38
whenothers=>folgezustand<=0;
39
endcase;
40
endprocesszustandsermittlung;
41
42
ausgabe:process(zustand,befehl_intern)
43
begin
44
sid_out<=befehl_intern(zustand-1);
45
if(zustand=0orzustand=25)then
46
sid_out<='0';
47
endif;
48
endprocessausgabe;
folgende Fehlermeldung erscheint, die ich mir nicht erklären kann:
INFO:Xst:1813 - Unable to extract FSM on signal <zustand> : outputs
depend on both state and next state.
Ich weiss was sie heisst, nur sehe ich nicht wo die Ausgabe vom akt.
Zustand und Folgezustand abhängen soll?
Danke schonmal für eure Ratschläge...
Grüße
T.M.
Hi,
ich bin ein blutiger Anfaenger aber koennte da sowas in der richtung
Fehlen?
type state_type is (IDLE, LESE, READY,SCHREIBE,COUNT);
signal next_state, current_state: state_type;
Gruß,
Dirk
Ich habe das Problem gelöst.
In einem weiterem Prozess, der nicht oben mit steht, hatte ich den
Folgezustand mit abgefragt. Und das hat mir die Synthese übel
genommen.
Naja, habs entfernt, nur richtig ging das trotzdem nicht. Bin grad
dabei das Ganze mit nem Zähler zu lösen, hänge nun aber auch fest...
Naja, mal sehen ob nochwas rauskommt heute...
Grüße
T.M.
Hallo T.M.
In was für eine Zielhardware soll das Modell implementiert werden.
Für einen CPLD ist eine Zählerstruktur günstig.
Bei einem FPGA sollte man lieber auf eine Schieberegisterstruktur
zurückgreifen, weil dadurch für die Vergleichsoperationen weniger
Logikelemente benötigt werden.
Aber hier erst einmal der Zähler.
Danke. Werd den Code mal mit einbeziehen in meine Überlegungen. Das
ganze ist dazu gedacht, ein LCD-Display seriell über CS, SCLK und SID
anzusteuern. Dazu werden 24 bits von befehl_intern bei jeder steigenden
Flanke von SCLK eingelesen, wenn CS_intern 0 ist. Ich möchte es aber so
machen, dass ich von aussen nur kurz CS und den Befehl anlege, deshalb
das speichern in die internen Signale. Und diese sollen halt während
die 24 bits eingelesen werden in dem gespeicherten Zustand bleiben. Der
Befehl von aussen liegt als 8bit Vektor vor, der intern in einen 24bit
Vektor gespeichert wird.
Ja, und das im Anhang hab ich gestern Abend noch hinbekommen, mich
stört nur der kurze Spike bei sclk am Ende, kurz bevor cs_intern auch
wieder auf '1' geht...Hat jemand ne Ahnung an was das liegt,
eigentlich müsste der Zähler doch anstandslos zu 0 zurückkehren...
Im Anhang befinden sich Design, Testbench und nen Bild der Simulation.
Grüße
T.M.
>mich stört nur der kurze Spike bei sclk am Ende, kurz bevor cs_intern>auch wieder auf '1' geht...Hat jemand ne Ahnung an was das liegt
Du generierst "sclk_intern" kombinatorisch:
if (cs_intern = '0' and zustand > 0) then
sclk_intern <= clk;
else
sclk_intern <= '1';
end if;
Wenn der Zähler den Wert 24 hat, und "clk" von '1' auf '0'
wechselt,
ist der Ausdruch oben (cs_intern = '0' and zustand > 0) für einen
Simulationszyklus wahr, und "sclk_intern" wird '0'.
Einen Simulationszyklus später werden dann die Zählerflipflops
upgedatet und der Ausdruck ist wieder falsch.
Deshalb der mimimale Spike.
Wenn Du eine Timingsimulation machst, wirst Du feststellen, daß diese
Minimalspike dann eine reelle Länge hat, bei mir z.B. knappe 1,5 ns.
(ich habe die clk-Frequenz in der Testbench auf vernünftige Werte
erniedrigt, 100 ns anstatt 100 ps)
"sclk" rein kombinatorisch zu generieren, ist keine gute Idee.
Mach noch ein Flip-Flop dahinter.