Ausgeben eines Taktsignals von einem FPGA

In Bezug auf die Frage hier: Klicken Sie hier , ich möchte den 16-Kanal-LED-Treiber verwenden, um meine 7-Segment-Anzeigen zu betreiben. Ich verwende ein Spartan 6 LX9 FPGA, um einen 16-Bit-Mikroprozessor zu implementieren, der sich um alles kümmert.

Das Entwicklungsboard, das ich verwende, ist ziemlich Barebone und hat einen integrierten 100-MHz-Takt, oder vielleicht sollte ich sagen, Oszillator. Ich hatte vor, es auf vielleicht ein paar Megahertz zu verlangsamen, es dann über einen GPIO an die LED-Treiber auszugeben und es auf diese Weise mit einem separaten Verilog-Modul zu synchronisieren.

Meine Frage ist, muss ich besonders vorsichtig sein, wenn ich versuche, eine Uhr über einen GPIO auszugeben? Vielleicht einen bestimmten Pin verwenden? Mir wurde zu verstehen gegeben, dass der Takteingang über einen vordefinierten Pin erfolgen soll. Die Uhr könnte langsamer sein, da sie nicht wirklich zu schnell sein muss.

Hier ist das Online-Benutzerhandbuch zum Entwicklungsboard (ziemlich einfach): Klicken Sie hier .

BEARBEITEN: Weitere Informationen:

Ich mache mir Sorgen um den Zeitversatz. Der Chip, den ich mir ansehe, schreibt bei jeder positiven Taktflanke. Ich habe vor, den Takt aufzuteilen und an den Chip zu senden, während das FPGA dasselbe Signal auch verwendet, um Daten seriell zu synchronisieren und an den Chip zu senden. Das Timing scheint ziemlich eng zu sein. Eine langsam genug Uhr könnte jedoch die Antwort sein.

Antworten (4)

Sie können jeden beliebigen GPIO-Pin für die Ausgabe verwenden. Dabei spielt es keine Rolle, ob es sich um einen ausgeglichenen Takt oder beliebige Daten handelt.

Auch die Ausgabe in MHz-Einheiten sollte Ihnen keine Probleme bereiten.


In der sequentiellen Logik gibt es einen Trend, so wenig Uhren wie möglich zu verwenden. Denn Uhren sind sehr oft die wichtigsten Signale, da viele andere von ihnen abhängen.

Ich werde versuchen, hier das Problem der Ausbreitungsverzögerung darzustellen, wie es auf das Ding namens Clock Skew projiziert wird . Stellen Sie sich vor, Sie haben zwei Uhren, eine davon abgeleitet von der anderen:

__/--\__/--\__/--\__/--     <- original clock
___/-----\_____/-----\      <- clock divided by 2

Beachten Sie, dass die unten stehende Uhr um 1 Zeichen verzögert ist (das wäre eine Flip-Flop-Verzögerung, was winzig ist). Es ist in der ASCII-Kunst einfach stark übertrieben.

In einem Blackbox-FPGA-Design müssen Sie sich darüber jedoch keine Gedanken machen. Es ist alles für Sie erledigt. All diese Worst-Case-Timing-Probleme werden in Form der maximalen Taktfrequenz berücksichtigt, mit der das Design ausgeführt werden kann.

Ich habe nie erwähnt, dass die Uhr wieder „multipliziert“ wird. Ich meinte, ein separates Verilog-Modul zu erstellen, um die Uhr herunterzuteilen und sie dann über einen GPIO auszugeben. Und ja, ich mache mir Sorgen um den Zeitversatz. Ich hatte vor, die geteilte Uhr im FPGA zu verwenden, um die Daten zu synchronisieren, die zum Chip gehen. Wenn es langsam genug wäre, wäre es wahrscheinlich egal. Hab ich recht?
@ShreyasVinod: Du hast recht. Ich werde die Antwort bearbeiten.
Ich mache mir keine Sorgen um Timing-Probleme innerhalb des FPGA. Das Synthese-Tool ist erstaunlich und handhabt es gut. Worüber ich mir Sorgen mache, ist der Taktversatz zum externen Chip, der eine gewisse Haltezeit benötigt, damit die seriellen Daten vor und nach der positiven Taktflanke übertragen werden.
@ShreyasVinod: Dann hab keine Angst. Es sind nur ein paar MHz.
@Dzarda - Niedrige Frequenz bedeutet nicht an sich, dass die Anforderungen an die Einrichtungszeit erfüllt werden. Eine Niederfrequenz in Kombination mit dem Treiben des getakteten Signals bzw. der getakteten Signale an der inaktiven Flanke des Takts würde dies jedoch tun. Für engere Situationen legt man in den FPGA-Tools eine Clock-to-Out-Verzögerungsbeschränkung fest.
@ChrisStratton Vielleicht kann ich einen invertierten Takt (oder einfach auf unterschiedliche Flanken reagieren) für den Chip und einen anderen nicht invertierten Takt intern im FPGA verwenden?
Ich habe bereits erreicht, was ich tun wollte. Ich habe einfach eine Taktausgabe gemacht, die von einer anderen Uhr abhängig war. Ich habe eine Schleife verwendet, die die Ausgabe des Takts zu Zeiten auslöst, die der FPGA günstig findet, da er bereits die Haltezeiten für die Daten festgelegt hat.

