Hallo, ich hab in meinem VHDL-Projekt ein Takt mit 650kHz. Diese muesste ich auf 15 Ausgangspins legen und jeden Output die Phase um ein paar Steps schieben. Gibt es dafuer eine einfache Loesung? Vielen Dank fuer Eure Hilfe. mfg martin sauer
Hi, bin zwar selber Anfänger würde aber mal es über 15 Hilfssignale machen, einen Counter definieren für die Taktverschiebungen und über if then, oder case Anweisungen machen. Hier mal ein Beispiel was ich so getestet habe um von 60 Mhz auf 20 Mhz jeweils um 1 Takt verschoben.
1 | SIGNAL CNT : integer range 0 to 2 :=0; |
2 | |
3 | -----------------------------
|
4 | ZAEHLEN: process (CLK_60MHZ) |
5 | begin
|
6 | if rising_edge (CLK_60MHZ) then |
7 | if TAKT_RESET = '1' then |
8 | CNT<=0; |
9 | elsif CNT = 2 then |
10 | CNT <=0; |
11 | else
|
12 | CNT <= CNT + 1; |
13 | end if; |
14 | end if; |
15 | end process ZAEHLEN; |
16 | ----------------------------
|
17 | TAKT :process (CNT) |
18 | begin
|
19 | |
20 | if TAKT_RESET = '1' then |
21 | CLK_OUT0_20MHZ <= '0'; |
22 | CLK_OUT1_20MHZ <= '0'; |
23 | CLK_OUT2_20MHZ <= '0'; |
24 | CLK_OUT3_20MHZ <= '0'; |
25 | elsif CNT = 0 then |
26 | CLK_OUT0_20MHZ <= '1'; |
27 | CLK_OUT1_20MHZ <= '1'; |
28 | CLK_OUT2_20MHZ <= '0'; |
29 | CLK_OUT3_20MHZ <= '0'; |
30 | elsif CNT = 1 then |
31 | CLK_OUT0_20MHZ <= '0'; |
32 | CLK_OUT1_20MHZ <= '0'; |
33 | CLK_OUT2_20MHZ <= '1'; |
34 | CLK_OUT3_20MHZ <= '0'; |
35 | elsif CNT = 2 then |
36 | CLK_OUT0_20MHZ <= '0'; |
37 | CLK_OUT1_20MHZ <= '0'; |
38 | CLK_OUT2_20MHZ <= '0'; |
39 | CLK_OUT3_20MHZ <= '1'; |
40 | |
41 | |
42 | end if; |
43 | end process TAKT; |
Wobei hier noch ein Latch auftritt da ich kein else Zweig hab, aber das hat andere Gründe. Für Verständniss vielleicht hilfreich Gruß
>> Gibt es dafuer eine einfache Loesung? Ich kann mir das noch nicht so richtig vorstellen... :-/ Zeichne doch mal eine Skizze. > Wobei hier noch ein Latch auftritt da ich kein else Zweig hab Und zudem ist die Simulation falsch, weil die Sensitivliste nicht vollständig ist :-o TAKT :process (CNT) << hier fehlt TAKT_RESET
Martin Sauer schrieb: > Hallo, > > ich hab in meinem VHDL-Projekt ein Takt mit 650kHz. Diese muesste ich > auf 15 Ausgangspins legen und jeden Output die Phase um ein paar Steps > schieben. ...um ein paar Steps wovon? Simple Möglichkeit wäre ein Schieberegister, mit einem wesentlich höheren Takt als die 650kHz getaktet. Und dann das Taktsignal permanent durchschieben, die Ausgänge sind dann halt um jeweils einen Taktzyklus des hohen Takt verzögert.
@ Igor (Gast) >Hier mal ein Beispiel was ich so getestet habe um von 60 Mhz auf 20 Mhz >jeweils um 1 Takt verschoben. Ganz schlecht! Deine Taktausgänge sind kombinatorisch! Viel Spass mit Glitches! Das macht man anders, mämlich über FlipFlops in Schieberegistern, wie der Christian schon geschrieben hat. Siehe auch Taktung FPGA/CPLD >Wobei hier noch ein Latch auftritt da ich kein else Zweig hab, Was schon mal ein Doppelfehler ist! Kids, don't try this at home! MFG Falk
>Hier mal ein Beispiel was ich so getestet habe um von 60 Mhz auf 20 Mhz >jeweils um 1 Takt verschoben. Ich hätte das so gemacht:
1 | SIGNAL sr : std_logic_vector (3 downto 0) := "0011"; |
2 | |
3 | -----------------------------
|
4 | process (CLK_60MHZ) begin |
5 | if rising_edge (CLK_60MHZ) then |
6 | sr <= sr(2 downto 0) & sr(3); |
7 | end if; |
8 | end process; |
9 | ----------------------------
|
10 | CLK_OUT0_20MHZ <= sr(0); |
11 | CLK_OUT1_20MHZ <= sr(1); |
12 | CLK_OUT2_20MHZ <= sr(2); |
13 | CLK_OUT3_20MHZ <= sr(3); |
Wobei man sich über das auszugebende Bitmuster noch klar werden muß :-o
Zum takt nochmal kann man es auch in einer Statemaschine machen?? Ist das ok? Gruß
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.