www.mikrocontroller.net

Forum: FPGA, VHDL & Co. warnungen nach synthese


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute. Ich bin ziemlicher Anfänger in VHDL und FPGA. Ich habe ein 
Nexysw Board von Digilant und wollte mir nun mal einen einfachen 
Zähler(finite_state_machine) bauen. es soll einen Asynchrone reset geben 
um das ganze zu stoppen und auf den Zustando zu bringen wo keine Led 
leuchtet. nach betätigen des start schalters sollen die 7 LED´s der 
reihe nach durch leuchten.....also die Zustände hoch zählen.

Bei der synthese des Quellcodes kommen mehrere Warnungen:
Par:288 - The signal AR_IBUF has no load.  PAR will not attempt to route 
this signal.
WARNING:Par:288 - The signal clock_IBUF has no load.  PAR will not 
attempt to route this signal.
WARNING:Par:288 - The signal start_IBUF has no load.  PAR will not 
attempt to route this signal.
WARNING:Par:283 - There are 3 loadless signals in this design. This 
design will cause Bitgen to issue DRC warnings.


Was mache ich Grundsätzlich falsch? wie gesagt, bin absoluter Beginner.
hier mein Quellcode

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Projekt_1 is
    Port ( led_1 : out  STD_LOGIC;
           led_2 : out  STD_LOGIC;
           led_3 : out  STD_LOGIC;
           led_4 : out  STD_LOGIC;
           led_5 : out  STD_LOGIC;
           led_6 : out  STD_LOGIC;
           led_7 : out  STD_LOGIC;
           AR : in  STD_LOGIC;
           start : in  STD_LOGIC;
        clock: in STD_LOGIC);
end Projekt_1;

architecture finite_state_machine of Projekt_1 is
signal state: STD_LOGIC_VECTOR(2 downto 0)  ;
begin
process (AR,clock)
begin
 if AR='1' then
     state <= "000" ;
 elsif rising_edge(clock) then
  case state is
  when "000" =>
   if start = '1' then state <= "001" ;
  --else state <="000" ;
   end if;
  when "001" => state <= "010" ; led_1 <='1';
  when "010" => state <= "011" ; led_2 <='1';
  when "011" => state <= "100" ; led_3 <='1';
  when "100" => state <= "101" ; led_4 <='1';
  when "101" => state <= "110" ; led_5 <='1';
  when "110" => state <= "111" ; led_6 <='1';
  when "111" => state <= "001" ; led_7 <='1';
  when others =>
  end case;
  end if;
  end process;

end finite_state_machine;


LG marco

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,
die Warnungen bedeuten: Die drei Signale AR, clock und start wurden als 
wirkungslos erkannt und herausoptimiert. Und Recht hat er, der Compiler!

Ein kleiner Hinweis (von VHDL-Anfänger zu VHDL-Anfänger): Wer schaltet 
unter welcher Bedingung die led_x aus?

Grüße
Bernhard

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marco
> Ein kleiner Hinweis (von VHDL-Anfänger zu VHDL-Anfänger):
> Wer schaltet unter welcher Bedingung die led_x aus?
Berhard hat recht.
Warum beschreibst du jede LED einzeln. Das ist doch auch nur ein Vector.
Also:
entity Projekt_1 is
    Port ( led : out  STD_LOGIC_VECTOR(7 downto 0);
           AR : in  STD_LOGIC;
           start : in  STD_LOGIC;
        clock: in STD_LOGIC);
end Projekt_1;

architecture sogehtsbesser of Projekt_1 is
signal leds: STD_LOGIC_VECTOR(7 downto 0)  ;
begin
  process (AR,clock)
  begin
    if AR='1' then              -- nein, ICH würde einen asynchronen Reset nicht verwenden
      leds <= "00000000" ;    -- auch wenn das so in allen Lehrbüchern steht ;-)
    elsif rising_edge(clock) then
      if (start='1') then  leds <= "00000001";  end if; -- wenn Start, dann Led einschalten
      leds <= leds(6 downto 0) & led(7); -- immer rotieren
    end if;
  end process;
  led <= leds;
end sogehtsbesser;

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal schönen Dank für die Antworten.

 leds <= leds(6 downto 0) & led(7);
 diese zeile verstehe ich nicht ganz. was passiert hier genau ?

Leider bin ich noch ein absoluter VHDL-anfänger und muss scheinbar 
erstmal grundsätzlich umdenken. In den Vorlesungen für systementwürfe 
lernen wir einen algorithmus wie man sequetielle Schaltungen einfach 
realisieren kann. Wir beziehen uns dann immer auf Automatenstrukturen. 
(ansteuerkombinatorik + Zustandspeicher + Ausgabekombinatorik) .
Ich habe leider noch keine Vorlesung zu VHDL gehört, deshalb versuche 
ich das alles mit der Automatenstruktur zu machen. Aber das ist wohl in 
VHDL nicht die effitienteste Variante oder? Bitte gebt mir mal einen 
Tip?

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> leds <= leds(6 downto 0) & led(7);

