Forum: FPGA, VHDL & Co. Taktverschieben


von Martin Sauer (Gast)


Lesenswert?

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

von Igor (Gast)


Lesenswert?

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ß

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


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

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


Lesenswert?

>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

von Igor (Gast)


Lesenswert?

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