Forum: FPGA, VHDL & Co. Lattice ispMach 4000ZE pico development board


von Markus (Gast)


Lesenswert?

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
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
6
entity easyEnt is
7
8
port( 
9
  In1: in std_logic ;
10
  In2: in std_logic ;
11
  Out1: out std_logic ;
12
        Lcd_com: out std_logic  );
13
14
end;
15
16
architecture behavioral of easyEnt is
17
begin
18
19
 Lcd_com <= '1';
20
 Out1 <= '1' when In1 = In2 else '0';
21
22
end behavioral;

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ß

von Thomas T. (knibbel)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Thomas T. (knibbel)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Lattice User (Gast)


Lesenswert?

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.

von Thomas T. (knibbel)


Lesenswert?

@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

von Lattice User (Gast)


Lesenswert?

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
library lattice;
2
use lattice.components.all;
3
4
I1: OSCTIMER
5
generic map (TIMER_DIV => 1024)
6
port map ( 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.

von Markus (Gast)


Lesenswert?

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
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
6
library lattice;
7
use lattice.components.all;
8
9
10
entity easyEnt is
11
12
port( 
13
  InA: in std_logic ;
14
  InB: in std_logic ;
15
        InC: in std_logic ;
16
        InD: in std_logic ;
17
18
  Lcd_a: out std_logic ;
19
        Lcd_b: out std_logic ;
20
        Lcd_c: out std_logic ;
21
        Lcd_d: out std_logic ;
22
        Lcd_e: out std_logic ;
23
        Lcd_f: out std_logic ;
24
        Lcd_g: out std_logic ;
25
        Lcd_com: out std_logic );
26
27
end;
28
29
30
31
32
33
34
35
architecture behavioral of easyEnt is
36
37
component OSCTIMER is
38
   generic( TIMER_DIV : string );
39
   port ( DYNOSCDIS     : in  std_logic;
40
          TIMERRES      : in  std_logic;
41
          OSCOUT        : out std_logic;
42
          TIMEROUT      : out std_logic );
43
end component OSCTIMER;
44
45
46
begin
47
48
I1: OSCTIMER
49
   generic map ( TIMER_DIV => "1024" )
50
   port map (    DYNOSCDIS => osc_dis,
51
           TIMERRES => tmr_rst,
52
                 OSCOUT => osc_out,
53
                 TIMEROUT => tmr_out );
54
end component;
55
56
  
57
58
59
end behavioral;

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ß

von Duke Scarring (Gast)


Lesenswert?

Markus schrieb:
> osc_dis

Das ist nirgendwo definiert.

Duke

von Markus (Gast)


Lesenswert?

Mehr steht im Application Note aber nicht drin.
Was soll ich wo denn zuweisen?

von Lattice User (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

Aber wo?
Ich muss doch dann irgendwo noch schreiben

osc_dis := "0";

Oder nicht?

von Duke Scarring (Gast)


Lesenswert?

Oder so:
1
OSCTIMER_I0: OSCTIMER
2
  generic map (
3
    TIMER_DIV => "1024"
4
  )
5
  port map (
6
    DYNOSCDIS => '0',
7
    TIMERRES  => tmr_rst,
8
    OSCOUT    => osc_out,
9
    TIMEROUT  => tmr_out 
10
  );

von Markus (Gast)


Lesenswert?

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?

von Duke Scarring (Gast)


Lesenswert?

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
  signal osc_dis : std_logic;
4
5
begin
6
7
  osc_dis <= "0";
8
9
  OSCTIMER_I0: OSCTIMER
10
    generic map (
11
      TIMER_DIV => "1024"
12
    )
13
    port map (
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

von Markus (Gast)


Lesenswert?

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ß

von zachso (Gast)


Lesenswert?

diese buch, wird immer wieder empfohlen und ich glaube mittlerweise hat 
zumindest von den frschlingen hier im forum jeder damit gelernt:

http://www.amazon.de/VHDL-Synthese-Entwurf-digitaler-Schaltungen-Systeme/dp/3486589873/ref=sr_1_1?ie=UTF8&qid=1297170658&sr=8-1

viel spass damit!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.