& ist der Verkettungsoperator:  "0000" & "1111" ist "00001111"

Mit leds(6 downto 0) & led(7). nimmst du also das siebte Element links 
weg und hängst es rechts wieder dran, alle anderen Elemente rutschen 
dabei um eins nach links.

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,
in der Vorlesung hörst Du, was ein Automat ist. Die Realisierung, also 
wie der Automat implementiert wird, das ist Sache der 
Implementierungswerkzeuge. In diesem Fall erfolgt die Implementierung 
also per VHDL in einem FPGA.
Das sind - grob gesprochen - unterschiedliche Abstraktionsebenen.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jan , danke jetzt verstehe ich es .

@ Bernhard,

ja ich weis schon. Aber in der Hochschule stellen wir uns eine 
sequentielle Aufgabe und lösen sie anhand eines gelernten Ablaufs.

1. Zusatandsgraph mit transitionen erstellen
2. Zustandsfolgetabelle aufstellen
3. mittels einer KT minimieren
4.... aus der Schaltfunktion zeichnen wir uns dann die Schaltung .
Meistens besteht diese aus einer zweistufigen Ansteuerkombinatorik, 
einen DFF und einer zweistufigen Ausgabekombinatorik. Meistens ist das 
vom Timing verhalten die beste Variante. Das Problem scheint mit VHDL zu 
sein, dass ich die Schaltung so nicht eins zu eins nachbauen kann, weil 
die Synthesewerkzeuge eh machen was sie wollen.
Nur was nützt mir der ganze Entwurfsaufwand, wenn ich es so nicht in 
VHDL umsetzen kann ???

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Marco

Es gibt durchaus die Möglichkeit, die Schaltung per Schematic-Editor zu 
erzeugen. Beim Erstellen eines Source-Files über den "New Source" Dialog 
lautet eine Auswahl "Schematic". Ich habe das allerdings noch nie so 
gemacht.

Bernhard

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marco,
dein erster Versuch war durchaus nicht so falsch.

Das Problem war nur, dass Deine Kode die einzelnen LEDs niemals 
ausgeschalten hat. Deshalb hat der Compiler die einzelnen LEDs fest auf 
'1' gelegt, den Rest der Schaltung als unnötig erachtet und 
wegoptimiert.

Wenn Du deinen Kode so änderst, dass in jedem State die anderen LEDs 
ausgeschalten werden, dann funktionierts.

Zusätzlich gibt es in deinem Kode eben ein paar 
Verbesserungsmöglichkeiten.
Die wichtigste ist, dass man mehrere ähnliche Signale zu einem Vektor 
zusammenfasst; also nicht LED_1, LED_2 ... usw. sondern LED als 
STD_LOGIC_VECTOR(7 downto 0) deklariert.

Zur Vorgangsweise die Du in der Vorlesung lernst ist zu sagen, dass sie 
im Prinzip schon richtig ist. Nur wird heutzutage vieles eben dem 
Compiler überlassen. Zustandsgraphen wird man weiterhin verwenden, aber 
die ganze Minimierung, die komplette Berechung der Kombinatorik macht 
der Compiler. Das spart Zeit und Aufwand.

Klaus

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Falser wrote
> @Marco,
> dein erster Versuch war durchaus nicht so falsch.
ACK.

Ich wollte erst mal zeigen, dass sowas kürzer und übersichtlicher 
beschrieben werden kann.
           led_1 : out  STD_LOGIC;
           led_2 : out  STD_LOGIC;
           led_3 : out  STD_LOGIC;
           led_4 : out  STD_LOGIC;
           led_5 : out  STD_LOGIC;
           led_6 : out  STD_LOGIC;
           led_7 : out  STD_LOGIC;

Und zwar mit
           led : out  STD_LOGIC_VECTOR[7 downto 1];

War mein Versehen, übersehen zu haben, dass dein Vector nicht bei Led_0 
beginnt. In der binären Welt ist die Zählweise ab D(0) und A(0) z.B. für 
Adress- und Datenleitungen üblich.


Klaus Falser ist übrigens auch drauf reingefallen  ;-)
> sondern LED als STD_LOGIC_VECTOR(7 downto 0) deklariert.


> Nur wird heutzutage vieles eben dem Compiler überlassen.
Und das ist auch besser so, schliesslich ist es "nur" reine Rechen- und 
Tabellenarbeit.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da hast du recht. In der digitalenwelt gehts immer bei Null los. das 
sollte ich für die Übersicht bei den LED´s auch so machen.

Nochmals vielen Dank für eure Antworten. Jetzt bin ich ein ganzes Stück 
weiter und kann mal voll durchstarten.

LG Marco

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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