mikrocontroller.net

Forum: FPGA, VHDL & Co. Wie kann ich ''ERROR:Xst:2108'' fixieren?


Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
 ich hab 2 PWM signal.Zweite PWM signal wird aus erste PWM signal 
invertiert.
Um der Kurzschluss zu vermeiden,muss ich die Totzeit einstellen.

Hier ist meine Code:

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


entity Totzeit_block is
    Port ( clk : in  STD_LOGIC;
           Totzeit : in  STD_LOGIC_VECTOR(6 downto 0);
      reset :in STD_LOGIC;
           PWM_in : in  STD_LOGIC;
           PWM_out : out  STD_LOGIC
          );
end Totzeit_block;

architecture Behavioral of Totzeit_block is

signal counter: std_logic_vector(6 downto 0);
signal Totzeit_count: std_logic_vector(6 downto 0);

begin
process(clk,reset,PWM_in)
begin
if (reset = '1') then
  counter <= (others =>'0');
  Totzeit_count <= (others =>'0');
elsif rising_edge(PWM_in) then
  Totzeit_count <= Totzeit;
  if rising_edge(clk) then
    counter <=counter + '1';
                if   falling_edge(PWM_in)  then
        if (counter <= Totzeit_count) then
                PWM_out <= '0';
        else
          PWM_out <= PWM_in;

        end if;
    counter <=(others =>'0');
    end if;

  end if;
end if;
end process;

end Behavioral;''

und dann mache ich Synthesize-XST
--> entsteht 2 Error:

ERROR:Xst:2108 - Logic for signal <counter> is controlled by a clock but 
does not appear to be a valid sequential description.
ERROR:Xst:1431 - Failed to synthesize unit <Totzeit_block>.


Jemand kann mir helfen?
Danke im Voraus

Michael

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
du kannst in einem Prozess nicht auf 2 Flanken prüfen.

also:

elsif rising_edge(PWM_in) then    <- ok
  Totzeit_count <= Totzeit;
  if rising_edge(clk) then        <- nicht mehr ok


mfg

Andi

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

Bewertung
0 lesenswert
nicht lesenswert
:
elsif rising_edge(PWM_in) then         --- Nummer 1
   Totzeit_count <= Totzeit;
   if rising_edge(clk) then            --- Nummer 2
      counter <=counter + '1';
      if   falling_edge(PWM_in)  then  --- Nummer 3
      :
:
Drei Takte...
Das geht nicht. Es kann nur einen Takt im Prozess geben. Denn dieses 
Design soll auf ein (oder mehrere) Flipflop abgebildet werden, das nur 1 
Takteingang hat.

Du brauchst einen anderen Ansatz. So habe ich das realisiert:
http://www.lothar-miller.de/s9y/archives/58-Totzei...

Autor: Marcus W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Konstrukt ist nicht zulässig:
if (reset = '1') then
  ...
elsif rising_edge(PWM_in) then
  ...
  if rising_edge(clk) then
     ...

Muss die Totzeit variabel sein oder reicht eine definierte Verzögerung?

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marcus W.:Ja, die Totzeit ist variabel.
@Andi Z.und Lothar Miller: vielen Dank für ihren Hinweis

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Lothar Miller für deinen Code.Jetzt will ich etwas verändern,und 
zwar:

tdead will ich wie ein Eingang und kann steuern durch Schalter von 
Spartan 3.

Aber entsteht der folgende Fehler
"ERROR:Xst:1546 - "C:/PWM_SC_ohne RS232/PWM_SC/PWM_totzeit.vhd" line 38: 
Constant value expected for expression (tot <s>- 1)
ERROR:Xst:2683 - Unexpected error found while building hierarchy."

Hier ist der Code

"library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity PWM_totzeit is
    Port ( clk : in  STD_LOGIC;
           pwm_in : in  STD_LOGIC;
        tdead : in  std_logic_vector(3 downto 0);
           pwm_out : out  STD_LOGIC);
