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.