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.
@ 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.
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:> if clk='1' and clk'event then --L/H Flankeedneti 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 VHDLBeschreibung 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
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...