Forum: FPGA, VHDL & Co. Astabile Kippstufe Programmieren


von Ghg (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend!

ich habe ein Problem. Ich wollte eine astabile Kippstufe in VHDL 
realisieren, und habe es auch geschafft. Mein Problem ist, dass ich eine 
Einschaltzeit vom Ausgang von 30ns brauche und eine Ausschaltzeit von 
50ns. Das mit den 30ns klappt ja noch, aber die Ausschaltzeit geht 
einfach nicht bis 50ns(nur 40ns).

Programm:
-- Astabile Kippstufe
library IEEE;
use IEEE.std_logic_1164.all;

entity AMV is
port(  CLK:   in bit;
    START:  in bit;    -- RESET - Leitung
    Q:     out bit;   -- Ausgangssignal
        NOTQ:   out bit ); -- negiertes Ausgangssignal
end AMV;

architecture MOORE of AMV is
type ZUSTAENDE is (Z0, Z1, Z2);          -- Aufzählungstyp
signal ZUSTAND,VOR_ZU, FOLGE_Z: ZUSTAENDE;
begin
REG: process(CLK, START)      -- Zustandsaktualisierung
begin
    if START = '0' then
      ZUSTAND <= Z0 after 5ns;
    elsif clk = '1' and clk'event then
      VOR_ZU <= ZUSTAND;
        if START = '1' then
          if VOR_ZU = Z0 then
              ZUSTAND <= FOLGE_Z after 30ns;
            end if;
            if VOR_ZU = Z1 then
              ZUSTAND <= FOLGE_Z after 50ns;
            end if;
        end if;
    end if;
end process REG;

NETZE: process(START, ZUSTAND)      -- Kombinatorische Logik
begin
  Q <= '0';-- after 5ns;        -- Default Ausgangssignal
    NOTQ <= '1';-- after 5ns;
    FOLGE_Z <= Z0;-- after 5ns;    -- Default Folgezustand Z0
    case ZUSTAND is
      when Z0 =>  Q <= '0';-- after 5ns;
              NOTQ <= '1';-- after 5ns;
              if START = '1' then FOLGE_Z <= Z1;-- after 5ns;
              end if;
        when Z1 =>  Q <= '1';-- after 5ns;
              NOTQ <= '0';-- after 5ns;
              if START = '1' then FOLGE_Z <= Z0;-- after 5ns;
              end if;
        when Z2 =>  if START = '1' then FOLGE_Z <= Z0;-- after 5ns;
              end if;
    end case;
end process NETZE;
end MOORE;

Testbench:

library IEEE;
use IEEE.std_logic_1164.all;

entity top_AMV is
end top_AMV;

architecture ta_MOORE of top_AMV is
component AMV is
port(  CLK:   in bit;
    START:  in bit;    -- RESET - Leitung
    Q:     out bit;   -- Ausgangssignal
        NOTQ:   out bit ); -- negiertes Ausgangssignal
end component;

signal clk : bit;
signal start: bit;
signal q: bit;
signal notq: bit;
begin
DUT: AMV port map (clk, start, q, notq);

STIMULI: process
begin
    clk <= '0';
    start <= '0';
  wait for 5 ns;
    start <= '1';
  wait for 5 ns;

    for I in 0 to 100 loop
      clk <= '1';
    wait for 5 ns;
      clk <= '0';
    wait for 5 ns;
    end loop;

    assert false report "Test done." severity note;
    wait;
end process STIMULI;

end ta_MOORE;

: Verschoben durch User
von Ghg (Gast)


Lesenswert?

Der Zustand Z2 ist unnötig. Ich hatte gedacht, dass die fehlende Zeit 
etwas mit der Anzahl der Zustände zu tun hat

von Ghg (Gast)


Lesenswert?

Bitte es ist dringend

von ticktack (Gast)


Lesenswert?

Ghg schrieb:
> Bitte es ist dringend


Also fürs astabile Kippen sollte doch im wesentlichen
1
process
2
begin
3
 q <= '0' after 30 ns
4
     '1' after 80 ns; 
5
end process;
genügen,

da noch a bisserl Kombinatorik für start und negierten Ausgung drum -> 
fertig.

Aber du willst es wohl synchron, da nimm einen counter der aller 10 ns 
weiterzählt und zwei Vergleicher. der eine Vergleicher schaltet nach 3 
Zählschritten den Ausgang auf '0', der zweiter nach 8 Zählschtitten den 
Ausgang auf '1' und den Zähler auf Null.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ghg schrieb:
> Ich wollte eine astabile Kippstufe in VHDL realisieren
Also etwas in die Realität überführen, und eben nicht nur simulieren?

von Ghg (Gast)


Lesenswert?

ticktack schrieb:
> Ghg schrieb:
>> Bitte es ist dringend
>
> Also fürs astabile Kippen sollte doch im wesentlichen
> process
> begin
>  q <= '0' after 30 ns
>      '1' after 80 ns;
> end process;
> genügen,
>
> da noch a bisserl Kombinatorik für start und negierten Ausgung drum ->
> fertig.
>
> Aber du willst es wohl synchron, da nimm einen counter der aller 10 ns
> weiterzählt und zwei Vergleicher. der eine Vergleicher schaltet nach 3
> Zählschritten den Ausgang auf '0', der zweiter nach 8 Zählschtitten den
> Ausgang auf '1' und den Zähler auf Null.

Vielen Dank! Hatte mich irgendwie auf diese Lösung festgefahren, weil 
ich dachte es dauert sonst zu lang.

Lothar M. schrieb:

> Also etwas in die Realität überführen, und eben nicht nur simulieren?

Eigentlich nur simulieren, bin noch ein Anfänger(ich glaube du hast das 
gemerkt)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Probiers so:
1
process
2
begin
3
   q <= '1';
4
   wait for 30 ns;
5
   q <= '0';
6
   wait for 50 ns;
7
end process;

: Bearbeitet durch Moderator
von Ghg (Gast)


Lesenswert?

Vielen Dank Lothar! Ich werde es so machen und mein gesamtes Programm 
umschreiben. Das ist sinnvoller

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
Noch kein Account? Hier anmelden.