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


von Sascha (Gast)


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

von Stefan W. (wswbln)


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")

von FPGAküchle (Gast)


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.

von Falk (Gast)


Lesenswert?

das muss wohl rising_edge(clk) heissten, NICHT rising_edge (clk) !!! 
KEin Leerzeichen.

MfG
Falk

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

von Xenu (Gast)


Lesenswert?

Das Leerzeichen bei rising_edge ist wurst.
Rising_edge ist eine Funktion.

von Sascha (Gast)


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.

von Sascha (Gast)


Lesenswert?

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

von Rick Dangerus (Gast)


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

von Rick Dangerus (Gast)


Angehängte Dateien:

Lesenswert?

@Sascha:
Möglicherweise möchtest Du sowas schreiben:
1
  ...
2
  ELZS_AL_PROC : process(clk) -- X
3
                         ^^^
4
  ...

Im Anhang noch eine kleine Testbench.

Rick

von T.M. (Gast)


Lesenswert?

Bei dem asynchr. Prozess gehört kein Clocksignal in die Sens.liste, 
sondern alle in dem Prozess gelesenen Signale.
1
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.

von Sascha (Gast)


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

von Schlumpf (Gast)


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)

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.