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?
@ 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
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
@ 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
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.
@ 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
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
@ Tuan (Gast)
> kann ich auch mit VHDL gehen? Schneller Takt ist>hier clock, meinst du?
???
Merkwürdige Formulierung, ich schätze mal Deutsch ist nicht deine
Muttersprache.
Ja, das macht man so in VHDL und clock ist das englische Wort für Takt.
MFG
Falk
Ja, Deutsch ist nicht meine Muttesprache weil ich keine Deusche bin.
ich lerne VHDL seit 1 Woche, kannst du mal zeigen, wie ich " warten ein
paar Takte" in VHDL schreiben kann ( also auch synthetisierbar)
Danke im Voraus
MFG
Tuan
@ 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.
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?
1
-- purpose : delays oe_s by 2 clk_108MHz_s clock cycles
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
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
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.
@ 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
@ 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
@ 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
@ 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
@ 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
@ 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.
@ 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
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
@ 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
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
@ 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
>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.
@ 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.
1
signala:std_logic;
2
3
process(clk)
4
begin
5
ifrising_edge(clk)
6
a<=notb;
7
a<=borc;
8
endif;
9
end
Die erste Zuweisung fliegt bei der Compilierung raus und es bleibt
übrig.
1
process(clk)
2
begin
3
ifrising_edge(clk)
4
a<=borc;
5
endif;
6
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.
1
process(clk)
2
variablea:std_logic;
3
begin
4
ifrising_edge(clk)
5
a<=notb;
6
a<=borc;
7
endif;
8
end
Das Ergebniss der Compilierung sieht dann so aus
1
process(clk)
2
variablea:std_logic;
3
begin
4
ifrising_edge(clk)
5
a<=(notb)orc;
6
endif;
7
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
>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.
1
process(clk)
2
variable a: std_logic;
3
begin
4
if rising_edge(clk)
5
a <= not b;
6
a <= b or c;
7
end if;
8
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.
@ 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.
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
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
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.
>>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
@ 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
@ 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
t <= "0100"; -- Muster fur Uebergangszustand eintragen
30
cnt <= cnt -1;
31
if cnt=0 then
32
state <= zero;
33
end if;
34
35
when zero_low =>
36
t <= "0010"; -- Muster fur Uebergangszustand eintragen
37
cnt <= cnt -1;
38
if cnt=0 then
39
state <= low;
40
end if;
41
42
when low_zero =>
43
t <= "0010"; -- Muster fur Uebergangszustand eintragen
44
cnt <= cnt -1;
45
if cnt=0 then
46
state <= zero;
47
end if;
48
49
when zero_high =>
50
t <= "0100"; -- Muster fur Uebergangszustand eintragen
51
cnt <= cnt -1;
52
if cnt=0 then
53
state <= high;
54
end if;
55
56
when others => null;
57
end case;
58
end if;
59
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.
@ 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.
@ 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.
>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
@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.
@ 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.
@ 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
@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.
@ 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