Wie kann ich ''ERROR:Xst:2108'' fixieren?

OP (Firma: Uni Hannover) #1488674
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
Moderator (Firma: Titel) Persönliche Seite #1488699
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
Gast #1488703
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?
OP (Firma: Uni Hannover) #1492682
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
Moderator (Firma: Titel) Persönliche Seite #1492692
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
OP (Firma: Uni Hannover) #1492716
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
Moderator (Firma: Titel) Persönliche Seite #1492788
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren