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
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")
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.
das muss wohl rising_edge(clk) heissten, NICHT rising_edge (clk) !!! KEin Leerzeichen. MfG Falk P.S. Die Formatierung ist noch verbesserungsbedürftig.
Das Leerzeichen bei rising_edge ist wurst. Rising_edge ist eine Funktion.
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.
Anmerkung: Muss process(TST) statt process(LAMP) heisen - läuft jedoch leider trotzdem noch nicht ...
@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
@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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.