mikrocontroller.net

Forum: FPGA, VHDL & Co. Coding Prob eines Schalters


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Bin gerade dabei mir ein wenig VHDL beizubringen und bekomme beim 
implementieren Schwierigkeiten mit dem Code. Würde mich sehr über Eure 
Hilfe freuen. Danke Sascha


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
------------------------------------------------------------------------ 
----------
-- Company:
-- Engineer:
--
-- Create Date:    20:27:56 12/07/2006
-- Design Name:
-- Module Name:    led_modul - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
------------------------------------------------------------------------ 
----------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity led_modul is
    Port ( tst : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           lamp : out  STD_LOGIC);
end led_modul;

architecture verhaltensbeschreibung of led_modul is
type zv_type is (AUS, EINSCHALTEN, EIN, AUSSCHALTEN);
signal ZU, ZVNEU : ZV_TYPE;

begin
ZYKLUS_PROC: process (clk, rst)
begin
  if( rst='1') then ZV<=AUS;
  elsif rising_edge (clk) then ZV<=ZVNEU;
  end if;
end process;

ELZS_AL_PROC : process(ZV,tst,AUS, EINSCHALTEN, EIN, AUSSCHALTEN,lamp)
begin
case ZV is

  when AUS =>
  if (tst='0')then lamp<='0';
  ZVNEU<=AUS;
  else
  lamp<='1';
  ZVNEU<='EINSCHALTEN';
  end if;

  when EINSCHALTEN =>
  if (tst='1')then lamp<='1';
  ZVNEU<=EINSCHALTEN;
  else
  lamp<='1';
  ZVNEU<='EIN';
  end if;

  when EIN =>
  if (tst='0')then lamp<='1';
  ZVNEU<=EINd;
  else
  lamp<='0';
  ZVNEU<='AUSSCHALTEN';
  end if;

  when AUSSCHALTEN =>
  if (tst='1')then lamp<='0';
  ZVNEU<=AUSSCHALTEN;
  else
  lamp<='0';
  ZVNEU<='AUS';
  end if;
end case;
end process;
end verhaltensbeschreibung;


ERROR:HDLParsers:164 - "C:/Xilinx/led_modul/led_modul.vhd" Line 66. 
parse error, unexpected TICK
ERROR:HDLParsers:164 - "C:/Xilinx/led_modul/led_modul.vhd" Line 74. 
parse error, unexpected TICK
ERROR:HDLParsers:164 - "C:/Xilinx/led_modul/led_modul.vhd" Line 82. 
parse error, unexpected TICK

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signal ZU, ZVNEU : ZV_TYPE;

sollte wohl heissen:

signal ZV, ZVNEU : ZV_TYPE;

- oder?  (Aber darüber sollte der Compiler doch gemeckert haben...)



Und mal am Rande gefragt: Warum bindest Du die Libraries 2x ein?



Und am Rande angemerkt: Ein Ausdruck mit Zeilennummern würde das 
Nachvollziehen der Fehlermeldungen auch erleichtern...

Hat Dein Fehler vielleicht damit zu tun, dass Du manchmal so schreibst:
  ZVNEU<='AUSSCHALTEN';  und manchmal so:
  ZVNEU<=AUSSCHALTEN;
?

(Die einfachen Anführungszeichen heissen im Englischen "Ticks")

Autor: FPGAküchle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In 'fjfjfjjf' schreibt man Werte vom Grundtyp Zeichen. Also
'A' '0' '1'.
Wenss als Feld (array,vector) mit einem Element definiert ist schreibt 
man "A" "0".
Dein Typ für den Zustand ist weder noch sondern von einem weitern Typ 
Aufzählung (enumeration). Die tippert man ohne ' oder " ,  also
nur zustand <= START.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das muss wohl rising_edge(clk) heissten, NICHT rising_edge (clk) !!! 
KEin Leerzeichen.

MfG
Falk

P.S. Die Formatierung ist noch verbesserungsbedürftig.

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Leerzeichen bei rising_edge ist wurst.
Rising_edge ist eine Funktion.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Vielen Dank für Eure Hilfe! Hat mir sehr weitergeholfen - Fehler sind 
klar, doch ins Auge gestochen sind sie mir leider nicht. Der Code ist 
nun überarbeitet, doch bislang noch immer nicht synthetisierbar. Wäre 
sehr nett wenn ihr nochmal darüber schauen könntet!!! Danke Sascha


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity led_modul is
    Port ( TST : in  STD_LOGIC;
           CLK : in  STD_LOGIC;
           RST : in  STD_LOGIC;
           LAMP : out  STD_LOGIC);