end PWM_totzeit;

architecture Behavioral of PWM_totzeit is
signal tot :integer range 0 to 15;
signal delay : integer range 0 to (tot-1) := 0;
begin
process(clk)
begin
  tot <= to_integer(unsigned(tdead));
  If rising_edge(clk) then
      if (pwm_in='0') then         -- Deaktivieren:
         pwm_out  <= '0';          -- sofort ausschalten
         delay <= 0;               -- Verzögerungszähler zurücksetzen
      else                         -- Aktivieren: verzögert einschalten
         if (delay < tot-1) then -- Zähler abgelaufen?
            delay <= delay+1;      -- n: weiterzählen
         else
            pwm_out  <= '1';       -- j: High
         end if;
      end if;
  end if;
end process;

end Behavioral;"


Danke im Voraus für eurere Antwort

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

Bewertung
0 lesenswert
nicht lesenswert
Signaldefinitionen können nicht dynamisch verwaltet werden.
Besser so:
  signal delay : integer range 0 to 15 := 0;

Das ist ungünstig plaziert:
process(clk)
begin
  tot <= to_integer(unsigned(tdead));
  If rising_edge(clk) then
Der Prozess ist nur auf CLK sensitiv, deshalb sieht es in der 
Simulation aus, als ob tot einen Takt Latency hätte :-o

Richtig wäre eine Concurrent-Zuweisung:
tot <= to_integer(unsigned(tdead));

process(clk)
begin
  If rising_edge(clk) then

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderbar,es gibt kein Fehler mehr.

Aber ich kann nicht Floorplan IO wegen des Fehlers"ERROR:HDLParsers:3562 
- pepExtractor.prj line 1  Expecting 'vhdl' or 'verilog'   keyword, 
found 'work'." definieren.

Ich hab wie folgender Hinweis gemacht,aber geht nicht.Ich hab diesen 
Fehler sehr viel Mal getroffen.Manchmal muss ich alles wieder 
machen(alle Blocke verbinden usw...) und es kostet Zeit,hic.

"Solution
This occurs when there are spaces embedded in the project location.

A bad example for project location would be:
C:/Documents and Settings/User/example.ise.

A good example fpr project location would be:
C:/ISE_tests/example.ise."

Es wäre sehr nett,wenn du mir noch Mal helfen kannst.
Vielen Dank

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okie,ich hab shon ob Fehler fixiert.
Einfach file .ucf und .ngd erlöschen.

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

Bewertung
0 lesenswert
nicht lesenswert
> Einfach file .ucf ...  löschen.
Naja, wenn da nichts Wichtiges drinsteht...   :-/
UCF = User Constraints File
Dort stehen deine Systemanforderungen. Wenn du keine Anforderungen 
(Pinout, Timing) hast, kannst du die Datei einfach löschen.

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was machst du,wenn es die Anforderung(Pinout,Timing) in .ucf file gibt ?

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

Bewertung
0 lesenswert
nicht lesenswert
Im UCF-File stehen meine Anforderungen an die Toolchain bzgl. 
Platzierung, Pinout und Timing. In VDHL-Files stehen Anforderungen 
bezüglich des Verhaltens. Die UCF und VHD Dateien müssen zusammenpassen 
und bestimmen das Verhalten des Gesamtdesigns.

Wenn du jetzt sagst, das Problem ist weg, wenn du die UCF-Datei löschst, 
dann hast du genau in dieser Datei einen Fehler. Eine UCF Datei ist 
nichts geheimnisvolles, sondern eine normale Textdatei mit einem eigenen 
Syntax.

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau,du hasr Recht.
Nachdem ucf file erlöscht wird,ich kann nicht neu ucf file von Haupt 
schematik erzeugen sondern nur ucf file von andere Block,die ich nicht 
erwünsche.

Was soll ich machen?

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.