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
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
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
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?
@Marcus W.:Ja, die Totzeit ist variabel. @Andi Z.und Lothar Miller: vielen Dank für ihren Hinweis
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
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 |
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
Okie,ich hab shon ob Fehler fixiert. Einfach file .ucf und .ngd erlöschen.
> 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.
Was machst du,wenn es die Anforderung(Pinout,Timing) in .ucf file gibt ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.