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.
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?
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...
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
1 | IF (inputA ==1 && inputB ==0) THEN |
2 | output =1 |
3 | ELSE
|
4 | output =0 |
oder übersehe ich etwas?
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
Ich glaube, Flankenerkennung ist hier schon zuviel. Und-Gatter müsste reichen.
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 | ...
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.