Lauflicht mit vorgegbenen Clkgen

Gast #5689331
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 ?
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #5689372
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"...
Gast #5690228
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.
#5690384
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.
Moderator (Firma: Titel) Persönliche Seite #5690826
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...
Moderator (Firma: Titel) Persönliche Seite #5690921
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
Angehängte Dateien:
Gast #5692274
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 ?
Angehängte Dateien:
Gast #5695179
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
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #5695293
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren