Datum:
ich habe eine Aufgabe.Und zwar muss ich eine logische Schaltung mit verzögertem Ausgang gemäß Eingangssinal entwurfen. Eingangssignal ist s, s nimmt 3 Zustände: 0,1 und -1 Ausgangssignale sind t1,t2,t3,t4 wenn s=1--> t1,t2=1 und t3,t4=0 wenn s=0--> t1=0, t2,t3=1, t4=0 wenn s=-1--> t1,t2=0 und t3,t4=1 während der Umschaltsvorgänge von s=1 auf s=0 oder s=-1 auf s=0 usw. passiert eine Verzögerung am Ausgang Beispiel für den Fall s=1 oder s=-1 auf s=0: if s'event and s="00" then t1<='0'; if s'last_value="11" then -- hier ist s=-1 gleich s="11" t2<='1' after 2 ns; t3<='1'; else t3<='1' after 2 ns; t2<='1'; end if; t4<='0'; end if; Bei der Simulation mit Modelsim XE war es kein Problem Bei der Synthese kam einige Probleme: 1.s'event und s="00" sind nicht gleicher Typ 2.synthesis Tools unterstützen nicht die Attribute s'last_value und die after-Anweisung Frage: Wie kann ich diese Probleme aufheben?
Datum:
@ Tuan (Gast) >if s'event and s="00" then > t1<='0'; > if s'last_value="11" then -- hier ist s=-1 gleich s="11" > t2<='1' after 2 ns; > t3<='1'; > else > t3<='1' after 2 ns; > t2<='1'; > end if; > t4<='0'; >end if; Solche Sachen mit "after 2ns" und s'last_value sind nicht synthetisierbar, die kann man nur zum simulieren verwenden. >Wie kann ich diese Probleme aufheben? Was soll denn überhaupt rauskommen? Eine Verzögerung von 2ns haben die meisten Logikbaustein sowieso. MFG Falk
Datum:
Danke Falk für die schnelle Antwort, also ich benutze ISE Webpack von Xilinx und möchte von VHDL-Code ein RTL Schematik zu erzeugen, aber wie schon gesagt, meine Code konnte nicht synthesiert werden, deswegen. ( diese Schematik wird automatisch erzeugt, wenn Synthesevorgang problemlos ausgeführt wurde ) MFG, Tuan
Datum:
@ Tuan (Gast) >also ich benutze ISE Webpack von Xilinx und möchte von VHDL-Code ein RTL >Schematik zu erzeugen, Schon klar, aber was soll dein Code machen? SDRAM Ansteuerung? MfG Falk
Datum:
Nein, ich möchte einen 3 Punkt Wechselrichter ansteuern. Ich weiß nicht ob es noch irgendeine Methode gibt, um ein RTL Schematik zu erstellen, natürlich aus VHDL code.
Datum:
@ Tuan (Gast) >Nein, ich möchte einen 3 Punkt Wechselrichter ansteuern. Gut. Du willst dann sicherlich sowas wie Dead Time einstellen, damit die Transistoren einer Halbbrücke nicht gleichzeitg leiten und die Versorgungsspannung kurzschliessen. Das macht man anders. Du brauchst einen schnellen Takt (einige MHz) und einen Zähler. Mittels Zähler kodierst du dann, Transistor auschalten, ein paar Takte warten, Transistor einschalten. >Ich weiß nicht ob es noch irgendeine Methode gibt, um ein RTL Schematik >zu erstellen, natürlich aus VHDL code. Wozu? Aber in ISE gibt es einen Schematics Viewer, der die aktuelle Schaltung als Blockdiagramm anzeigen kann. MFG Falk
Datum:
Vielen Dank für neue Idee, du hast ganz genau meine Aufgabe verstanden. Und für sowas "Du brauchst einen schnellen Takt (einige MHz) und einen Zähler. Mittels Zähler kodierst du dann, Transistor auschalten, ein paar Takte warten, Transistor einschalten" kann ich auch mit VHDL gehen? Schneller Takt ist hier clock, meinst du? MFG. Tuan
Datum:
@ Tuan (Gast) >ich lerne VHDL seit 1 Woche, kannst du mal zeigen, wie ich " warten ein >paar Takte" in VHDL schreiben kann ( also auch synthetisierbar) Die Frage ist vor allem. Welche Kenntnisse hast du von Digitaltechnik? VHDL ist "nur" ein modernes Werkzeug. Ohne diese Kenntnisse wirst du mit VHDL nicht viel Erfolg haben.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cnt is Port ( clk : in std_logic; p1 : out std_logic; p2 : out std_logic; p3 : out std_logic); end cnt; architecture Behavioral of cnt is signal cnt: std_logic_vector(3 downto 0); begin process(clk) begin if rising_edge(clk) then cnt <= cnt +1; if cnt=2 then p1 <= '1'; else p1<='0'; end if; if cnt=7 then p2 <= '1'; else p2<='0'; end if; if cnt=12 then p3 <= '1'; else p3<='0'; end if; end if; end process; end Behavioral; |
MFG Falk
Datum:
Ich möchte noch eine andere Lösungsmöglickeit vorschlagen: Dazu müssen in meinem Fall zwei weitere Signal deklariert werden, da ich das Eingangssignal um 2 Taktzyklen verzögern möchte. Nach 2 Taktzyklen hat dann auch oe_d2 den Wert von oe_s angenommen. Verstanden?
-- purpose : delays oe_s by 2 clk_108MHz_s clock cycles -- type : sequential -- inputs : oe_s, clk_108MHz_s, rst_108MHz_s -- outputs : oe_d1 d_manager_write : process (clk_108MHz_s, rst_108MHz_s) begin -- process data_out_manager if rst_108MHz_s = '0' then -- asynchronous reset (active low) oe_d1 <= '1'; oe_d2 <= '1'; elsif clk_108MHz_s'event and clk_108MHz_s = '1' then oe_d1 <= oe_s; oe_d2 <= oe_d1; end if; end process d_manager_write; |
Datum:
@ hhanff danke für deinen Vorschlag. der Ausgang ist hier oe_d1 oder oe_d2?
Datum:
Hallo,
ich habe versucht, soweit mit deinem Hinweis zu gehen aber es hat nicht
gelungen.
Die Aufgabe sieht ausführlich so aus:
die Eingangssignale sind s mit dem Typ std_logic_vector (1 downto 0)
die Ausgangssignale sollen t1, t2 , t3, t4 im Typ std_logic sein
s hat drei Zustände : 1,0 , -1 , die in 2Bit signal so kodiert werden:
"00" für 0
"11" für -1
"10" oder "01" für 1
wenn s umschaltet, zB von -1 auf 0,dh "11" auf "00" sollen
t1<='0';
t3<='1';
t4<='0';
t2 soll nach eine Verzögerung ( beliebig ) eingeschaltet wird.
meine .vhd code
if (s(0)'event and s(0)='0') und (s(1)'event und s(1)='0') then
t1<='0';
t3<='0';
t4<='0';
meine Frage:
für die Verzögerung beim Einschalten des t2 habe ich after-Anweisung
verwendet, aber wie ich gewusst habe,dass after-Anweisung bei der
Synthese ignoriert wird.
ich habe auch mal mit einen Zähler versucht, um diese Verzögerung zu
lösen aber es geht nicht
code mit zähler
entity igbt is
generic (limit: integer :=10);
Port ( clk : in STD_LOGIC;
s : in STD_LOGIC_VECTOR (1 downto 0);
reset : in STD_LOGIC;
t1 : out STD_LOGIC;
t2 : out STD_LOGIC;
t3 : out STD_LOGIC;
t4 : out STD_LOGIC);
end igbt;
architecture Behavioral of igbt is
signal counter: integer RANGE 0 to 10;
begin
process(s,clk,reset)
variable enable : std_ulogic;
begin
if (s(0)'event and s(0)='0') and (s(1)'event and s(1)='0') then
t1<='0';
t3<='1';
t4<='0';
enable:='1';
if reset='1' then
counter<=0;
elsif (clk'event and clk='1') then
counter<=0;
if enable ='1' then
if (counter< limit) then
counter<=counter+1;
else
t2<='1';
enable:='0';
end if;
end if;
end if;
end if;
end process;
end Behavioral;
die obere VHDL-code liefert natürlich kein erwartetes Ergebnis weil der
innere if-Befehl nur einmal ausgeführt wird.
hast du irgendeine Idee um diese Verzögerung in VHDL zu lösen?
Mit freundlichen Grüßen
Tuan
Datum:
@ Tuan (Gast)
if (s(0)'event and s(0)='0') und (s(1)'event und s(1)='0') then |
So was macht man schon mal gar nicht. Das mit 'event ist nur für echte Takte gut. >für die Verzögerung beim Einschalten des t2 habe ich after-Anweisung >verwendet, aber wie ich gewusst habe,dass after-Anweisung bei der >Synthese ignoriert wird. Warum hast du sie dann verwendet??? >ich habe auch mal mit einen Zähler versucht, um diese Verzögerung zu >lösen aber es geht nicht Doch. >die obere VHDL-code liefert natürlich kein erwartetes Ergebnis weil der >innere if-Befehl nur einmal ausgeführt wird. Dein Code ist totaler Murks. Tut mir leid. >hast du irgendeine Idee um diese Verzögerung in VHDL zu lösen? Ja, lies mein Posting nochmal und denk drüber nach. Und beschäftige dich mit den Grundlagen von Digitaldesign und VHDL. Das kann man nicht in drei Sätzen vermitteln. VHDL FAQ MFG Falk
Datum:
Hallo Falk, na gut, ich weiß schon dass mein Code falsch ist. Mittels deines obigen Postings ist es klar, niemals die Transistoren gleichzeitig leiten. Aber mit diesem Verfahren kommt es zu einer Unflexibilität weil 3 Punkt WR immer in einem festen Programm funktionieren muss. MFG Tuan.
Datum:
@ Tuan (Gast) >Aber mit diesem Verfahren kommt es zu einer Unflexibilität weil 3 Punkt WR >immer in einem festen Programm funktionieren muss. ??? Das war ein Beispiel! Man kann eine Steuerung durchaus mit Eingängen versehen, woduch der Ablauf beeinflusst werden kann. Auch in VHDL. MFG Falk
Datum:
@ Falk
> Man kann eine Steuerung durchaus mit Eingängen
versehen, woduch der Ablauf beeinflusst werden kann
meinst du reset und enable und count_direction? Ich kann mir nicht
vorstellen.
MFG
tuan
Datum:
@ Tuan (Gast) >meinst du reset und enable und count_direction? Zum Beispiel. Doch dazu musst du erstmal KLAR formulieren, was die Schaltung machen soll. Am besten mit Zeitdiagrammen. DANN kann man das in VHDL umsetzen. > Ich kann mir nicht vorstellen. MFG Falk
Datum:
Angehängte Dateien:@ Falk hier ist die Schaltung und der Zeitdiagramm. 3 Punkt WR soll die Blockspannung am Ausgang liefern, deren Grundschwingung mit einer Sollschwingung entspricht. Mit diesem Diagramm habe ich versucht, das VHDL code zu erzeugen aber bis jetzt keinen Erfolg. MFG Tuan
Datum:
@ Tuan (Gast) >Dateianhang: IMG_0670.JPG (1,8 MB, 4 Downloads) HALLO!!! Bitte vor dem posten solcher Bilder ETWAS nachdenken und sich über Bildformate informieren!!! >hier ist die Schaltung und der Zeitdiagramm. Schon mal ein Ansatz. >3 Punkt WR soll die Blockspannung am Ausgang liefern, deren Fehlen da nicht T5 und T6 im Zeitdiagramm. >Grundschwingung mit einer Sollschwingung entspricht. >Mit diesem Diagramm habe ich versucht, das VHDL code zu erzeugen aber >bis jetzt keinen Erfolg. Klar, dir fehlen (noch) einige wichtige Grundlagen. Aber du sagtest etwas von "Unflexibilität". Was soll denn flexibel gesteuert werden? MfG Falk
Datum:
@ falk > HALLO!!! > Bitte vor dem posten solcher Bilder ETWAS nachdenken und sich über > Bildformate informieren!!! sorry weil ich so große Datei angehängt habe. Beim nächsten Mal werde ich beachten > Fehlen da nicht T5 und T6 im Zeitdiagramm. die Schaltung stellt eigentlich nur einen Brückenzweig dar. Es gibt hier überhaupt keine T5 und T6. > Klar, dir fehlen (noch) einige wichtige Grundlagen. was für die wichtige Grundlagen? >Aber du sagtest etwas von "Unflexibilität". Was soll denn flexibel gesteuert werden? ich meine dass ohne ansteuerbare Eingänge wie dein obiges Code es unflexibel ist weil es nur von clk und counter abhängt. Ich wollte hier mit einem außeren Steuersignal ( vom Mikrocontroller zB) ansteuern. Danke für die aufmerksamkeit MFG Tuan.
Datum:
@ Tuan (Gast) >die Schaltung stellt eigentlich nur einen Brückenzweig dar. Es gibt hier >überhaupt keine T5 und T6. Warum 4 Transistoren pro Zweig? Hat mit dem Problem erstmal nix zu tun, interessiert mich aber. >> Klar, dir fehlen (noch) einige wichtige Grundlagen. >was für die wichtige Grundlagen? Digitaltechnik, State machines, VHDL Grundkenntnisse etc. >ich meine dass ohne ansteuerbare Eingänge wie dein obiges Code es >unflexibel ist weil es nur von clk und counter abhängt. Ich wollte hier >mit einem außeren Steuersignal ( vom Mikrocontroller zB) ansteuern. Schon klar, aber wie ich bereits sagte, dass war nur ein Beispiel, wie man Signale in so einem Fall verzögert. Keine fertige Lösung! Was soll die Steuerung denn bewirken? Soll die Frequenz gesteuert werden (Frequenzumrichter)? Notaus? Richtungsumkehr? MfG Falk
Datum:
Hallo Falk, ersmal bedanke ich mich für alle schnelle Antworten. Ich denke dass ich schon was herausgefunden habe. Bei dem Synthesenvorgang mit XST-Synthezer von Xilinx tretten es jedoch noch einige Warnings auf. Xst:2734 - Property "use_dsp48" is not applicable for this technology. Xst:1710 - FF/Latch <enable2> (without init value) has a constant value of 1 in block <thunghiem1>. Xst:1895 - Due to other FF/Latch trimming, FF/Latch <enable1> (without init value) has a constant value of 1 in block <thunghiem1>. Xst:2677 - Node <counter1_0> of sequential type is unconnected in block <thunghiem1>. Kannst du mir sagen,ob solche Meldungen auf dem Process im Hardware beeinflussen können und wie ich diese weglassen kann. Vielen Dank! Gruß. Tuan
Datum:
hier ist mein Code
entity thunghiem is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
s : in STD_LOGIC_VECTOR (1 downto 0);
t1 : out STD_LOGIC;
t2 : out STD_LOGIC;
t3 : out STD_LOGIC;
t4 : out STD_LOGIC);
end thunghiem;
architecture Behavioral of thunghiem is
signal s_old: std_logic_vector(1 downto 0);
begin
PRO1: process (clk)
variable enable1,enable2: std_logic;
variable counter1,counter2: integer range 0 to 3;
begin
if reset='1' then
t1<='0';
t2<='0';
t3<='0';
t4<='0';
elsif rising_edge(clk) then
s_old<= s;
if s_old="01" and s="00" then
enable1:='1';
counter1:=0;
elsif s_old="00" and s="01" then
enable2:='1';
counter2:=0;
end if;
if enable1='1' then
t2<='1';
t4<='0';
t1<='0';
if (counter1/=3) then
counter1:= counter1 + 1;
else
t3<='1';
end if;
end if;
if enable2='1' then
t3<='0';
t2<='1';
t4<='0';
if (counter2/=3) then
counter2:=counter2+1;
else
t1<='1';
end if;
end if;
end if;
end process PRO1;
end Behavioral; |
Datum:
@ Tuan (Gast) >Bei dem Synthesenvorgang mit XST-Synthezer von Xilinx tretten es jedoch >noch einige Warnings auf. >Kannst du mir sagen,ob solche Meldungen auf dem Process im Hardware >beeinflussen können und wie ich diese weglassen kann. Die Warnungen sind unkritisch. ABER! Lass den Unsinn mit den Variablen! Nimm Signale! Variablen is VHDL sind NICHT so wie Variablen in normalen Programmiersprachen. MFG Falk
Datum:
Angehängte Dateien:Danke Falk,
>Lass den Unsinn mit den Variablen
wieso? wenn ich die Signale nehme, dann wird t nicht sofort auf 0 bei
der Signalwechselung von s gesetzt, sondern nach einem Takt. Das will
ich aber nicht.
Ich habe noch eine Frage und hoffe dass du mir helfen kannst.
[PRO1: process (clk,reset)
variable enable1,enable2: std_logic;
variable counter1,counter2: integer range 0 to 3;
begin
if reset='1' then
counter1:=0;
counter2:=0;
elsif (clk='1' and clk'event) then
t1<='0';
t2<='0';
t3<='0';
t4<='0';
s_old<= s;
if s_old="01" and s="00" then
enable1:='1';
counter1:=0;
elsif s_old="00" and s="01" then
enable2:='1';
counter2:=0;
end if;
if enable1='1' then
t2<='1';
t4<='0';
t1<='0';
if (counter1/=3) then
counter1:= counter1 + 1;
else
t3<='1';
end if;
elsif enable2='1' then
t3<='0';
t2<='1';
t4<='0';
if (counter2/=3) then
counter2:=counter2+1;
else
t1<='1';
end if;
end if;
end if;
end process PRO1;
]
Mit dem obigen Code wird der zugehörige TestbenchWaveForm im Dateianhang
erzeugt.
Aber wieso an der Stelle, wo ich mit Blau markiert habe, findet keine
Signalwechselerkenung von s statt. Eigentlich muss es passieren ( s von
00 auf 01) und t3<='0'; t2<='1'; t4<='0'; t1<='1' nach 3 Takte werden
gesetzt.
Habe ich was falsch in Code? Kannst du mal korrigieren?
MFG,
Tuan
Datum:
@ Tuan (Gast) >>Lass den Unsinn mit den Variablen >wieso? Weil die meisten Leute den Unterschied zwischen Signalen und Variablen in VHDL nicht WIRKLICH verstanden haben. So auch du. > wenn ich die Signale nehme, dann wird t nicht sofort auf 0 bei >der Signalwechselung von s gesetzt, sondern nach einem Takt. Das will >ich aber nicht. Dann musst du es anders programmieren. Mit deinem jetzigen Vorgehen schiesst du dir früher oder später ins Knie. >Aber wieso an der Stelle, wo ich mit Blau markiert habe, findet keine >Signalwechselerkenung von s statt. Eigentlich muss es passieren ( s von >00 auf 01) und t3<='0'; t2<='1'; t4<='0'; t1<='1' nach 3 Takte werden >gesetzt. >Habe ich was falsch in Code? Siehe oben. Variablen und Signale. > Kannst du mal korrigieren? Nutze Signale und staune. MFG Falk
Datum:
Angehängte Dateien:>Weil die meisten Leute den Unterschied zwischen Signalen und Variablen in VHDL nicht WIRKLICH verstanden haben. So auch du. was meinst du damit? Das wäre gut wenn du ausführlicher mit Beispiele erklärst. >Nutze Signale und staune. habe ich schon versucht( deklariere signal für counter und enable). Obiges Problem (Erkennung) bleibt jedoch noch deswegen kann ich nicht staunen. Zeig mir mal was du hast mit Signale um dieses Problem zu lösen. MFG Tuan.
Datum:
@ Tuan (Gast) >Dateianhang: wave_signal.JPG (55,3 KB, 1 Downloads) Bildformate >>Weil die meisten Leute den Unterschied zwischen Signalen und Variablen >>in VHDL nicht WIRKLICH verstanden haben. So auch du. >was meinst du damit? Das wäre gut wenn du ausführlicher mit Beispiele >erklärst. Tja, das ist nicht so einfach. Signale in VHDL sind in einem getakteten Prozess immer das, was man so landläufig in der Digitaltechnik unter einem Signal versteht. Es wird durch ein FlipFlop gespeichert und über eine entsprechende Logik vor dem FlipFlop generiert. In einem Prozess kann man Signale beliegig oft zuweisen, allerdings wird am Ende nur die Anweisung ausgeführt und in Hardware compiliert, welche entweder logisch erfüllt ist (in IF Abfragen) oder zum Schluss steht.
signal a: std_logic; process(clk) begin if rising_edge(clk) a <= not b; a <= b or c; end if; end |
Die erste Zuweisung fliegt bei der Compilierung raus und es bleibt übrig.
process(clk) begin if rising_edge(clk) a <= b or c; end if; end |
Ganz anders Variablen. Diese sind im wesentlichen Hilfsmittel, um logische Strukturen zu generieren, aber NICHT dazu bestimmt, Signale zu speichern. Leider kann man sie teilweise auch wie Signale verwenden, hier entsteht das Problem. Eine Variable wird sofort in einem Prozess zugewiesen, alte Zuweisungen werden quasi "mitgeschleppt". Ausserdem ist eine Variable nur in dem jeweiligen Prozess sichtbar und kann ausserhalb nicht gelesen werden.
process(clk) variable a: std_logic; begin if rising_edge(clk) a <= not b; a <= b or c; end if; end |
Das Ergebniss der Compilierung sieht dann so aus
process(clk) variable a: std_logic; begin if rising_edge(clk) a <= (not b) or c; end if; end |
>Zeig mir mal was du hast mit Signale um dieses Problem zu lösen. Dazu muss ich erstmal wissen, wie deine Signale generiert werden sollen. Zeichne mal ein Timingdiagramm, beschreibe wie die Eigangssignale die Ausgangssignale beinflussen sollen. Das kann man dann in VHDL umsetzen. MFG Falk
Datum:
>In einem Prozess kann man Signale beliegig oft >zuweisen, allerdings wird am Ende nur die Anweisung ausgeführt und in >Hardware compiliert, welche entweder logisch erfüllt ist (in IF >Abfragen) oder zum Schluss steht. Das bin ich einverstanden.
process(clk)
variable a: std_logic;
begin
if rising_edge(clk)
a <= not b;
a <= b or c;
end if;
end
|
bin nicht einverstaden weil es mit Variablen nicht "<=" zuweisen darf. >Dazu muss ich erstmal wissen, wie deine Signale generiert werden sollen. Das habe ich schon mal bei der alten Postings erwärnt. Aber kein Problem, ich erkläre noch einmal. Die Ausgangsignale t1,t2,t3,t4 sollen durch das Eingangssignal s generiert. s hat 3 Werte : 1,0, -1 und wird durch 2Bit-Kombination kodiert. Hier stehen 2 Schwerpunkte: 1. Die Wechselerkennung von s (zB s von 1 auf 0...,es gibt 6 Möglichkeiten zu erkennen) 2. Für jede Umschaltung von s werden die Ausgangssignale entsprechend generiert. zB Wenn s von 1 auf 0 springt, dann: t1<='0'; t2<='1'; t3<='1' nach eine Verzögerung ( lösen mit zähler); t4<='0'; >Zeichne mal ein Timingdiagramm, beschreibe wie die Eigangssignale die >Ausgangssignale beinflussen sollen Ich glaube ,das Timmingdiagramm schon im Dateianhang bei dem obigen Posting (das von Kamera aufgenommen, 1,8Mb) gegeben wurde, kannst du mal checken? Hoffe dass du in VHDL umsetzen kannst. MFG Tuan.
Datum:
@ Tuan >Das habe ich schon mal bei der alten Postings erwärnt. Aber kein >Problem, ich erkläre noch einmal. Ok, hatte ich vergessen. >Hoffe dass du in VHDL umsetzen kannst. Sicher ;-) Z.B. So.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity three_phase is Generic (trs_delay: integer:=5); Port ( clk : in std_logic; s : in std_logic_vector(1 downto 0); t : out std_logic_vector(4 downto 1)); end three_phase; architecture Behavioral of three_phase is type state_type is (high, zero, low, high_zero, zero_low, low_zero, zero_high); signal state : state_type; signal cnt : std_logic_vector(7 downto 0); begin -- Kodierung von s -- -- s ="01" = 1 = HIGH -- s ="00" = 0 = Zero -- s ="11" = -1 = LOW process(clk) begin if rising_edge(clk) then case state is when high => t <= "0011"; cnt <= conv_std_logic_vector(trs_delay,8); if s="00" or s="11" then state <= high_zero; end if; when zero => t <= "0110"; cnt <= conv_std_logic_vector(trs_delay,8); case s is when "11" => state <= zero_low; when "01" => state <= zero_high; when others => null; end case; when low => t <= "1100"; cnt <= conv_std_logic_vector(trs_delay,8); if s="00" or s="11" then state <= low_zero; end if; when high_zero => t <= "0000"; -- Muster fur Uebergangszustand eintragen cnt <= cnt -1; if cnt=0 then state <= zero; end if; when zero_low => t <= "0000"; -- Muster fur Uebergangszustand eintragen cnt <= cnt -1; if cnt=0 then state <= low; end if; when low_zero => t <= "0000"; -- Muster fur Uebergangszustand eintragen cnt <= cnt -1; if cnt=0 then state <= zero; end if; when zero_high => t <= "0000"; -- Muster fur Uebergangszustand eintragen cnt <= cnt -1; if cnt=0 then state <= high; end if; when others => null; end case; end if; end process; end Behavioral; |
Du musst noch die Kodierung von T1..4 für die Übergangszustände eintragen. Ansonsten sollte es so gehen. Die Übergangszustände werden für "trs_delay" Takte ausgegeben. MfG Falk
Datum:
Uuups, ich sehe gerade, dass der direkte Übergang von LOW nach HIGH und umgekehrt anders läuft. Naja, aber das kann man ja leicht anpassen, das Prinzip der State Machine wird mit dem Beispiel hoffentlich klar. MfG Falk
Datum:
nochmal danke Falk, deine Idee sieht gut aus aber ich habe noch einige Sache, die ich nicht so ganz verstanden habe >cnt <= conv_std_logic_vector(trs_delay,8); diese Zuweisung ist mir unbekannt, das kann nicht compilieren. Ich kenne nur zB: cnt<= conv_std_logic_vector(arg,size:integer); arg kann std_logic, signed, unsigned, integer sein. >Uuups, ich sehe gerade, dass der direkte Übergang von LOW nach HIGH und >umgekehrt anders läuft habe ich angepasst. >das Prinzip der State Machine wird mit dem Beispiel hoffentlich klar. ja bin ich klar. >Du musst noch die Kodierung von T1..4 für die Übergangszustände eintragen meinst du Übergangszustand = Transienter Zustand im Timingdiagramm, zB von s="01" auf s="00" soll dieser Übertragungszustand t="0100" ??? >-- Kodierung von s >-- >-- s ="01" = 1 = HIGH >-- s ="00" = 0 = Zero >-- s ="11" = -1 = LOW sind hier deine Kommentare oder muss ich selbt kodieren? MFG Tuan.
Datum:
>>cnt <= conv_std_logic_vector(trs_delay,8); >diese Zuweisung ist mir unbekannt, das kann nicht compilieren. >Ich kenne nur zB: cnt<= conv_std_logic_vector(arg,size:integer); arg >kann std_logic, signed, unsigned, integer sein. Sorry, ich habe Generic(tsr_delay:integer:=5) im Code vergessen. Deswegen konnte es nicht compilieren, jetzt aber schon. Was ist das jedoch zum Bedeuten diese Zuweisung cnt <= conv_std_logic_vector(trs_delay,8); MFG Tuan
Datum:
@ Radis Wayne (adler82) >>cnt <= conv_std_logic_vector(trs_delay,8); >diese Zuweisung ist mir unbekannt, das kann nicht compilieren. ??? ISE von Xilinx macht das ohne Probleme. >>Uuups, ich sehe gerade, dass der direkte Übergang von LOW nach HIGH und >>umgekehrt anders läuft >habe ich angepasst. Zeig mal den neuen Quelltext. >meinst du Übergangszustand = Transienter Zustand im Timingdiagramm, zB >von s="01" auf s="00" soll dieser Übertragungszustand t="0100" ??? Ja. >>-- Kodierung von s >>-- >>-- s ="01" = 1 = HIGH >>-- s ="00" = 0 = Zero >>-- s ="11" = -1 = LOW >sind hier deine Kommentare oder muss ich selbt kodieren? Kommentare. SO iunterpretiert die State Machine den Vektor s. MFG Falk
Datum:
@ Radis Wayne (adler82) >Deswegen konnte es nicht compilieren, jetzt aber schon. Was ist das >jedoch zum Bedeuten diese Zuweisung >cnt <= conv_std_logic_vector(trs_delay,8); Ganz einfach. Das Generic trs_delay wird von Integer in std_logic_vector mit der Länge 8 umgewandelt und cnt zugewiesen. MFG Falk
Datum:
@Falk kannst du mal deinen Testbench Wave Form anschicken. Danke! MFG Tuan
Datum:
Angehängte Dateien:>Zeig mal den neuen Quelltext.process(clk)
begin
if rising_edge(clk) then
case state is
when high =>
t <= "1100";
cnt <= conv_std_logic_vector(trs_delay,8);
if s="00" or s="11" then
state <= high_zero;
end if;
when zero =>
t <= "0110";
cnt <= conv_std_logic_vector(trs_delay,8);
case s is
when "11" => state <= zero_low;
when "01" => state <= zero_high;
when others => null;
end case;
when low =>
t <= "0011";
cnt <= conv_std_logic_vector(trs_delay,8);
if s="00" or s="11" then
state <= low_zero;
end if;
when high_zero =>
t <= "0100"; -- Muster fur Uebergangszustand eintragen
cnt <= cnt -1;
if cnt=0 then
state <= zero;
end if;
when zero_low =>
t <= "0010"; -- Muster fur Uebergangszustand eintragen
cnt <= cnt -1;
if cnt=0 then
state <= low;
end if;
when low_zero =>
t <= "0010"; -- Muster fur Uebergangszustand eintragen
cnt <= cnt -1;
if cnt=0 then
state <= zero;
end if;
when zero_high =>
t <= "0100"; -- Muster fur Uebergangszustand eintragen
cnt <= cnt -1;
if cnt=0 then
state <= high;
end if;
when others => null;
end case;
end if;
end process; |
>Ganz einfach. Das Generic trs_delay wird von Integer in std_logic_vector >mit der Länge 8 umgewandelt und cnt zugewiesen. Wieso musst du das machen wenn du da oben schon Generic (trs_delay: integer:=5); und signal cnt : std_logic_vector(7 downto 0); hast Mein Testbench Wave Form zeigt immer noch das unerwartet Ergebnis MFG Tuan.
Datum:
@ Falk dein Code ist korrekt, ich habe den Testbesch nur in 1 ns ansehen, in diesem Zeitinterval stimmt es nicht mit dem Code (initialisierung vielleicht!!!) . Aber wenn ich zB in 10 ns schauen, dann sieht es besser aus. Danke schön.
Datum:
@ Falk >Uuups, ich sehe gerade, dass der direkte Übergang von LOW nach HIGH und >umgekehrt anders läuft >>Zeig mal den neuen Quelltext.
when low =>
t<="1100";
cnt<=conv_std_logic_vector(trs_delay,8);
cnt2<=conv_std_logic_vector(trs_delay,24);
case s is
when "00" =>
state<=low_zero;
when "01" =>
state<=low_high;
end if;
when low_high =>
t<="0100";
cnt2<=cnt2-1;
case cnt2 is
when 16 => t<="0110";
when 8 => t<="0010";
when 0 => state<=high;
when others => null;
end case;
|
Ist mein Code richtig??? MFG Tuan
Datum:
Angehängte Dateien:@ Tuan (Gast) >>Zeig mal den neuen Quelltext. Bitte nicht solche Fragmente posten, das ist in den meisten Fällen sinnlos. >Ist mein Code richtig??? Nein. Was soll das? > cnt2<=conv_std_logic_vector(trs_delay,24); Hier das Ganze nochmal vollständig.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity three_phase is Generic (trs_delay: integer:=5); Port ( clk : in std_logic; s : in std_logic_vector(1 downto 0); t : out std_logic_vector(4 downto 1)); end three_phase; architecture Behavioral of three_phase is type state_type is (high, zero, low, high_zero, zero_low, low_zero, zero_high, zero_trans); signal state : state_type; signal cnt : std_logic_vector(7 downto 0); begin -- Kodierung von s -- -- s ="01" = 1 = HIGH -- s ="00" = 0 = Zero -- s ="11" = -1 = LOW process(clk) begin if rising_edge(clk) then case state is when high => t <= "0011"; cnt <= conv_std_logic_vector(trs_delay,8); if s="00" or s="11" then state <= high_zero; end if; when zero => t <= "0110"; cnt <= conv_std_logic_vector(trs_delay,8); case s is when "11" => state <= zero_low; when "01" => state <= zero_high; when others => null; end case; when low => t <= "1100"; cnt <= conv_std_logic_vector(trs_delay,8); if s="00" or s="01" then state <= low_zero; end if; when high_zero => t <= "0100"; cnt <= cnt -1; if cnt=0 then cnt <= conv_std_logic_vector(trs_delay,8); case s is when "00" => state <= zero; when others => state <= zero_trans; end case; end if; when zero_low => t <= "0010"; cnt <= cnt -1; if cnt=0 then state <= low; end if; when low_zero => t <= "0010"; cnt <= cnt -1; if cnt=0 then cnt <= conv_std_logic_vector(trs_delay,8); case s is when "00" => state <= zero; when others => state <= zero_trans; end case; end if; when zero_high => t <= "0100"; cnt <= cnt -1; if cnt=0 then state <= high; end if; when zero_trans => t <= "0110"; cnt <= cnt -1; if cnt=0 then cnt <= conv_std_logic_vector(trs_delay,8); case s is when "01" => state <= zero_high; when "11" => state <= zero_low; when others => null; end case; end if; when others => null; end case; end if; end process; end Behavioral; |
>ich habe den Testbesch nur in 1 ns ansehen, in diesem Zeitinterval >stimmt es nicht mit dem Code (initialisierung vielleicht!!!) . Aber >wenn ich zB in 10 ns schauen, dann sieht es besser aus. ??? Kann nicht sein. Siehe Anhng. MFG Falk
Datum:
@Falk Dein Code ist fast richtig weil du falsch zugewiesen hast (zB bei high_zero muss t<="0010" statt "0100" zugewiesen wird). Das war aber eine Kleinigkeit. Ich weiß wirklich nicht warum wenn ich den Testbench mit Anfangwert s="00" oder s="11" gebe, zeigt die Simulation ganz komisch (siehe bitte Anhang bei meinem alten Posting,datum 30.10, 23:41 Uhr),(bei dir ist Anfangwert s="01",zeigt es hervorragend!) Danke für deine Mühe. MFG Tuan.
Datum:
@ Falk
Hallo Falk,
kann man solchen Block: [ Generic (trs_delay: integer:=5);
...
...
signal cnt : std_logic_vector(7 downto 0);
...
...
cnt<=conv_std_logic_vector(trs_delay,8);]
mit nur eine Zeile wie: signal cnt:integer:=8;
ersetzen?
MFG
Tuan.
Datum:
@ Radis Wayne (adler82) >mit nur eine Zeile wie: signal cnt:integer:=8; >ersetzen? Ja. Aber man sollte den Integer mit einem Range definieren, sonst kann es schnell passieren, dass dort ein 32 Bit Zähler reinkommt. MfG Falk
Datum:
@Falk
Hallo Falk,
kannst du mal erklären, wieso du den Block [ Generic (trs_delay:
integer:=5);
...
...
signal cnt : std_logic_vector(7 downto 0);
...
...
cnt<=conv_std_logic_vector(trs_delay,8);]
benutzt hast? Und welche Vorteile hat der gegen den direkt Deklaration
von cnt in integer mit range wie oben erwähnt wurde.
Vielen Dank
schönen Grüß
Tuan.
Datum:
@ Radis Wayne (adler82) >kannst du mal erklären, wieso du den Block [ Generic (trs_delay: >benutzt hast? Reine Gewohnheit, ich arbeite halt so gut wie immer mit std_logic_vector, da weiss man direkt wie gross ein Signal ist und man kann direkt auf die Bits zugreifen. my_signal(4) geht bei Integer nicht. > Und welche Vorteile hat der gegen den direkt Deklaration >von cnt in integer mit range wie oben erwähnt wurde. In diesem Fall. KEINE! MFG Falk




