Hallo,
Ich bräuchte mal etwas Hilfe zur "best practice". Ich habe eine H-Brücke
an einen CPLD angeschlossen, den ich in VHDL programmiere.
Mein VHDL-Modul hat nun die folgende Portdefinition:
1
entityBridgeDriveris
2
Port(
3
ENABLE:inSTD_LOGIC;
4
IN_CLOCK:inSTD_LOGIC;
5
OUT_BLI:outSTD_LOGIC;
6
OUT_BHI:outSTD_LOGIC;
7
OUT_ALI:outSTD_LOGIC;
8
OUT_AHI:outSTD_LOGIC
9
);
10
endBridgeDriver;
Jetzt will ich, nach einer steigenden Flanke von ENABLE einen bestimmten
Ablauf haben. Also gewissermaßen eine Statemachine, die bei jeder
steigenden Flanke von IN_CLOCK folgende Stati durchläuft:
- Alle OUT_XXX auf '0' setzen. (H-Brücke hochohmig)
- OUT_BLI und OUT_ALI auf '1' setzen. (Bootstrap Kondensatoren laden)
- Normale Funktion (z.B. togglen o.ä.)
Wie mache ich das jetzt am sinnvollsten in VHDL?
Zwei Prozesse für jeweils ENABLE und IN_CLOCK? Den aktuellen Zustand der
Statemachine als Variable speichern?
Sehr schön. Also das folgende funktioniert schon direkt:
1
architectureBehavioralofBridgeDriveris
2
typeState_tis(Off,Start,Charge,Enabled,Running);
3
signalState:State_t:=Start;
4
5
signalALI:STD_LOGIC:='0';
6
signalAHI:STD_LOGIC:='0';
7
signalBLI:STD_LOGIC:='0';
8
signalBHI:STD_LOGIC:='0';
9
10
begin
11
process(IN_CLOCK,State)
12
begin
13
ifrising_edge(IN_CLOCK)then
14
caseStateis
15
whenStart=>ALI<='0';
16
AHI<='0';
17
BLI<='0';
18
BHI<='0';
19
State<=Charge;
20
21
whenCharge=>ALI<='1';
22
BLI<='1';
23
State<=Enabled;
24
25
whenEnabled=>ALI<='0';
26
AHI<='1';
27
State<=Running;
28
29
whenRunning=>ALI<=notALI;
30
AHI<=notAHI;
31
32
whenothers=>
33
endcase;
34
endif;
35
endprocess;
36
37
OUT_ALI<=ALI;
38
OUT_AHI<=AHI;
39
OUT_BLI<=BLI;
40
OUT_BHI<=BHI;
41
42
endBehavioral;
Jetzt möchte ich aber in meinem CPLD asynchrone Logik entwickeln. Das
heißt ich möchte jetzt, dass die Ausgänge asynchron verändert werden
können. Das ganze soll ein Chopper-Stromgregler werden.
- Bei Taktbeginn (rising_edge von IN_CLOCK) sollen die Ausgänge gesetzt
werden.
- Bei einem "Komparator-Interrupt" sollen die Ausgänge zurückgesetzt
werden.
Ich dachte nun eigentlich, dass die Signale ALI, AHI, BLI, BHI intern
als Flipflops realisiert werden (können). Und zwar ein solches FF, was
asynchron gesetzt oder zurückgesetzt werden kann. Das Prinzipschaltbild
ist mal im Anhang angehängt (Datenblatt L297).
Wenn ich allerdings einen zweiten Prozess machen möchte, der die Signale
entsprechend zurücksetzt, dann beschwert sich VHDL darüber, dass die
"Signals connected to multiple drivers".
1
process(IN_COMP,State)
2
begin
3
ifrising_edge(IN_COMP)then
4
caseStateis
5
whenEnabled=>ALI<='1';
6
AHI<='0';
7
8
whenothers=>
9
endcase;
10
endif;
11
endprocess;
Ich bin ein Hardware Mensch und bin gerade etwas empört, dass man als
Hardware Mensch erst wieder auf Software ebene "hochgehen" muss um
Hardware zu definieren ;-) Sprich, ich weiß, wie die Hardware aussehen
muss und muss jetzt einen Weg finden das korrekt in Software zu
beschreiben.
Simon K. schrieb:> Ich bin ein Hardware Mensch und bin gerade etwas empört, dass man als> Hardware Mensch erst wieder auf Software ebene "hochgehen" muss um> Hardware zu definieren ;-) Sprich, ich weiß, wie die Hardware aussehen> muss und muss jetzt einen Weg finden das korrekt in Software zu> beschreiben.
Wenn du HW-Mensch bist, dann wuerdest du aber bestimmt nicht 2
Gatterausgaenge zusammenloeten und erwarten, dass das ganze noch
funktioniert! Genau das machst du aber, wenn du an mehreren Stellen dem
Signal etwas zuweist.
Wie wuerdest du das in HW loesen? Richtig, 2 Logiksignale die ueber
einen Multiplexer verknuepft das endgueltige Signal ergeben.
Oder in VHDL/Verilog halt die ganzen Zuweisungen in einen Prozess
schreiben, die HDLs bauen dir dann schon deinen Multiplexer.
PS: Wenn du das Signal IN_COMP auch noch mit deiner Clock sauber
eintaktest (in 2 FFs) dann kannst du in deinem Prozess auch mit der
Clock arbeiten und verwendest dann halt 'das letzte FF' deines
IN_COMP_SR (Schieberegister).
berndl schrieb:> Simon K. schrieb:>> Ich bin ein Hardware Mensch und bin gerade etwas empört, dass man als>> Hardware Mensch erst wieder auf Software ebene "hochgehen" muss um>> Hardware zu definieren ;-) Sprich, ich weiß, wie die Hardware aussehen>> muss und muss jetzt einen Weg finden das korrekt in Software zu>> beschreiben.>> Wenn du HW-Mensch bist, dann wuerdest du aber bestimmt nicht 2> Gatterausgaenge zusammenloeten und erwarten, dass das ganze noch> funktioniert! Genau das machst du aber, wenn du an mehreren Stellen dem> Signal etwas zuweist.> Wie wuerdest du das in HW loesen? Richtig, 2 Logiksignale die ueber> einen Multiplexer verknuepft das endgueltige Signal ergeben.
Nein, wie schon erwähnt und wie auch in Bildform angehangen möchte ich
an der Stelle ein Flipflop haben. Ein Prozess setzt den Ausgang, der
andere setzt ihn zurück.
DAS möchte ich machen. Und da ich meine öfter schon mal gelesen zu
haben, dass Signale in Flipflops synthetisiert werden, dachte ich, dass
das der richtige Weg ist.
> PS: Wenn du das Signal IN_COMP auch noch mit deiner Clock sauber> eintaktest (in 2 FFs) dann kannst du in deinem Prozess auch mit der> Clock arbeiten und verwendest dann halt 'das letzte FF' deines> IN_COMP_SR (Schieberegister).
Ich möchte kein synchrones Design haben. Ich habe einen Choppertakt mit
~30kHz. Der Komparatoreingang muss asynchron verarbeitet werden.
Ich bin mir ziemlich sicher, dass damit wieder versucht wird IN_COMP auf
den Choppertakt einzusynchronisieren.
Das ist in diesem Falle nicht möglich!
Der Choppertakt hat ~30kHz. Aber der Komparatorinterrupt kommt zwischen
zwei Choppertakt-Flanken.
Der Choppertakt bestromt den Motor, der Komparator soll dafür sorgen,
dass die Bestromung aufhört.
Aber mit dem asynchronen Reset funktioniert es jetzt gut.