Forum: FPGA, VHDL & Co. Signalverschiebung - HIGH aktiv


von Jan (Gast)


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.

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


Lesenswert?

Wie sehen die Signale aus, was ist die Zeit x, welchen Takt hast du im 
FPGAG, wieviel das das Ausgangssignal jittern?

Kannst du einfach mal ein aussagefähiges Timing-Diagramm malen?

von Schlumpf (Gast)


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...

von Jan (Gast)


Angehängte Dateien:

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

von Schlumpf (Gast)


Lesenswert?

wie wäre es mit

Output <= Input_A and not Input_B;

von TM F. (p_richner)


Lesenswert?

1
 IF (inputA ==1 && inputB ==0) THEN
2
  output =1
3
ELSE
4
  output =0

oder übersehe ich etwas?

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


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';

: Bearbeitet durch Moderator
von Rolf S. (audiorolf)


Lesenswert?

Ich glaube, Flankenerkennung ist hier schon zuviel. Und-Gatter müsste 
reichen.

von berndl (Gast)


Lesenswert?

Lothar ich bin entsetzt! Du verwendest Variablen an einer Stelle wo du 
sie gar nicht brauchst...
Mit Signalen waeren die Abfragen auch nicht komplizierter:
1
...
2
if srA(1 downto 0)="01" then
3
...

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


Lesenswert?

berndl schrieb:
> Du verwendest Variablen an einer Stelle wo du sie gar nicht brauchst...
Ach komm, da lasse ich einfach mal fünfe gerade sein... ;-)

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.