mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity easyEnt is

port( 
  In1: in std_logic ;
  In2: in std_logic ;
  Out1: out std_logic ;
        Lcd_com: out std_logic  );

end;

architecture behavioral of easyEnt is
begin

 Lcd_com <= '1';
 Out1 <= '1' when In1 = In2 else '0';

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ß

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas T. (knibbel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library lattice;
use lattice.components.all;

I1: OSCTIMER
generic map (TIMER_DIV => 1024)
port map ( DYNOSCDIS => osc_dis,
           TIMERRES => tmr_rst,
           OSCOUT => osc_out,
           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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

library lattice;
use lattice.components.all;


entity easyEnt is

port( 
  InA: in std_logic ;
  InB: in std_logic ;
        InC: in std_logic ;
        InD: in std_logic ;

  Lcd_a: out std_logic ;
        Lcd_b: out std_logic ;
        Lcd_c: out std_logic ;
        Lcd_d: out std_logic ;
        Lcd_e: out std_logic ;
        Lcd_f: out std_logic ;
        Lcd_g: out std_logic ;
        Lcd_com: out std_logic );

end;







architecture behavioral of easyEnt is

component OSCTIMER is
   generic( TIMER_DIV : string );
   port ( DYNOSCDIS     : in  std_logic;
          TIMERRES      : in  std_logic;
          OSCOUT        : out std_logic;
          TIMEROUT      : out std_logic );
end component OSCTIMER;


begin

I1: OSCTIMER
   generic map ( TIMER_DIV => "1024" )
   port map (    DYNOSCDIS => osc_dis,
           TIMERRES => tmr_rst,
                 OSCOUT => osc_out,
                 TIMEROUT => tmr_out );
end component;

  


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ß

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> osc_dis

Das ist nirgendwo definiert.

Duke

Autor: Markus (Gast)
Datum:

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

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wo?
Ich muss doch dann irgendwo noch schreiben

osc_dis := "0";

Oder nicht?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder so:
OSCTIMER_I0: OSCTIMER
  generic map (
    TIMER_DIV => "1024"
  )
  port map (
    DYNOSCDIS => '0',
    TIMERRES  => tmr_rst,
    OSCOUT    => osc_out,
    TIMEROUT  => tmr_out 
  );

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
...

  signal osc_dis : std_logic;

begin

  osc_dis <= "0";

  OSCTIMER_I0: OSCTIMER
    generic map (
      TIMER_DIV => "1024"
    )
    port map (
      DYNOSCDIS => osc_dis,
      TIMERRES  => tmr_rst,
      OSCOUT    => osc_out,
      TIMEROUT  => tmr_out 
    );
 
...

Um die anderen drei Signale mußt Du dich dann auch noch kümmern...

Duke

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: zachso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-digital...

viel spass damit!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.