mikrocontroller.net

Forum: FPGA, VHDL & Co. Problem mit integer


Autor: Jens B. (sio2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
In Zeile 127 frage ich einen integer ab, den ich in Zeile 76 mit
signal offset : integer range 0 to 63;
definiert habe.
Sobald ich den offset in Zeile 127 auf =63 abfrage kommt folgender 
Fehler

ERROR:Xst:1534 - Sequential logic for node <offset> appears to be 
controlled by multiple clocks.

Stelle ich die Abfrage aber auf einen wert größer 63 Wird alles 
Systhetisiert.

Nach meinem verständniss müsste dann doch da eine Fehlermelduing kommen, 
weil offset nur bis 63 geht.



Im Selben Code kommt die Meldung:

WARNING:Xst:1989 - Unit <pwm>: instances <pwm1>, <pwm2> of unit 
<pwm_sub> are equivalent, second instance is removed

In RTL Schematic sind jedoch mehrere PWM enthalten, was hat diese 
Meldung zu sagen?


Danke

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, OK. den ersten Fehler hab ich gefunden.
Muss integer immer mit "<grossere zahl> to <kleinere Zahl> definiert 
werden?

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

Bewertung
0 lesenswert
nicht lesenswert
> Muss integer immer mit "<grossere zahl> to <kleinere Zahl> definiert
> werden?
Nein, eher andersrum...

Aber ich glaube fast, das ist dein allerkleinstes Problem...
 process (spi_clk,spi_reset,clock)  -- das gibt nmir zu denken: 2 Takte...
 begin
   if(spi_reset = '0')then  -- schon mal schlecht: ein asynchroner, kombinatorischer Reset
   :
   else                     -- aber danach sollte tunlichst ein Takt kommen...
     if (offset = 69) then
       if rising_edge(clock) then  -- tut er auch, aber als Gated-Clock  :-o
       :
       end if;
     else
       if(spi_en='0') then     -- und hier der Hammer:
         if rising_edge(spi_clk) then -- ein zweiter, unterschiedlicher Takt im selben Prozess...
         :
         end if;
       end if;
     end if;
   end if;
 end process;
Das kannst du im besten Fall simulieren. Aber trotz der 
Leistungsfähigkeit heutiger Synthesetools wirst du es kaum auf Hardware 
abgebildet bekommen...

Die Simulation wird allerdings nicht stimmen, denn offset und spi_en 
fehlen in der Sensitivliste.

Sieh dir doch mal an, wie andere einen getakteten Prozess beschreiben 
(und vor allem, wieviele Takte in einem solchen Prozess auftauchen).

BTW:
Statt
      pwm_new_value <= "0000000000000000000000000000000000000000000000000000000000000000";
kannst du auch
      pwm_new_value <= (others=>'0');
schreiben.

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> Muss integer immer mit "<grossere zahl> to <kleinere Zahl> definiert
>> werden?
> Nein, eher andersrum...

Sicher? Mit
signal offset : integer range 63 to 0;
Klappt es wie erwartet. Fehlermeldung bei zugriff auf 64, und keine bei 
63. Andersrum "0 to 63" kamen die (Meiner Meinung nach) unlogischen 
Fehler.


> Das kannst du im besten Fall simulieren. Aber trotz der
> Leistungsfähigkeit heutiger Synthesetools wirst du es kaum auf Hardware
> abgebildet bekommen...
>
Echt, irgendwas klappt, aber nich so wie erwarted :D

>Sieh dir doch mal an, wie andere einen getakteten Prozess beschreiben
>(und vor allem, wieviele Takte in einem solchen Prozess auftauchen).

Grr Hätte ich auch selbst draufkommen müssen.
Danke

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

Bewertung
0 lesenswert
nicht lesenswert
> Sicher? Mit
> signal offset : integer range 63 to 0;
> Klappt es wie erwartet.
Ich bekomme da den Fehler
  Null range: 63 to 0
Irgendwie auch logisch, wenn man sich ansieht, wie der Datentyp 
integer in VHDL definiert ist...

> Klappt es wie erwartet.
Welche Toolchain verwendest du?

EDIT:
Wobei auch 63 für deine Abfrage eindeutig zu klein ist:
    if (offset = 69) then

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISE Webpack 11.4.
Ich stöbere grade duch Deine HP (wenn sie es denn ist, mit Deinem 
Namen).
Mit den älteren hab ich irghendwie mehr Probleme auf meinem System, 
wobei die 11.4er einen Arschlahmen Editor hat.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> Sicher? Mit
>> signal offset : integer range 63 to 0;
>> Klappt es wie erwartet.
> Ich bekomme da den Fehler
>
>   Null range: 63 to 0
> 
> Irgendwie auch logisch, wenn man sich ansieht, wie der Datentyp
> integer in VHDL definiert ist...
>
Also entweder
signal offset : integer range 0 to 63;
oder
signal offset : integer range 63 downto 0;

Beides muß das selbe sein.

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Also entweder
>signal offset : integer range 0 to 63;
>oder
>signal offset : integer range 63 downto 0;

>Beides muß das selbe sein.

Denk auch, die Fehlermeldung wird wohl noch in zusammenhang mit anderen 
Dingen aufgetreten sein.

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.