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.
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.
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).
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;
Shreyas
Dzarda
Shreyas
Dzarda
Chris Stratton
Shreyas
Shreyas