Ich soll ein Lauflicht in VHDL programmieren.
Habe schon alles mögliche versucht, aber Ich komme einfach nicht ans
Ziel.
So wurde die Aufgabe formuliert:
Erstellen Sie ein Schaltwerk, das mit den Dioden D1, … , D8 ein
Lauflicht realisiert. Es soll eine Diode leuchten. Verwenden Sie als
Taktsignal den Takt ClkLeft, der mit dem Modul ClkGen erzeugt wird. Bei
jeder positiven Taktflanke von ClkLeft wird die leuchtende LED um eine
Stelle nach rechts bewegt. Nach der LED D8 folgt die LED D1. Testen Sie
die Funktion mit dem Demoboard. Erzeugen Sie die Taktflanken zunächst
mit dem roten Taster. Wählen Sie danach verschiedene Frequenzen.
Erstellen Sie einen Schaltplan mit Funktionsblöcken, deren Funktion mit
VHDL definiert wird.
Die counter.vhd Datei ist die Datei, die Ich mir überlegt habe, aber es
funktioniert nicht so wie es soll.
Wo ist der Fehler den Ich gemacht habe ?
Mo schrieb:> aber es funktioniert nicht so wie es soll.
Was tut es stattdessen? Was sagt der Synthesizer? Und was sagt die
Simulation?
> if ClkLeft'event AND ModeLeft ='1' then
Sieh dir mal an, wie ein Takt beschrieben wird. Oder nimm einfach die
Funktion rising_edge().
BTW:
> Clk03Hz := not Clk03Hz;
So werden in FPGAs keine Takte erzeugt. Die Meldung dazu ist dann
irgendwas mit "skew" und "this is no good design practice"...
Die clkgen.vhd sowie die Datei CT.vhd wurde vorgegeben und gesagt, dass
sie verwendet werden sollen.
Wenn Ich das Programm auf das Board lade sollte ja theoretisch eine LED
leuchten, aber das passiert nicht.
Genauso wenn Ich den Taster für den Pulse betätige passiert nichts.
Wenn Ich mein *.vhd Programm Speicher wird nur angezeigt:
Done: design load finished with (0) errors, and (4) warnings
Und die Warnungen sind, dass verschiedene Komponenten der CT.vhd Datei
eine Black-Box bleiben, weil sie keine binding entity haben.
Du solltest dir das ClkGen-Modul genauer anschauen und ermitteln, was Du
da reinstecken mußt (das ist bislang noch nicht allzuviel...), damit das
rauskommt, was Du haben möchtest.
Außerdem noch ein Tip: in numeric_std gibt es die Funktionen rotate_left
und rotate_right (auf unsigned Vektoren, so daß Du gleich ein wenig
Typumwandlung üben kannst). Dein case-Statement kannst Du jedenfalls
damit deutlich kürzer schreiben.
Mo schrieb:> Wenn Ich das Programm auf das Board lade sollte ja theoretisch eine LED> leuchten, aber das passiert nicht. Genauso wenn Ich den Taster für den> Pulse betätige passiert nichts.Lothar M. schrieb:> Und was sagt die Simulation?
Denn der Simulator ist der Debugger für deine VHDL Beschreibung. Und
gerade so ein Lauflicht ist mit einem Simulator einfach zu debuggen...
Markus F. schrieb:> Du solltest dir das ClkGen-Modul genauer anschauen
Das Ding an sich ist schon haarsträubend: der Prozess Counter ist eine
Mischung aus Kombinatorik und getaktetem Prozess. Zudem ist seine
Sensitivliste unvollständig. Da passt die Simulation nie zur Realität...
Mo schrieb:> Die clkgen.vhd sowie die Datei CT.vhd wurde vorgegeben und gesagt, dass> sie verwendet werden sollen.
Ohne Fehlerkorrekturen?
Einfach man angenommen, du kannst das mit der vorgegebenen recht wirren
"Takterzegung" und deren Anwendung mal mit deinem Lehrer klären
(besprich mit dem dann auch, dass man mit solchen Teilern keine Takte
ableiten, sondern besser gleich mit Clock-Enables arbeiten sollte), dann
bleibt für dich ja "nur" das Lauflicht.
Und dessen Beschreibung läuft nach der Korrektur des dort nur mit 'event
abgefragten ClkLeft (das schaltet es bei jeder Flanke weiter, so ein
Verhalten bekommt man mit dem MacXO nicht hin, weil der keine DDR
Flipflops hat) auf rising_edge() tadellos durch die Simulation...
BTW: hast du bemerkt, dass ich nicht das Wort "Programm" für eine
"Hardwarebeschreibung" verwende? Ich erspare mir da einige Verwirrung.
Zudem schaltet mein Hirn bei "Programm" automatisch in den
"Softwaremodus"... ;-)
Ein Nachtrag: zum Thema Lauflicht noch ein Link auf (m)ein Lauflicht,
das mit Clock-Enables arbeitet. Das gesamte FPGA an sich läuft mit dem
"Masterclock", der dann für das Clock-Enable clken auf 3 Hz
heruntergeteilt wird:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
In dem Foto wird angezeigt wie Ich es umgesetzt habe.
So habe Ich mein Programm geschrieben:
library ieee;
use ieee.std_logic_1164.all;
use work.all;
library machxo2;
use machxo2.components.all;
entity licht is
port(
ClkLeft: in std_logic;
LED: out std_logic_vector(7 downto 0)
);
end entity licht;
architecture behaviour of licht is
signal LED_out: std_logic_vector(7 downto 0):="00000001";
begin
counter:process(ClkLeft)
begin
if rising_edge(ClkLeft) then
case LED_out is
when"00000001"=>LED_out<="00000010";
when"00000010"=>LED_out<="00000100";
when"00000100"=>LED_out<="00001000";
when"00001000"=>LED_out<="00010000";
when"00010000"=>LED_out<="00100000";
when"00100000"=>LED_out<="01000000";
when"01000000"=>LED_out<="10000000";
when"10000000"=>LED_out<="00000001";
when others => null;
end case;
end if;
end process counter;
LED<=LED_out;
end architecture behaviour;
Was schreibe Ich in die Simulation ?
Funktioniert das Programm so wie Ich es will ?
Mo schrieb:> Was schreibe Ich in die Simulation ?
Du legst einen Takt an. Fertig.
Es gelingt dir sicher, die TB aus dem vorletzten Post so abzuändern,
dass es passt.
> Funktioniert das Programm so wie Ich es will ?
Ob die Beschreibung das gewünschte Lauflicht ergibt, das siehst du dann
in der Simulation.
Auch wenn Ich für PulseLeft:='1' definiere wird wenn Ich den Simulation
Wizard ausführe wird da für PulseLeft = 0 angezeigt. Egal was Ich für
meine Eingänge eingebe passiert nichts.
###### licht_tb.vhd(68): ClkModeLeft<= "01" after 100ns, "10" after 500ns, "11" after 1000ns;
7
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
8
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
9
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
10
###### licht_tb.vhd(70): PulseLeft<= Not PulseLeft after 100ns;
11
** Warning: licht_tb.vhd(70): (vcom-1207) An abstract literal and an identifier must have a separator between them.
12
End time: 09:09:20 on Jan 14,2019, Elapsed time: 0:00:01
13
Errors: 0, Warnings: 4
Mo schrieb:> Wo muss Ich was ändern, damit die Signale irgendwas ausgeben ?
Hast Du auch wirklich die Testbench simuliert und nicht etwa das Modul?
Zur sicheren Unterscheidung haben bei mir alle Signale in der Testbench
den Prefix "tb_".
Duke