end led_modul;

architecture verhaltensbeschreibung of led_modul is
type ZV_TYPE is (AUS, EINSCHALTEN, EIN, AUSSCHALTEN);
signal ZV, ZVNEU : ZV_TYPE;

begin

  ZYKLUS_PROC: process (CLK, RST)
  begin
    if( RST='1') then ZV<=AUS;
    elsif rising_edge(CLK) then ZV<=ZVNEU;
    end if;
  end process;

  ELZS_AL_PROC : process(LAMP) -- X
  begin
    case ZV is

    when AUS=>
      if (tst='0')
      then LAMP<='0';
      ZVNEU<=AUS;
      else
      LAMP<='1';
      ZVNEU<=EINSCHALTEN;
      end if;

    when EINSCHALTEN=>
      if (tst='1')then LAMP<='1';
      ZVNEU<=EINSCHALTEN;
      else
      LAMP<='1';
      ZVNEU<=EIN;
      end if;

    when EIN=>
      if (tst='0')then LAMP<='1';
      ZVNEU<=EIN;
      else
      LAMP<='0';
      ZVNEU<=AUSSCHALTEN;
      end if;

    when AUSSCHALTEN=>
      if (tst='1')then LAMP<='0';
      ZVNEU<=AUSSCHALTEN;
      else
      LAMP<='0';
      ZVNEU<=AUS;
      end if;
    end case;
  end process;
end verhaltensbeschreibung;

X:
ERROR:HDLParsers:1401 - "C:/Programme/Xilinx/led_modul/led_modul.vhd" 
Line 26. Object LAMP of mode OUT can not be read.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung: Muss process(TST) statt process(LAMP) heisen - läuft jedoch 
leider trotzdem noch nicht ...

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sascha:

Wie wäre es, wenn Du Dir eine Testbench zu deinem Modul schreibst und es 
mit Testdaten stimulierst? Dann kannst Du in der Timinganalyse sehen, wo 
es hängt.

Der Code ist so wie er oben steht syntaktisch erstmal nicht (mehr) 
falsch.

Rick

Autor: Rick Dangerus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Sascha:
Möglicherweise möchtest Du sowas schreiben:
  ...
  ELZS_AL_PROC : process(clk) -- X
                         ^^^
  ...

Im Anhang noch eine kleine Testbench.

Rick

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei dem asynchr. Prozess gehört kein Clocksignal in die Sens.liste, 
sondern alle in dem Prozess gelesenen Signale.
ELZS_AL_PROC : process(ZV, test)
wenn du LAMP in die Liste schreibst, machst du die Ausführung des 
Prozesses abhängig vom Ausgangssignal LAMP. Dies ist jedoch nicht 
erlaubt, da Ausgangssignale nicht gelesen werden dürfen.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe! Versuche mich bereits den ganzen Nachmittag 
an dieser Testbench ohne dass etwas produktives dabei herauskommt. 
Benötige Infos hierüber - Kann jemand ein gutes Tutorial oder einen 
Artikel darüber empfehlen? Muss das unbedingt lernen, denn - By the way 
... Synthese des obigen Codes hat funktioniert, download ebenfalls, doch 
wird die gewünschte Schaltfunktion nicht realisiert - statt dessen ein 
Taster :(
Danke und Gruß Sascha

Autor: Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles über Testbenches findest du in dem Buch "Writing Testbenches" von 
Janick Bergeron. Aber das könnte auch etwas zu viel sein, da hier die 
Vorgehensweise bei sehr komplexen Benches beschrieben wird.

Fang einfach mal so an:

Mach dir ne neue component und nenn sie "tester.vhd" die hat die 
gleichen Ports, wie dein Design, aber gerade in die andere Richtung 
(also ein IN in deinem Design wird zum OUT in deinem Tester.

Dann machst noch eine component (bench.vhd), in der du über ne 
componentdeklaration die beiden Designs instanziierst und sie über port 
map verbindest (wie das geht steht in jedem VHDL-Tutorial.

In tester.vhd machst du dann nen Prozess in dem du die Singalfogen 
beschreibst, wie sie nacheinader kommen sollen. Mit "wait for" kannst du 
"pausen" einfügen (wait for 10ns).

Dann simulierst du bench.vhd udn kannst die Signale im wave-Fenster 
verifizieren.

über "assert" kannst du die Reaktionen deines Designs auf den von 
tester.vhd erzeugten stimulus autoamtisch überwachen lassen und ggf 
Meldungen im Simulator ausgeben (aber das wäre dann der zweite Schritt)

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.