www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Logische Schaltung mit verzögertem Ausgang


Autor: Tuan (Gast)
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?
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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.
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
Datum:

@ 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
Autor: Tuan (Gast)
Datum:

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
Autor: Falk Brunner (falk)
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
Autor: hhanff (Gast)
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;
Autor: Tuan (Gast)
Datum:

@ hhanff
danke für deinen Vorschlag.
der Ausgang ist hier oe_d1 oder oe_d2?
Autor: hhanff (Gast)
Datum:

Bei mir ist der Ausgng oe_d2
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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.
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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.
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Tuan (Gast)
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;
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Tuan (Gast)
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.
Autor: Falk Brunner (falk)
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
Autor: Radis Wayne (adler82)
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.
Autor: Falk Brunner (falk)
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
Autor: Falk Brunner (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
Autor: Radis Wayne (adler82)
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.
Autor: Radis Wayne (adler82)
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
Autor: Falk Brunner (falk)
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
Autor: Falk Brunner (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
Autor: Radis Wayne (adler82)
Datum:

@Falk

kannst du mal deinen Testbench Wave Form anschicken. Danke!

MFG
Tuan
Autor: Radis Wayne (adler82)
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.
Autor: Radis Wayne (adler82)
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.
Autor: Tuan (Gast)
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
Autor: Falk Brunner (falk)
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
Autor: Radis Wayne (adler82)
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.
Autor: Radis Wayne (adler82)
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.
Autor: Falk Brunner (falk)
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
Autor: Radis Wayne (adler82)
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.
Autor: Falk Brunner (falk)
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net