Taktverschieben

Gast #1551106
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ß
#1551183
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.
#1551396
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
Moderator (Firma: Titel) Persönliche Seite #1551438
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

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