Signalverschiebung - HIGH aktiv

Gast #4101135
Lesenswert?

Guten Morgen,

habe ein ziemlich banales VHDL Problem, stehe aber grade komplett auf 
dem Schlauch :(

Ich hab als Eingang 2 Signale die um eine bestimme Zeit x gegeneinander 
versetzt sind. Ich will jetzt nur ein Ausgangssignal erzeugen das 
solange HiGH ist solange das erste Signal HIGH ist und das zweite Signal 
LOW ist.

Vllt könnt ihr mir kurz weiter helfen, da ich grade komplett anhungslos 
bin.

Vielen Dank.
Gast #4101440
Lesenswert?

Du willst also entgegen der Überschrift gar kein Signal "verschieben", 
sondern eine reine Kombinatorik, die die bereits verschobenen 
Eingangssignale weiter verarbeitet.

Eingang: E1 und E2
Ausgang: A

A soll High sein, wenn E1 High ist und E2 Low ist.

Jan schrieb:
> stehe aber grade komplett auf
> dem Schlauch :(

Sieht wirklich so aus...
Gast #4101443
Lesenswert?

Im Anhang ein Timing Diagramm... Hoffe das ist einigermaßen 
verständlich.
Der FPGA ist ein ARRIA V. Läuft momentan mit 50 Mhz.

Hatte überlegt das mit einer FSM zu realisieren, bin da aber nicht 
weitergekommen, weil ich die State Übergänge ja nicht mit einer 
steigenden Flanke realisieren kann. Oder ist da ein Denkfehler.
1
BEGIN
2
   PROCESS (clk, reset)
3
   BEGIN
4
      IF reset = '0' THEN
5
         state <= s0;
6
      ELSIF (clk'EVENT AND clk = '1') THEN 
7
         CASE state IS
8
            WHEN s0=>
9
               IF start = '0' THEN
10
                  state <= s1;
11
               END IF;
12
          
13
            WHEN s1=>
14
               IF rising_edge (input_a) THEN
15
                  state <= s2;
16
               END IF;
17
        WHEN s2 =>
18
          IF rising_edge(input_b) THEN
19
                  state <= s1;
20
               END IF;        
21
         END CASE;
22
      END IF;
23
   END PROCESS;
24

25
--state machine process.
26
process (state)
27
begin
28
  case state is
29
     when s0 =>        --when current state is "s0"
30
    count <= '0';
31

32
     when s1 =>        --when current state is "s1"
33
    count <= '0';
34
    
35
    when s2 =>        --when current state is "s1"
36
    count <= '1';
37

38
  end case;
39
end process;
40

41
 q <= count ;
42

43
end behavioral;

Das geht so nicht weil ich in den Case - When kein FF einbauen kann. Mit 
fehlt da nur gerade der richtige Lösungsweg.

Gruß Jan
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #4101465
Lesenswert?

Jan schrieb:
> Mit fehlt da nur gerade der richtige Lösungsweg.
Flankenerkennung heißt das Stichwort. Dazu das Eingangsignal in ein 
Schieberegister eintakten und auf einen 0-1-Übergang abfragen:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung

Jan schrieb:
> Im Anhang ein Timing Diagramm... Hoffe das ist einigermaßen
> verständlich.
Du willst also mit der steigenden Flanke vom A das Ausgangssignal setzen 
und mit der steigenden Flanke vom B wirder zurücksetzen. Das ist ein 
Dreizeiler:
1
   PROCESS
2
   variable srA : std_logic_vector (2 downto 0) := "000";
3
   variable srB : std_logic_vector (2 downto 0) := "000";
4
   BEGIN
5
      wait until rising_edge(clk);
6
      -- Eintakten
7
      srA := srA(1 downto 0) & input_a;
8
      srB := srB(1 downto 0) & input_b;
9

10
      -- Flankenauswertung steigende Flanke Eingang A
11
      if srA(2 downto 1)="01" then
12
        Ausgang <='1';
13
      end if;
14

15
      -- Flankenauswertung steigende Flanke Eingang B
16
      if srB(2 downto 1)="01" then
17
        Ausgang <='0';
18
      end if;
19
   END PROCESS;

Oder wie schon vorgeschlagen (nur in VHDL Syntax ;-):
1
   Ausgang <= '1' when input_A='1' and input_B='0' else '0';

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren