Hallo, Ich habe ein kleines Problem. Ich soll ein Lauflicht mit variabler Geschwindigkeit mit Quartus 2 auf einem Cyclone II erstellen. Aktuell habe ich ein Programm geschrieben für ein Lauflicht mit fester Geschwindigkeit, jedoch kann ich es nicht kompilieren und ich finde die Fehlerquelle nicht. Die variable Geschwindigkeit soll dann anschließend folgen. library ieee; use ieee.std_logic_1164.all; entity lauflicht is generic (n: integer := 50000000); -- Teilerverhaeltnis port( clk: in std_logic; y1: buffer std_logic; y2: buffer std_logic; q: buffer std_logic; clken: out std_logic; schalter: in bit; l0,l1,l2,l3,l4,l5,l6,l7,l8,l9: in bit; zwischen2: buffer bit_vector(9 downto 0); zwischen: buffer bit_vector(9 downto 0) ); end lauflicht; architecture behavior of lauflicht is signal Z: integer range 0 to n-1; signal input1: boolean; signal output: bit_vector(9 downto 0); begin output <= l0 & l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9; zwischen <= l0 & l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9; clock: process (clk,q,y1) begin if clk='1' and clk'event then --L/H Flanke if Z = n then Z <= 0; else Z <= Z +1 ; end if; if Z = 0 then q <= not q; end if; end if; y1 <= q; end process clock; lauf: process (y2,zwischen,zwischen2) begin wait until rising_edge(y2); if (zwischen="0000000001") then zwischen <= "1000000000"; output <= "1000000000"; else zwischen2 <= zwischen srl 1; output <= zwischen2; end if; end process lauf; end behavior; Die Fehlermeldungen: Warning (10541): VHDL Signal Declaration warning at lauflicht.vhd(11): used implicit default value for signal "clken" because signal was never assigned a value or an explicit default value. Use of implicit default value may introduce unintended design optimizations. Warning (10036): Verilog HDL or VHDL warning at lauflicht.vhd(22): object "output" assigned a value but never read Error (10441): VHDL Process Statement error at lauflicht.vhd(39): Process Statement cannot contain both a sensitivity list and a Wait Statement Error (12153): Can't elaborate top-level user hierarchy Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 2 errors, 2 warnings Error: Peak virtual memory: 516 megabytes Error: Processing ended: Tue May 10 15:52:57 2016 Error: Elapsed time: 00:00:01 Error: Total CPU time (on all processors): 00:00:01 Error (293001): Quartus II Full Compilation was unsuccessful. 4 errors, 2 warnings Kann mir da jemand behilflich sein und mir das Problem/die Probleme aufzeigen? Grüße
edneti schrieb: > Warning (10541): VHDL Signal Declaration warning at lauflicht.vhd(11): > used implicit default value for signal "clken" because signal was never > assigned a value or an explicit default value. Use of implicit default clken wird niemals ein Wert zugewiesen. Weise dem Signal einfach einen Wert zu. CLKEN<='1';
@ edneti (Gast) >Ich habe ein kleines Problem. Ich soll ein Lauflicht mit variabler >Geschwindigkeit mit Quartus 2 auf einem Cyclone II erstellen. Hmm. >Aktuell habe ich ein Programm geschrieben für ein Lauflicht mit fester >Geschwindigkeit, jedoch kann ich es nicht kompilieren und ich finde die >Fehlerquelle nicht. Dann sollte man die Fehlermeldungen lesen. >entity lauflicht is > generic (n: integer := 50000000); -- Teilerverhaeltnis > port( > clk: in std_logic; OK. > y1: buffer std_logic; > y2: buffer std_logic; > q: buffer std_logic; Buffer sollte man besser nicht nutzen, nur OUT, IN oder INOUT. > clken: out std_logic; > schalter: in bit; bit nutzt man auch eher nicht, nutzt std_logic; > l0,l1,l2,l3,l4,l5,l6,l7,l8,l9: in bit; > zwischen2: buffer bit_vector(9 downto 0); > zwischen: buffer bit_vector(9 downto 0) Das sind doch interne Signale, die gehören NICHT in die PORT-Definition! > signal output: bit_vector(9 downto 0); Nutzte std_logic_vector bzw. signed/unsigned. > begin > output <= l0 & l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9; > zwischen <= l0 & l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9; Zum Debuggen im Simulator muss man keine Signale nach außen führen, man kann interne SIgnale im Simulator direkt anzeigen. > clock: process (clk,q,y1) > begin > if clk='1' and clk'event then --L/H Flanke schreib doch gleich rising_edge(clk) > if Z = n then Z <= 0; > else Z <= Z +1 ; > end if; > if Z = 0 then > q <= not q; > > end if; > end if; > y1 <= q; > end process clock; > lauf: process (y2,zwischen,zwischen2) > begin > wait until rising_edge(y2); Wo wird y2 erzeugt? Trotzdem sit der Ansatz falsch. Nutz ein RICHTIGES clock enable Signal. https://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD#Clock_Enable > if (zwischen="0000000001") then > zwischen <= "1000000000"; > output <= "1000000000"; > else > zwischen2 <= zwischen srl 1; > output <= zwischen2; > end if; > end process lauf; > end behavior; Das ist eine reichlich umständliche BEschreibung eines Schieberegisters. >Warning (10541): VHDL Signal Declaration warning at lauflicht.vhd(11): >used implicit default value for signal "clken" because signal was never >assigned a value or an explicit default value. Es gibt keinen, der clken erzeugt. >Warning (10036): Verilog HDL or VHDL warning at lauflicht.vhd(22): >object "output" assigned a value but never read outout wird zugewiesen aber nirgendwo weiter benutzt. >Error (10441): VHDL Process Statement error at lauflicht.vhd(39): >Process Statement cannot contain both a sensitivity list and a Wait >Statement Man kann nicht sowohl eine Sensitivity List als auch ein wait-Statement verwenden. Das wait -Statement nutzt man eigentlich nur in nicht synthetisierbaren Testbenches. > Error: Peak virtual memory: 516 megabytes Mein Gott, für so ein bissel Code braucht ein moderner VHDL-COmpiler 516 MB?
So ich hab das Programm nun noch einmal überarbeitet. Mein aktuelles problem ist, dass ich die leds (l1,l2 usw) als out bit deklariert wurden, was auch so richtig ist. Ich diese nun aber komischerweise nicht dem vektor zuordnen kann um sie dann leichter bearbeiten zu können. Fehlermeldung "Error (10309): VHDL Interface Declaration error in Lauflicht.vhd(41): interface object "l0" of mode out cannot be read. Change object mode to buffer." library ieee; use ieee.std_logic_1164.all; entity Lauflicht is generic (n: integer := 50000000); -- Teilerverhaeltnis port( clk: in std_logic; y1: out std_logic; q: buffer std_logic; l0,l1,l2,l3,l4,l5,l6: out bit ); end Lauflicht; architecture behavior of Lauflicht is signal Z: integer range 0 to n-1; signal leds: bit_vector(6 downto 0); signal zwischen1: bit_vector(6 downto 0); signal zwischen2: bit_vector(6 downto 0); begin --Clock clock: process (clk) begin if clk='1' and clk'event then --L/H Flanke if Z = n then Z <= 0; else Z <= Z +1 ; end if; if Z = 0 then q <= not q; end if; end if; y1 <= q; end process clock; -- Prozess des Lauflichts lauflicht: process (q,l0,l1,l2,l3,l4,l5,l6) begin leds <= l0 & l1 & l2 & l3 & l4 & l5 & l6; -- led Ausgänge l1 l2 usw werden zu vektor "leds" zusammengefasst zwischen1 <= leds; -- zwischen1 = zwischenspeicher1 soll die Werte von leds annehmen wait until rising_edge(q); if(zwischen1="0000001") then zwischen1 <= "1000000"; leds <= zwischen1; else zwischen2 <= zwischen1 srl 1; leds <= zwischen2; end if; end process lauflicht; end behavior;
Z ist einer der möglichen Zustände von std_logic. Ein Signal Z zu nennen ist daher nicht ratsam. Auch Namen wie 10 sind sehr schlechter Stil. Und: Wenn Du etwas als out deklariert hast, kannst Du es nicht lesen. Z. B. ist 10 bei dir ein Ausgang. Hier liest Du aber davon: leds <= l0 ...
Ich weiß nicht ob du es eventuell falsch abgelesen hast, aber die leds sind jeweils mit einem buchstaben "L" und einer Zahl beschriftet. Es soll also nicht 10,11,12 oder 16 heißen.
Habe nun die verschiedenen Geschwindigkeiten mit eingefügt. Mit nur einer Geschwindigkein konnte ich es kompilieren nun mit 3 nicht mehr. Code: library ieee; use ieee.std_logic_1164.all; entity Lauflicht is generic (n: integer := 50000000); -- => 1 Hz port( clk: in std_logic; y1: inout std_logic; q1: buffer std_logic; q2: buffer std_logic; q3: buffer std_logic; s1: in bit; s2: in bit; s3: in bit; l0,l1,l2,l3,l4,l5,l6: inout bit ); end Lauflicht; architecture behavior of Lauflicht is signal Z: integer range 0 to n-1; signal leds: bit_vector(6 downto 0); signal zwischen1: bit_vector(6 downto 0); signal zwischen2: bit_vector(6 downto 0); begin leds <= l0 & l1 & l2 & l3 & l4 & l5 & l6; --Clock1 clock1: process (clk,s1) begin if(s1='1') then if (rising_edge(clk)) then --L/H Flanke if Z = n then Z <= 0; else Z <= Z +1 ; end if; if Z = 0 then q1 <= not q1; end if; end if; y1 <= q1; end if; end process clock1; --Clock2 clock2: process (clk,s2) begin if(s2='1') then if (rising_edge(clk)) then --L/H Flanke if Z = 2*n then Z <= 0; else Z <= Z +1 ; end if; if Z = 0 then q2 <= not q2; end if; end if; y1 <= q2; end if; end process clock2; --Clock3 clock3: process (clk,s2) begin if(s3='1') then if (rising_edge(clk)) then --L/H Flanke if Z = 4*n then Z <= 0; else Z <= Z +1 ; end if; if Z = 0 then q3 <= not q3; end if; end if; y1 <= q3; end if; end process clock3; -- Prozess des Lauflichts lauflicht: process (y1) begin if (y1='1') then if(zwischen1="0000001") then zwischen1 <= "1000000"; leds <= zwischen1; else zwischen2 <= zwischen1 srl 1; leds <= zwischen2; end if; else end if; end process lauflicht; end behavior; Fehlermeldungen: Error (10028): Can't resolve multiple constant drivers for net "y1" at Lauflicht.vhd(49) Error (10029): Constant driver at Lauflicht.vhd(29) Error (10028): Can't resolve multiple constant drivers for net "Z[25]" at Lauflicht.vhd(52) Error (10029): Constant driver at Lauflicht.vhd(32) Error (10028): Can't resolve multiple constant drivers for net "Z[24]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[23]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[22]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[21]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[20]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[19]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[18]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[17]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[16]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[15]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[14]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[13]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[12]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[11]" at Lauflicht.vhd(52) Error (10028): Can't resolve multiple constant drivers for net "Z[10]" at Lauflicht.vhd(52) Error (12153): Can't elaborate top-level user hierarchy Error: Quartus II 32-bit Analysis & Synthesis was unsuccessful. 20 errors, 9 warnings Error: Peak virtual memory: 389 megabytes Error: Processing ended: Tue May 10 18:54:18 2016 Error: Elapsed time: 00:00:01 Error: Total CPU time (on all processors): 00:00:01 Error (293001): Quartus II Full Compilation was unsuccessful. 22 errors, 9 warnings Was sollen diese Fehlermeldungen mir sagen?
@edneti (Gast) >Mein aktuelles problem ist, dass ich die leds (l1,l2 usw) als out bit >deklariert wurden, was auch so richtig ist. Nicht unbedingt. > Ich diese nun aber >komischerweise nicht dem vektor zuordnen kann um sie dann leichter >bearbeiten zu können. Doch. >Fehlermeldung "Error (10309): VHDL Interface Declaration error in >Lauflicht.vhd(41): interface object "l0" of mode out cannot be read. >Change object mode to buffer." Falscher Tip. Nimm ein internes Signal (std_logic_vector) und arbeite damit. Das kann man dann auch ganz easy den Ausgangssignalen zuordnen.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity lauflicht is |
6 | generic (n: integer := 50000000 |
7 | );
|
8 | Port ( clk : in STD_LOGIC; |
9 | y1 : out STD_LOGIC; |
10 | q : out STD_LOGIC; |
11 | led : out unsigned (6 downto 0)); |
12 | end lauflicht; |
13 | |
14 | architecture Behavioral of lauflicht is |
15 | |
16 | signal Z: integer range 0 to n-1; |
17 | signal shift: unsigned(6 downto 0); |
18 | signal q_int: std_logic; |
19 | signal clken: std_logic; |
20 | |
21 | begin
|
22 | |
23 | -- signal assignments
|
24 | |
25 | q <= q_int; |
26 | led <= shift; |
27 | |
28 | -- Clock prescaler
|
29 | |
30 | clock: process (clk) |
31 | begin
|
32 | if rising_edge(clk) then |
33 | Z <= Z +1; |
34 | clken <= '0'; |
35 | if Z = (n-1) then |
36 | Z <= 0; |
37 | clken <= '1'; |
38 | q_int <= not q_int; |
39 | end if; |
40 | end if; |
41 | end process clock; |
42 | |
43 | -- Prozess des Lauflichts
|
44 | |
45 | lauflicht: process (clk) |
46 | begin
|
47 | if rising_edge(clk) then |
48 | if clken = '1' then |
49 | if(shift="0000001") then |
50 | shift <= "1000000"; |
51 | else
|
52 | shift <= shift srl 1; |
53 | end if; |
54 | end if; |
55 | end if; |
56 | end process lauflicht; |
57 | |
58 | end Behavioral; |
@ edneti (Gast) >Habe nun die verschiedenen Geschwindigkeiten mit eingefügt. Mit nur >einer Geschwindigkein konnte ich es kompilieren nun mit 3 nicht mehr. Dann solltest du endlich mal anfangen, die Grundlagen von VHDL zu lernen und nicht nur planlos rumprobieren! Mittels deiner Eingangssignale S1-S3 musst du EIN clock enable Signal auswählen, das dein Lauflicht steuert. Dazu gibt es viele Möglichkeiten.
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity lauflicht is |
6 | generic (n: integer := 50000000 |
7 | );
|
8 | Port ( clk : in STD_LOGIC; |
9 | y1 : out STD_LOGIC; |
10 | q : out STD_LOGIC; |
11 | control : in unsigned (1 downto 0); |
12 | led : out unsigned (6 downto 0)); |
13 | end lauflicht; |
14 | |
15 | architecture Behavioral of lauflicht is |
16 | |
17 | signal Z: integer range 0 to n-1; |
18 | signal div: integer range 0 to 100; |
19 | signal cnt: integer range 0 to 100; |
20 | signal shift: unsigned(6 downto 0); |
21 | signal q_int: std_logic; |
22 | signal clken: std_logic; |
23 | signal clken_var: std_logic; |
24 | |
25 | begin
|
26 | |
27 | -- signal assignments
|
28 | |
29 | q <= q_int; |
30 | led <= shift; |
31 | |
32 | -- Clock prescaler
|
33 | |
34 | clock: process (clk) |
35 | begin
|
36 | if rising_edge(clk) then |
37 | Z <= Z +1; |
38 | clken <= '0'; |
39 | if Z = (n-1) then |
40 | Z <= 0; |
41 | clken <= '1'; |
42 | q_int <= not q_int; |
43 | end if; |
44 | end if; |
45 | end process clock; |
46 | |
47 | -- prescaler selector
|
48 | |
49 | process (control) |
50 | begin
|
51 | case control is |
52 | when "00" => div <= 5; |
53 | when "01" => div <= 10; |
54 | when "10" => div <= 50; |
55 | when "11" => div <= 100; |
56 | when others => null; |
57 | end case; |
58 | end process; |
59 | |
60 | -- variable prescaler
|
61 | |
62 | process (clk) |
63 | begin
|
64 | if rising_edge(clk) then |
65 | clken_var <= '0'; |
66 | if clken='1' then |
67 | cnt <= cnt +1; |
68 | if cnt = div then |
69 | cnt <= 0; |
70 | clken_var <= '1'; |
71 | end if; |
72 | end if; |
73 | end if; |
74 | end process; |
75 | |
76 | -- Lauflicht
|
77 | |
78 | process (clk) |
79 | begin
|
80 | if rising_edge(clk) then |
81 | if clken_var = '1' then |
82 | if(shift="0000001") then |
83 | shift <= "1000000"; |
84 | else
|
85 | shift <= shift srl 1; |
86 | end if; |
87 | end if; |
88 | end if; |
89 | end process; |
90 | |
91 | end Behavioral; |
Ich danke euch für eure Bemühungen! Habt mir sehr geholfen. Vielen vielen dank! Hier ist nun das Endresultat mit einstellbarer Geschwindigkeit. Kompilieren war erfolgreich. Gibt es noch irgendwelche groben Mängel die der kompiler nicht erfasst hat?
edneti schrieb: > groben Mängel 1. Die Testbench fehlt und 2. Deine VHDL-Datei hat die Endung txt :-( Duke
edneti schrieb: > if clk='1' and clk'event then --L/H Flanke edneti schrieb: > if (rising_edge(clk)) then --L/H Flanke Dein Kommentar passt nicht zu der durch ihn beschriebenen Anweisung. Du solltest Dich dringend mit den Grundlagen von VHDL vertraut machen, d.h. insbesondere den IEEE 1164-Datentypen und den Wertebereichen. In Deiner ersten Anweisung fragst Du nämlich nicht eine L/H-Flanke ab, sondern einen beliebigen Wechsel zu 1. Und in der zweiten Anweisung wird ein beliebiger Wechsel von einem niedrigen zu einem hohen Pegel abgefragt, z.B. auch "0->1", "0->H", "L->1".
edneti schrieb: > Gibt es noch irgendwelche groben Mängel die der kompiler nicht erfasst > hat? Es ist ein Synthesizer, der deine VHDL Beschreibung zuerst in eine Netzliste übersetzt. Danach kommt der Mapper, der bausteinspezifische Komponenten einsetzt. Danach kommen Place&Route, die das Ganze im FPGA verdrahten. Danach wird der Bitstrom fürs FPGA erzeugt. Oder andersrum: sieh dir einfach mal deine Toolchain an... Und du solltest unbedingt die Sache mit dem Simulator anpacken. Das ist der Debugger der Hardware. Zum Thema "Lauflicht" siehe dort: http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html Und zum Thema "Simulation" das da: http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
:
Bearbeitet durch Moderator
Andreas S. schrieb: > In Deiner ersten Anweisung fragst Du nämlich nicht eine L/H-Flanke ab, > sondern einen beliebigen Wechsel zu 1. Mir war zwischenzeitlich aufgefallen, dass ich an der Stelle sogar ausführlich hätte sein können: Ein beliebiger Wechsel zu 1 kann auch bedeuten, dass er von H nach 1 erfolgt. Man könnte also in der Simulation(!) einen Taktgenerator bauen, der nur die Zustände 1 und H kennt, und damit munter sein System takten, wenn es das Konstrukt "if clk='1' and clk'event then" verwendet. Bei der Umsetzung in Hardware, d.h. FPGA/CPLD, wird da natürlich nichts getaktet, weil 1 und H natürlich einen eletrischen High-Pegel bedeuten.
Andreas S. schrieb: > Man könnte also in der > Simulation(!) einen Taktgenerator bauen, der nur die Zustände 1 und H > kennt, und damit munter sein System takten, wenn es das Konstrukt "if > clk='1' and clk'event then" verwendet. Theoretisch richtig, praktisch aber vollkommen irrelevant. Ich verwende rising_edge, weil damit der Code gut lesbar ist. Duke
Ich rate von eine Testbench ab. Es ist eine 2 Fehlerquelle die ein in die Irre führen kann. Mach dich mit dem konstruktiven Aufbau eine VHDL-Beschreibung vertraut. Die Handvoll Beschreibungsbefehle hat man schnell im Griff. Den Rest der Zeit verwendest du , um fein Säuberlich deine Aufbaubeschreibung zu durchforsten. Alle Konstrukte in VHDL werden in einem Takt gleichzeitig ausgeführt am Ende der Beschreibung. Das ist sehr wichtig. Bau dir kleine fertige Schaltungen zusammen UND/ODER... und setze die sozusagen in deine Schaltung ein...es ist eine wunderbare leichte Spielerei in kurzer Zeit. Gruss
otto schrieb: > Ich rate von eine Testbench ab. > Es ist eine 2 Fehlerquelle die ein in die Irre führen kann. Eine "Testbench" die lediglich einen Takt für die Darstellung einer Waveform erzeugt, kann nicht viele Fehler beinhalten...
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.