Forum: FPGA, VHDL & Co. Lauflicht mit vorgegbenen Clkgen


von Mo (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Mo (Gast)


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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...
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity licht is 
5
  port( 
6
    LED: out std_logic_vector(7 downto 0);
7
    ModeLeft: in std_logic;
8
    ClkLeft: in std_logic   -- prellfreier Taster
9
    );
10
end entity licht;
11
12
architecture behaviour of licht is 
13
14
  signal LED_out: std_logic_vector(7 downto 0) := "00000001";
15
  signal ClkModeLeft: std_logic_vector(1 downto 0);
16
  
17
begin  
18
19
    
20
Counter: process(ClkLeft,ModeLeft) is 
21
begin
22
      if rising_edge(ClkLeft) AND ModeLeft ='1'  then 
23
       case LED_out is 
24
        when "00000001" =>LED_out <="00000010";
25
        when "00000010" =>LED_out <="00000100";
26
        when "00000100" =>LED_out <="00001000";
27
        when "00001000" =>LED_out <="00010000";
28
        when "00010000" =>LED_out <="00100000";
29
        when "00100000" =>LED_out <="01000000";
30
        when "01000000" =>LED_out <="10000000";
31
        when "10000000" =>LED_out <="00000001";
32
        when others => null;
33
      end case;
34
      end if;
35
36
end process Counter;
37
38
39
 LED<=LED_out;
40
41
end architecture behaviour;

Die Waveforms (WF_Lauflicht_event = Beschreibung von oben, 
WF_Lauflicht_risingedge = ok) wurden mit dieser Testbench erzeugt:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
4
ENTITY tb_lauflicht IS
5
END tb_lauflicht;
6
 
7
ARCHITECTURE behavior OF tb_lauflicht IS 
8
 
9
    -- Component Declaration for the Unit Under Test (UUT)
10
    COMPONENT licht
11
    PORT(
12
         LED : OUT  std_logic_vector(7 downto 0);
13
         ModeLeft : IN  std_logic;
14
         ClkLeft : IN  std_logic
15
        );
16
    END COMPONENT;
17
  
18
   signal ModeLeft : std_logic := '0';
19
   signal ClkLeft : std_logic := '0';
20
   signal LED : std_logic_vector(7 downto 0);
21
22
BEGIN
23
 
24
  -- Instantiate the Unit Under Test (UUT)
25
   uut: licht PORT MAP (LED => LED, ModeLeft => ModeLeft, ClkLeft => ClkLeft);
26
27
   -- einfach mal ein paar Tastendrücke simulieren
28
   ClkLeft <= not ClkLeft after 50 ns; 
29
   
30
   -- Test: bleibt das Lauflicht ohne Enable stehen?
31
   ModeLeft <= '1' after 200 ns, '0' after 700 ns, '1' after 1000 ns; 
32
33
END;

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

: Bearbeitet durch Moderator
von Mo (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Mo (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ist die Simulationsdatei und was Ich in die Simulation 
geschrieben habe.

Wo muss Ich was ändern, damit die Signale irgendwas ausgeben ?

von Mo (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Bei mir kommen in der Testbench ein paar Warnungen:
1
$ vcom *.vhd
2
vcom licht.vhd licht_tb.vhd
3
Model Technology ModelSim SE-64 vcom 10.6c Compiler 2017.07 Jul 26 2017
4
:
5
:
6
###### 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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> An abstract literal and an identifier must have a separator between them.
Da bin ich froh, dass diesen Fehler nicht ich ins Spiel gebracht habe... 
;-)

Mit Google zeigt schon der erste Treffer die Lösung:
https://www.google.com/search?q=An+abstract+literal+and+an+identifier+must+have+a+separator+between+them
1
-- Ist:
2
   ClkModeLeft<= "01" after 100ns, "10" after 500ns, "11" after 1000ns;
3
-- Soll:
4
   ClkModeLeft<= "01" after 100 ns, "10" after 500 ns, "11" after 1000 ns;

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.