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


von Michael M. (Firma: Uni Hannover) (babybk)


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

von Andi Z. (duderino65)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
:
2
elsif rising_edge(PWM_in) then         --- Nummer 1
3
   Totzeit_count <= Totzeit;
4
   if rising_edge(clk) then            --- Nummer 2
5
      counter <=counter + '1';
6
      if   falling_edge(PWM_in)  then  --- Nummer 3
7
      :
8
:
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-Totzeit-fuer-H-Bruecke.html

von Marcus W. (Gast)


Lesenswert?

Das Konstrukt ist nicht zulässig:
1
if (reset = '1') then
2
  ...
3
elsif rising_edge(PWM_in) then
4
  ...
5
  if rising_edge(clk) then
6
     ...

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

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

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

von Michael M. (Firma: Uni Hannover) (babybk)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

Das ist ungünstig plaziert:
1
process(clk)
2
begin
3
  tot <= to_integer(unsigned(tdead));
4
  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:
1
tot <= to_integer(unsigned(tdead));
2
3
process(clk)
4
begin
5
  If rising_edge(clk) then

von Michael M. (Firma: Uni Hannover) (babybk)


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

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Michael M. (Firma: Uni Hannover) (babybk)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.