Hallo,
für die ersten Gehversuche im Bereich CPLD und VHDL habe ich mir ein
Entwicklungsboard von Lattice mit einem ispMach4256ZE-05MN144C CPLD
zugelegt.
Die Entwicklungssoftware (ispLever Classic, ispVM System, Synplify Pro,
Aldec HDL) habe ich auch schon installiert und ein wenig mit herum
experimentiert.
Mit VHDL kenne ich mich noch fast gar nicht aus. Die Beispiele von
Lattice sind ausschließlich in Verilog programmiert.
Nun möchte ich über die DIP-Schalter das LC-Display ansteuern. Was muss
ich hierfür tun? Muss ich das LC-Display takten? Ich habe jetzt einfach
2 Eingänge definiert für 2 DIP-Schalter und 2 Ausgänge (COM des LCD und
einen Punkt des LC-Displays).
Aber das scheint nicht richtig zu funktionieren. Der Punkt flackert nur
einmal ganz kurz auf und verschwindet dann wieder.
Hier mein Code:
1
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.std_logic_arith.all;
4
useieee.std_logic_unsigned.all;
5
6
entityeasyEntis
7
8
port(
9
In1:instd_logic;
10
In2:instd_logic;
11
Out1:outstd_logic;
12
Lcd_com:outstd_logic);
13
14
end;
15
16
architecturebehavioralofeasyEntis
17
begin
18
19
Lcd_com<='1';
20
Out1<='1'whenIn1=In2else'0';
21
22
endbehavioral;
Weiß jemand auf Anhieb wo der Fehler ist? Oder hat vllt. generell jemand
Erfahrungen mit der CPLD-Familie oder dem Entwicklungsboard? Schön wäre
auch Beispiele in VHDL-Code.
Gruß
Markus schrieb:> Aber das scheint nicht richtig zu funktionieren. Der Punkt flackert nur> einmal ganz kurz auf und verschwindet dann wieder.
Hallo,
gar nicht gut... Das Verhalten ist ok. Nur:
LCD's mögen keine Gleichspannung. Du solltest folgendermaßen vorgehen:
Der COM-Anschluß wird getaktet (ich würde es mal mit 50Hz oder 100Hz
versuchen).
Alle Segmente, die nicht "leuchten" sollen, bekommen den selben Pegel,
den auch COM hat.
Alle Segmente, die "leuchten" sollen, erhalten einen von COM
invertierten Pegel.
Für's erste solltest du also einen Takt generieren, diesen nochmal
invertieren und dann diese beiden Signale auf COM und "Punkt" legen.
Dann solltest du etwas sehen...
Gruß,
Thomas
Hallo,
vielen Dank für deine Antwort.
Wußte nicht, dass ein LC-Display unbedingt einen Takt benötigt. Hat denn
ein CPLD schon intern eine Möglichkeit einen Takt zu generieren?
Oder muss ich diesen per Oszillator erzeugen und an einen Eingang legen?
Gruß
Markus
Markus schrieb:> Wußte nicht, dass ein LC-Display unbedingt einen Takt benötigt. Hat denn> ein CPLD schon intern eine Möglichkeit einen Takt zu generieren?
So verallgemeinern kann man das nicht. LCD's ohne Ansteuerelektronik
dürfen nur mit Wechselspannung betrieben werden, da sonst die Segmente
durch Elektrolyse zerstört werden, wenn nur eine Gleichspannung am
Segment anliegt. Der Gleichspannungspegel muß also 0 betragen. Das wird
hier eben durch ständiges Umpolen erreicht. Es gibt aber auch LCD's,
welche einen entsprechenden Controller auf der Rückseite haben, der
diese Ansteuerung übernimmt und den man nur noch "Befehle" geben muss...
Einen Takt generieren? Jetzt ist der Zeitpunkt da, ins Datenblatt zu
schauen. Ich kenne mich mit den Lattice-Chips nicht aus. Habe mir aber
mal das "User Guide" und das "Family Data Sheet" (für dich) angeschaut.
A) Der Chip hat Clock-Eingänge, von denen einer auf die zweipolige
Leiste am oberen Rand geführt ist. Dort einen Oszillator anschließen.
B) Offensichtlich hat der Chip einen internen Oszillator von 5 MHz
(Family Datasheet Seite 13/14). Diesen solltest du auch verwenden
können. Wäre auch einfacher als mit einem externen Takt.
Du solltest dir aber vielleicht 2 LED's an die Pinleiste am oberen Rand
hängen (natürlich mit entsprechenden Vorwiderständen) und erstmal
versuchen, die abwechselnd blinken zu lassen. Wenn du das geschafft
hast, dann kannst du den Entwurf nehmen, den Taktteiler verkleinern, und
die Ausgangspins von den LED's auf LCD-COM und "LCD-Segment" legen. Dann
wird dieses Segment schwarz sein.
Solange du es nämlich nicht schaffst einen ordentlichen Takt zu
erzeugen, besteht die Gefahr, dass du dein LCD zerstörst. Die LED's
wären insofern die "Lebensversicherung" für dein LCD. :-)
Viel Erfolg,
Thomas
Vielen Dank für deine Mühe. Jetzt ist mir schon einiges klarer geworden.
Habe bisher auf dem Gebiet keine Erfahrungen gemacht. VHDL ist für mich
ebenso noch ein Buch mit 7 Siegeln.
Dann werde ich das mal so versuchen, wie du es beschrieben hast. Ich
weiß allerdings noch überhaupt nicht, wie ich diesen Takt per VHDL
initialisieren und/oder benutzen kann.
Gruß
Markus
Markus schrieb:> Dann werde ich das mal so versuchen, wie du es beschrieben hast. Ich> weiß allerdings noch überhaupt nicht, wie ich diesen Takt per VHDL> initialisieren und/oder benutzen kann.
Dafür sollte es Module in der Lattice Bibliothek geben, die bindet man
entweder über Namen, oder IPExpress ein.
Ich kann das leider nicht verifizieren da Diamond die ispMach nicht
supported. Vielleicht hilft es dir trotzdem weiter.
@Markus (Gast):
Suche mal bei Lattice nach "TN1174". Da steht etwas über den internen
Oszillator drin.
Vielleicht ist ein externer Oszillator aber doch für den Anfang
einfacher. Wenn das Design dann mit diesem funktioniert, kann man immer
noch versuchen auf den internen zu wechseln.
Gruß,
Thomas
Thomas T. schrieb:> Vielleicht ist ein externer Oszillator aber doch für den Anfang> einfacher.
Den internen zu nutzen sollte nicht so kompliziert sein:
1
librarylattice;
2
uselattice.components.all;
3
4
I1:OSCTIMER
5
genericmap(TIMER_DIV=>“1024”)
6
portmap(DYNOSCDIS=>osc_dis,
7
TIMERRES=>tmr_rst,
8
OSCOUT=>osc_out,
9
TIMEROUT=>tmr_out);
osc_out hat dann 5 MHz, tmr_out ca 5 kHz. Wenn man TIMER_DIV auf 1048576
setzt kommen bei tmr_out ca 5 Hz raus, das kann man zum Testem einfach
mal auf eine LED geben.
Ich verwende allerding Verilog, d.h. man möge mir verzeihen wenn obiges
VHDL schnippsel fehlerhaft ist.
Vielen Dank für Eure tatkräftige Hilfe. Habe mir auch schon das
Application Note angeschaut. Allerdings bekomme ich immer Compilerfehler
und weiß nicht woran es liegt.
Ich komme irgendwie mit der Strukturierung von VHDL noch nicht klar.
Im folgenden mein VHDL-Code:
1
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.std_logic_arith.all;
4
useieee.std_logic_unsigned.all;
5
6
librarylattice;
7
uselattice.components.all;
8
9
10
entityeasyEntis
11
12
port(
13
InA:instd_logic;
14
InB:instd_logic;
15
InC:instd_logic;
16
InD:instd_logic;
17
18
Lcd_a:outstd_logic;
19
Lcd_b:outstd_logic;
20
Lcd_c:outstd_logic;
21
Lcd_d:outstd_logic;
22
Lcd_e:outstd_logic;
23
Lcd_f:outstd_logic;
24
Lcd_g:outstd_logic;
25
Lcd_com:outstd_logic);
26
27
end;
28
29
30
31
32
33
34
35
architecturebehavioralofeasyEntis
36
37
componentOSCTIMERis
38
generic(TIMER_DIV:string);
39
port(DYNOSCDIS:instd_logic;
40
TIMERRES:instd_logic;
41
OSCOUT:outstd_logic;
42
TIMEROUT:outstd_logic);
43
endcomponentOSCTIMER;
44
45
46
begin
47
48
I1:OSCTIMER
49
genericmap(TIMER_DIV=>"1024")
50
portmap(DYNOSCDIS=>osc_dis,
51
TIMERRES=>tmr_rst,
52
OSCOUT=>osc_out,
53
TIMEROUT=>tmr_out);
54
endcomponent;
55
56
57
58
59
endbehavioral;
Folgende Fehlermeldung kommt:
@E: CD255 :"C:\dokumente und
einstellungen\kdengel\kb\projekte\cpld\easyent.vhd":50:37:50:37|No
identifier "osc_dis" in scope
Hoffenrlich könnt ihr mir helfen.
Gruß
Markus schrieb:> Mehr steht im Application Note aber nicht drin.
Doch steht drin:
Table 1:
DYNOSCDIS : Disables the Oscillator.
> Was soll ich wo denn zuweisen?
Also eine 0 zuweisen.
Klar könnte ich das so machen. Ich möchte aber die Variablen benutzen.
Allerdings bekomme ich so immer eine Fehlermeldung "No identifier...".
Wie bekomme ich dies in den Griff?
Markus schrieb:> Ich möchte aber die Variablen benutzen.Markus schrieb:> VHDL ist für mich> ebenso noch ein Buch mit 7 Siegeln.
Daher bitte keine Variable und keine for-loops verwenden. Verwirrt nur
zusätzlich.
Verwende ein Signal:
1
...
2
3
signalosc_dis:std_logic;
4
5
begin
6
7
osc_dis<="0";
8
9
OSCTIMER_I0:OSCTIMER
10
genericmap(
11
TIMER_DIV=>"1024"
12
)
13
portmap(
14
DYNOSCDIS=>osc_dis,
15
TIMERRES=>tmr_rst,
16
OSCOUT=>osc_out,
17
TIMEROUT=>tmr_out
18
);
19
20
...
Um die anderen drei Signale mußt Du dich dann auch noch kümmern...
Duke
Ich bin endlich dank Eurer Hilfe vorangekommen. Ich habe nun den
internen Takt auf einen Ausgang gelegt und steuere damit eine LED mit
5Hz an.
Ich komme jedoch noch überhaupt nicht mit VHDL klar. Hat irgendwer eine
gute Quelle, womit ich gut VHDL lernen kann?
Gruß