mikrocontroller.net

Forum: FPGA, VHDL & Co. Taktverschieben


Autor: Martin Sauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

SIGNAL CNT               : integer range 0 to 2 :=0;

-----------------------------    
    ZAEHLEN:  process (CLK_60MHZ)
    begin
      if rising_edge (CLK_60MHZ) then
        if TAKT_RESET = '1' then 
          CNT<=0;
        elsif CNT = 2 then
          CNT <=0;
        else        
          CNT <= CNT + 1;
        end if;
      end if;
    end process ZAEHLEN;
    ----------------------------
    TAKT :process (CNT)
    begin
      
      if TAKT_RESET = '1' then
        CLK_OUT0_20MHZ <= '0';
        CLK_OUT1_20MHZ <= '0';
        CLK_OUT2_20MHZ <= '0';
        CLK_OUT3_20MHZ <= '0';
      elsif CNT = 0 then
        CLK_OUT0_20MHZ <= '1';
        CLK_OUT1_20MHZ <= '1';
        CLK_OUT2_20MHZ <= '0';
        CLK_OUT3_20MHZ <= '0';
      elsif CNT = 1 then
        CLK_OUT0_20MHZ <= '0';
        CLK_OUT1_20MHZ <= '0';
        CLK_OUT2_20MHZ <= '1';
        CLK_OUT3_20MHZ <= '0';
      elsif CNT = 2 then
        CLK_OUT0_20MHZ <= '0';
        CLK_OUT1_20MHZ <= '0';
        CLK_OUT2_20MHZ <= '0';
        CLK_OUT3_20MHZ <= '1';
      
      
                            end if;
    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ß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
SIGNAL sr  : std_logic_vector (3 downto 0) := "0011";

-----------------------------    
    process (CLK_60MHZ) begin
      if rising_edge (CLK_60MHZ) then
        sr <= sr(2 downto 0) & sr(3);
      end if;
    end process;
----------------------------
    CLK_OUT0_20MHZ <= sr(0);
    CLK_OUT1_20MHZ <= sr(1);
    CLK_OUT2_20MHZ <= sr(2);
    CLK_OUT3_20MHZ <= sr(3);
Wobei man sich über das auszugebende Bitmuster noch klar werden muß :-o

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum takt nochmal kann man es auch in einer Statemaschine machen??

Ist das ok?




Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.