mikrocontroller.net

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


Autor: Mo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"...

Autor: Mo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...
library ieee;
use ieee.std_logic_1164.all;

entity licht is 
  port( 
    LED: out std_logic_vector(7 downto 0);
    ModeLeft: in std_logic;
    ClkLeft: in std_logic   -- prellfreier Taster
    );
end entity licht;

architecture behaviour of licht is 

  signal LED_out: std_logic_vector(7 downto 0) := "00000001";
  signal ClkModeLeft: std_logic_vector(1 downto 0);
  
begin  

    
Counter: process(ClkLeft,ModeLeft) is 
begin
      if rising_edge(ClkLeft) AND ModeLeft ='1'  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;

Die Waveforms (WF_Lauflicht_event = Beschreibung von oben, 
WF_Lauflicht_risingedge = ok) wurden mit dieser Testbench erzeugt:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY tb_lauflicht IS
END tb_lauflicht;
 
ARCHITECTURE behavior OF tb_lauflicht IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
    COMPONENT licht
    PORT(
         LED : OUT  std_logic_vector(7 downto 0);
         ModeLeft : IN  std_logic;
         ClkLeft : IN  std_logic
        );
    END COMPONENT;
  
   signal ModeLeft : std_logic := '0';
   signal ClkLeft : std_logic := '0';
   signal LED : std_logic_vector(7 downto 0);

BEGIN
 
  -- Instantiate the Unit Under Test (UUT)
   uut: licht PORT MAP (LED => LED, ModeLeft => ModeLeft, ClkLeft => ClkLeft);

   -- einfach mal ein paar Tastendrücke simulieren
   ClkLeft <= not ClkLeft after 50 ns; 
   
   -- Test: bleibt das Lauflicht ohne Enable stehen?
   ModeLeft <= '1' after 200 ns, '0' after 700 ns, '1' after 1000 ns; 

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
Autor: Mo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang ist die Simulationsdatei und was Ich in die Simulation 
geschrieben habe.

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

Autor: Mo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir kommen in der Testbench ein paar Warnungen:
$ vcom *.vhd
vcom licht.vhd licht_tb.vhd
Model Technology ModelSim SE-64 vcom 10.6c Compiler 2017.07 Jul 26 2017
:
:
###### licht_tb.vhd(68):        ClkModeLeft<= "01" after 100ns, "10" after 500ns, "11" after 1000ns;
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
** Warning: licht_tb.vhd(68): (vcom-1207) An abstract literal and an identifier must have a separator between them.
###### licht_tb.vhd(70):        PulseLeft<= Not PulseLeft after 100ns;
** Warning: licht_tb.vhd(70): (vcom-1207) An abstract literal and an identifier must have a separator between them.
End time: 09:09:20 on Jan 14,2019, Elapsed time: 0:00:01
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

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
-- Ist:
   ClkModeLeft<= "01" after 100ns, "10" after 500ns, "11" after 1000ns;
-- Soll:
   ClkModeLeft<= "01" after 100 ns, "10" after 500 ns, "11" after 1000 ns;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.