Die Spartan 6-Familie hat keine dedizierten Clock-Ausgänge, die direkt mit einem Clock-Netzwerk verbunden sind.

Für eine langsame Uhr, wie Sie sie vorschlagen, spielt das wahrscheinlich keine Rolle, da Jitter- und Anstiegs- / Abfallzeitunterschiede für E / A-Pins langsamer sind als die Uhr.

Für schnelle Uhren habe ich die Empfehlung gefunden, einen I/O-Pin im ODDR-Modus zu verwenden, um den Compiler darauf aufmerksam zu machen, dass sowohl steigende als auch fallende Flanken des Signals wichtig sind, und ihn den Rest automatisch erledigen zu lassen.

Was Sie im Grunde vorschlagen, ist, den FPGA-100-MHz-Takt zu nehmen, ihn durch ein paar Flip-Flops laufen zu lassen, um seine Frequenz zu reduzieren, und dann die reduzierte Frequenz auszugeben. Ihre vorgeschlagene Ausgabe ist in FPGA-Begriffen keine Uhr. Es ist nur ein weiterer registrierter Ausgang. Also machen Sie weiter und führen Sie es über einen GPIO-Pin aus.

Ich denke, Sie verwechseln dies mit der Notwendigkeit, einen FPGA-Takt über einen speziellen Takteingangspin in den Chip zu leiten. In diesem Fall ist der Pin mit einem dedizierten Satz von Treibern innerhalb des Chips verbunden, die den Takt an alle internen Punkte verteilen, die ihn benötigen (und die eine beträchtliche kapazitive Last liefern).

Ich verstehe, was Sie sagen, dass es sich um eine registrierte Ausgabe handelt. Was ich meinte war, dass ich mir Sorgen mache, ob die GPIOs überhaupt so schnell schalten können. Und ich bin mir nicht sicher, was Sie brauchen, um einen FPGA-Takt über einen speziellen Takteingangspin in den Chip zu führen. Der Oszillator an Bord und bereits mit dem Pin verbunden, sollte es sein, und das stört mich nicht wirklich.
@ShreyasVinod - Ah. Entschuldigung für die Verwirrung. Solange Sie die Uhr des Entwicklungsboards verwenden, müssen Sie sich keine Sorgen machen. Wenn Sie jemals eine andere Uhr verwenden, müssen Sie lernen, wie Sie sie anschließen. Im Allgemeinen eignen sich GPIO-Pins für MHz-Signale und sogar für 10 MHz, solange Sie nicht versuchen, zu viel Kapazität zu treiben.

Aufgrund der Art und Weise, wie der Takt über das FPGA-Fabric verteilt ist, gibt es spezielle Anforderungen für Eingänge, die Takte sind.

In Ihrem Fall geben Sie jedoch nur einen geteilten Takt an einem GPIO-Pin aus, sodass es keine anderen Anforderungen gibt als die, die ohnehin für den Pin gelten - dh es handelt sich um einen Ausgang mit bestimmten Strombegrenzungen usw.

Hier ist ein Ausschnitt aus einem Code, den ich geschrieben habe - er ist jedoch eher in VHDL als in Verilog:

my_clk_div8: process (clk, i_enable_n)
begin
    --- On async reset
    if (i_enable_n = '1') then
        clk125 <= '0';
        clka   <= '0';
        clkb   <= '0';
        clkc   <= '0';

    --- On clock edge. Implement 4 flipflops with last output inverted
    --- and sent to first input. Divide 100MHz by 8 to get 12.5MHz

    elsif (rising_edge(clk)) then
        clka   <= not clk125;
        clkb   <= clka;
        clkc   <= clkb;
        clk125 <= clkc;
    end if;
end process my_clk_div8;
Das beantwortet definitiv die Frage, die ich gestellt habe. Aber ich mache mir Sorgen wegen der Schräglage. Ich muss den geteilten Takt im FPGA verwenden, um die Daten zu synchronisieren, die zum Chip gehen, und der Chip verwendet auch denselben Takt, um die Daten zu schreiben. Ich habe dies in der Frage nicht erwähnt, ich werde es jetzt aktualisieren.
Ich habe den Code vor über einem Jahr geschrieben, also vergesse ich, warum ich die Teilung mit vier Flip-Flops gemacht habe, aber es ist möglich, dass ich mir damals Sorgen über die Zeitverschiebung machte. Somit wurde der 12,5-MHz-Ausgang mit dem eingehenden Takt synchronisiert. Ich bin mir jedoch nicht 100% sicher, also sieht es so aus, als hätte Dzarda mehr Informationen.