Hi,
habe nun schon ein paar Beiträge zum Thema Frequenzteiler gefunden aber
so richtig helfen tun die mir bei meinem Problem nicht.
Ich hab ein FPGA mit 50Mhz Boardtakt und brauch für meine Aufgabe einen
Frequenzteiler der 2Hz, 16 Hz und 16 kHz als Ausgang hervorbringt.
Mein Problem ich kann den Ursprungstakt doch immer nur halbieren oder?
So komme ich aber nicht auf die gesuchten Frequenzen... wie kann ich das
mithilfe von Countern erreichen?
Außerdem, steht als "Zusatzangabe" in meiner Aufgabe sowas:
"Die Leitung freq16khz_o vom Typ std_logic liefert ein periodisches
Signal von 16 kHz.
Das Signal ist jeweils für genau eine Periode des Systemtaktes auf „1“
und ansonsten auf
„0“. Nach einem Reset geht es zunächst mit der „0“-Phase los."
Was soll das denn heißen das Signal sei für eine Periode des
Systemtaktes auf '1'? Daraus werd ich gar nicht schlau um 16kHz Bspw zu
erzeugen brauch ich doch ne ganze Menge an Perioden des Systemtaktes?
@ Master1991 (Gast)
>Ich hab ein FPGA mit 50Mhz Boardtakt und brauch für meine Aufgabe einen>Frequenzteiler der 2Hz, 16 Hz und 16 kHz als Ausgang hervorbringt.
Kein Probelem.
>Mein Problem ich kann den Ursprungstakt doch immer nur halbieren oder?
Oder. Man kann im einfachsten Fall durch (N+1) teilen, wenn man einen
Zählen von N bis 0 rückwärts zählen lässt. Oder von 0-N. Danach macht
man einen synchronenen Reset und es geht von vorn los.
Die fortgeschrittende, dennoch recht einfache Methode heißt DDS.
Damit kann man nahezu beliebige Teilerfaktoren realisieren, wenn gleich
nicht vollkommen jitterfrei.
>"Die Leitung freq16khz_o vom Typ std_logic liefert ein periodisches>Signal von 16 kHz.>Das Signal ist jeweils für genau eine Periode des Systemtaktes auf „1“>und ansonsten auf>„0“. Nach einem Reset geht es zunächst mit der „0“-Phase los."Taktung FPGA/CPLD.
Master1991 schrieb:> Was soll das denn heißen das Signal sei für eine Periode des> Systemtaktes auf '1'? Daraus werd ich gar nicht schlau um 16kHz Bspw zu> erzeugen brauch ich doch ne ganze Menge an Perioden des Systemtaktes?
Noe, dein Signal geht genau fuer 20ns auf '1' und dann fuer 62.48us auf
'0'
20ns + 62.48us = 62.5us.
1/62.5us = 16kHz
Du brauchst ein Zaehler der nach 3125 Perioden deines 50MHz Taktes auf 0
zurueckgesetzt wird.
Master1991 schrieb:> wie kann ich das mithilfe von Countern erreichen?> ...> Was soll das denn heißen das Signal sei für eine Periode des> Systemtaktes auf '1'?
Siehe dort das letzte Beispiel:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
Die 50MHz werden auf 4Hz heruntergeteilt und dann pro viertel Sekunde
für 20ns ein Clock-Enable (t) gesetzt.
Und hier wird in einem "Vorteiler" Modul ein Clock-Enable für das
Lauflicht erzeugt:
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.htmlHelmut Lenzen schrieb:> Du brauchst ein Zaehler der nach 3125 Perioden deines 50MHz Taktes auf 0> zurueckgesetzt wird.
Der Vorschlag wird von Anfängern dann gern falsch umgesetzt.:
korrekterweise muss der Zähler nach 3124 Perioden auf 0 zurückgesetzt
werden, weil auch der Zählerwert 0 ein Zählschritt ist, und 0..3124
schon die gewünschten 3125 Taktzyklen sind...
Wer das alles nicht selber ausrechnen will, der kann das auch den
Synthesizer machen lassen. So wie hier der Zählerwert für die Baudrate
berechnet wird:
http://www.lothar-miller.de/s9y/categories/42-RS232
(Die Sache mit dem einen Zählschritt erkennt man dort am immer wieder
auftauchenden "-1")
Achso, ich glaub nun ist der Groschen gefallen.
Die '0' und '1' Zeiten des geteilten Taktes müssen nicht gleichlang
sein, ich dachte das wäre für den Takt vorraussetzung.
Dann versteh ich das auch mit dem Zähler...danke war sehr hilfreich :)
Vielleicht könnt ihr mir auch hierzu kurz sagen was ich falsch gemacht
hab,
bin leider noch nicht sonderlich fit in VHDl und hab mitlerweile echt
viel Probiert, er sagt mir nun immer das ich die Operation mit zaehler
im if nicht durchführen kann:
"entity genFrequenzteiler is
generic(teiler: positive);
port(
clk_i, reset_i :in std_logic;
freqXXhz_o: out std_logic
);
begin
--synthesis off
assert(teiler >=2) report "Der Teiler ist zu klein" severity failure;
--synthesis on
end genFrequenzteiler;
architecture Behavioral of genFrequenzteiler is
signal zaehler: natural range teiler - 1 downto 0;
begin
zustandsuebergangsfunktion: process(clk_i)
begin
if rising_edge(clk_i) then
if reset_i = '1' then
freqXXhz_o <= '0';
zaehler <= zaehler'high;
elsif zaehler = '0' then
freqXXhz_o <= '1';
zaehler <= zaehler'high;
else
freqXXhz_o <= '0';
zaehler <= zaehler - 1;
end if;
end if;
end process;
end Behavioral;"
Master1991 schrieb:> elsif zaehler = '0' then
Das kann auch nicht funktionieren, weil zaehler nicht nur ein einzelnes
Bit ist, was eben '0' oder '1' sein kann.
Warum verwendest du überhaupt natural?
So synthetisiert es zum Beispiel bei mir, eine Testbench hab ich aber
noch nicht bemüht. Also keine Ahnung ob es korrekt funktioniert, aber
ich denke schon.
1
2
entitygenFrequenzteileris
3
generic(teiler:positive:=10);
4
port(
5
clk_i,reset_i:instd_logic;
6
freqXXhz_o:outstd_logic
7
);
8
begin
9
--synthesis off
10
assert(teiler>=2)report"Der Teiler ist zu klein"severityfailure;
11
--synthesis on
12
endgenFrequenzteiler;
13
14
architectureBehavioralofgenFrequenzteileris
15
16
signalzaehler:integerrangeteiler-1downto0;
17
18
begin
19
zustandsuebergangsfunktion:process(clk_i)
20
begin
21
ifrising_edge(clk_i)then
22
ifreset_i='1'then
23
freqXXhz_o<='0';
24
zaehler<=teiler-1;
25
elsifzaehler=0then
26
freqXXhz_o<='1';
27
zaehler<=teiler-1;
28
else
29
freqXXhz_o<='0';
30
zaehler<=zaehler-1;
31
endif;
32
endif;
33
endprocess;
34
endBehavioral;
Edit: Testbench schaut auch gut aus, denke es sollte so hinhauen.
Fabio W. schrieb:> assert(teiler >=2) report "Der Teiler ist zu klein" severity failure;
was soll'n dette sein?
oben auf 10 setzen und dann ein Problem melden?
G.U. schrieb:> Fabio W. schrieb:>> assert(teiler >=2) report "Der Teiler ist zu klein" severity failure;> was soll'n dette sein?>> oben auf 10 setzen und dann ein Problem melden?
Ähm, einerseits habe ich nur die relevanten Stellen angepasst, damit es
synthetisierbar ist, und auf der anderen Seite hat da glaube ich jemand
noch keine Generics verstanden?
Ich mein ich bin noch Anfänger, aber der Sinn von Generics ist unter
Anderem, während einer Instanziierung im Generic-Map die
'Voreinstellung' zu überschreiben.
So kann ich zwar die 10 da stehen lassen, aber wenn ich in der Testbench
bei der Instanziierung eine 1 überschreibe, läuft der Simulator nicht.
D.h. du schreibst Dir per generic etwas Unsinniges rein, um zu prüfen,
ob Du bei der Programmierung das generic auch überschrieben hast?
Fabio W. schrieb:> hat da glaube ich jemand noch keine Generics verstanden?
Bist du sicher, dass Du den Sinn verstanden hast?
Ich will nicht sagen, dass das falsch ist, aber doch zumindest im Sinn
konträr, wenn auch innovativ. Machst Du das bei den INIT Werten für
Signale auch so?
Ralf schrieb:> D.h. du schreibst Dir per generic etwas Unsinniges rein, um zu prüfen,> ob Du bei der Programmierung das generic auch überschrieben hast?
Ich bin mir nicht sicher, ob ich dich richtig verstehe. Daher beschreibe
ich mal, wieso ich solche asserts bei Generics auch einbaue:
HDL Projekte werden in Funktionsblöcke unterteilt. Die einzelnen
Funktionsblöcke beschreiben unabhängige, einzeln testbare Einheiten die
eine bestimmte Funktionalität implementieren.
Wie bekannt können Generics dazu genutzt werden, solche Blöcke
anzupassen bzw. Teilfunktionen weg zu lassen.
Gut getestete Funktionsblöcke möchte man in Zukunft auch in anderen
Projekten einsetzen. Dabei können Fehler bei der Instantierung auftreten
(Doku nicht gelesen/nicht vorhanden, anderer Entwickler etc.), diese
Fehler sucht man dann lange, weil der Code ja älter ist und von jemand
anderem geschrieben.
Ein assert das den betreffenden Generic überprüft gibt dem Entwickler in
der Simulation schnell auskunft, dass er diesen Block falsch benutzt.
Ralf schrieb:> Ich will nicht sagen, dass das falsch ist, aber doch zumindest im Sinn> konträr, wenn auch innovativ. Machst Du das bei den INIT Werten für> Signale auch so?
Signale mit Werten zu initialisieren ist nicht Synthesefähig, daher
erledigt sich diese Frage schon.
Christoph Z. schrieb:> Signale mit Werten zu initialisieren ist nicht Synthesefähig, daher> erledigt sich diese Frage schon.
Das war vielleicht vor 20 Jahren mal so.
Christian R. schrieb:> Christoph Z. schrieb:>> Signale mit Werten zu initialisieren ist nicht Synthesefähig> Das war vielleicht vor 20 Jahren mal so.
Naja, bei Lattice ist das gerade mal 5 Jahre her... ;-)
Mein Studienabschluss ist ca. 6 Jahre her, das müsste damals also schon
nicht mehr aktuell gewesen sein. Trotzdem wurde mir das an mehreren
Stellen beigebracht.
Gibt es praktische Beispiele wo initialisierte Signale helfen und im
Design von anderen auch akzepiert werden?
Christoph Z. schrieb:> Gibt es praktische Beispiele wo initialisierte Signale helfen und im> Design von anderen auch akzepiert werden?
Die sind doch in nahezu jedem Design nützlich, Zähler, State-Machines
usw. und ressourcenschonender als ein (nicht wirklich benötigter) Reset
sowieso. Selbst viele Beispiel-Codes von Xilinx arbeiten seit langem mit
initialisierten Signalen. Und wieso sollten die nicht von anderen
akzeptiert sein? Das ist doch eine wahnsinnige Erleichterung.
Aus dem WP272 von Xilinx:
1
A design implemented in a Xilinx FPGA does not require insertion of a global reset
2
network. For the vast majority of any design, the initialization state of all flip-flops and
3
RAM following configuration is more comprehensive than any logical reset will ever
Christoph Z. schrieb:> Mein Studienabschluss ist ca. 6 Jahre her, das müsste damals also schon> nicht mehr aktuell gewesen sein.
Um es kurz zu machen: es war damals schon nicht mehr aktuell.
> Trotzdem wurde mir das an mehreren Stellen beigebracht.
Ja, das ist tragisch. Aber leider Realität...
Die Unterstützung der Init-Werte war schon immer mit abhängig davon,
welches Synthesetool verwendet wurde. Aber ein SRAM-basiertes FPGA kann
die Initialisierung systembedingt, weil ja soweiso jedes Flipflop beim
Booten aus einem PROM/FLASH geladen wird.
Ralf schrieb:> D.h. du schreibst Dir per generic etwas Unsinniges rein, um zu prüfen,> ob Du bei der Programmierung das generic auch überschrieben hast?
Nein, das muss ja nichts Unsinniges sein, es ist einfach irgendein
Default-Wert. Und wenn man das Modul dann halt nochmal braucht, aber in
andere Wortbreite oder was auch immer, verwende ich generic map.
Prinzipiell hat Christoph das ganz gut beschrieben, wie ich das meinte:
Christoph Z. schrieb:> HDL Projekte werden in Funktionsblöcke unterteilt. Die einzelnen> Funktionsblöcke beschreiben unabhängige, einzeln testbare Einheiten die> eine bestimmte Funktionalität implementieren.> Wie bekannt können Generics dazu genutzt werden, solche Blöcke> anzupassen bzw. Teilfunktionen weg zu lassen.>> Gut getestete Funktionsblöcke möchte man in Zukunft auch in anderen> Projekten einsetzen. Dabei können Fehler bei der Instantierung auftreten> (Doku nicht gelesen/nicht vorhanden, anderer Entwickler etc.), diese> Fehler sucht man dann lange, weil der Code ja älter ist und von jemand> anderem geschrieben.>> Ein assert das den betreffenden Generic überprüft gibt dem Entwickler in> der Simulation schnell auskunft, dass er diesen Block falsch benutzt.> Fabio W. schrieb:>> hat da glaube ich jemand noch keine Generics verstanden?> Bist du sicher, dass Du den Sinn verstanden hast?
Sicher nicht, aber das was ich bisher so gelesen habe, dachte ich, dass
es so wäre, wie ich es glaube. Zumal ich keine Ahnung hätte, wozu ich
generics sonst verwenden soll, außer zu genanntem Zweck. Alles andere
geht doch mit Konstanten genauso, oder nicht? Ich mein mangels Erfahrung
kann es auch sein, dass ich irgendetwas wichtiges vergesse...
Lothar Miller schrieb:> Die Unterstützung der Init-Werte war schon immer mit abhängig davon,> welches Synthesetool verwendet wurde. Aber ein SRAM-basiertes FPGA kann> die Initialisierung systembedingt, weil ja soweiso jedes Flipflop beim> Booten aus einem PROM/FLASH geladen wird.
Hmm, da ich erst ein paar Wochen 'dabei' bin, hab ich da noch keinen
Überblick, aber warum wurde es denn überhaupt jemals nicht unterstützt
mit Init-Werten? Waren das dann einfach keine SRAM-FPGAs oder wie?
Lattice stellt ja glaube ich auch heute noch welche in
Anti-Fuse-Technologie her, hab ich irgendwo gelesen, liegt das dann
daran?
Fabio W. schrieb:> Überblick, aber warum wurde es denn überhaupt jemals nicht unterstützt> mit Init-Werten? Waren das dann einfach keine SRAM-FPGAs oder wie?
HDLs und die Tools dazu kommen hauptsächlich aus der Disziplin Chip
Entwicklung. Einen Siliziumchip mit fixer Funktion (Also alles ausser
FPGA/PLD) muss man nicht nach dem einschalten konfigurieren, man kann
ihn nur Reseten.
Daher haben das die Synthese Tools auch lange nicht unterstützt, weil
sie es nicht von Anfang an können mussten.
Darum habe ich das auch so in meiner Ausbildung gelernt, dass das nicht
geht. Ich hatte nie FPGA spezifischen Unterricht, immer nur
Digitaltechnik oder ASIC Design. Dann lernt man "ohne Init-Werte dafür
mit Reset".
Christoph Z. schrieb:> ASIC Design. Dann lernt man "ohne Init-Werte dafür> mit Reset".
Dito. Das muss man dann halt jeweils unterscheiden, was man bauen will
und wofür.
Sind das nun richtige Takte oder einfach einables?
Wozu braucht man da ein komplexes Modul?
Nochmal was hierzu:
Christian R. schrieb:> Zähler, State-Machines usw. und ressourcenschonender als ein> (nicht wirklich benötigter) Reset sowieso.
Wer sagt, dass der nie benötigt wird?
> Selbst viele Beispiel-Codes von Xilinx arbeiten seit langem mit> initialisierten Signalen.
Ob Xilinx der Massstab ist? Altera FPGAs haben doch einen (asan)Reset
und der kostet auch nicht mehr resourcen, meine ich mal gelesen zu
haben.
Propagiert Xilinx dies nur, weil sie ihn elimiert haben?
Frank schrieb:> Altera FPGAs haben doch einen (asan)Reset und der kostet auch nicht mehr> resourcen, meine ich mal gelesen zu haben.
Du solltest dein Wissen updaten. Altera hat zwar ein globales Resetnetz
in ihren FPGAs. Aber auch Altera empfihelt, den asynchronen Reset erst
mal einzusynchonisieren und dann erst zu verwenden (= Synchronized
Asynchronous Reset).
Und spätestens bei der 2. Taktdomäne ist der Vorteil des einen globalen
Resetnetzes dahin und jedes Flipflop der zweiten Domäne muss vom Router
extra verdrahtet werden.
> Propagiert Xilinx dies nur, weil sie ihn elimiert haben?
Es ist nur konsequent, etwas einzusparen, was keinen echten Wert hat.
> Wer sagt, dass der nie benötigt wird?
Wenn ich einen Reset benötige, dann nicht für das ganze FPGA. Und wenn
doch, dann zerre ich kurz an der Programmierleitung und lade das FPGA
neu...
Lothar Miller schrieb:> Frank schrieb:>> Altera FPGAs haben doch einen (asan)Reset und der kostet auch nicht mehr>> resourcen, meine ich mal gelesen zu haben.> Du solltest dein Wissen updaten.
Daher frage ich ja den FPGA-guru Miller :-)
> Altera hat zwar ein globales Resetnetz in ihren FPGAs
Also war mein Wissen doch so falsch nicht :-)
> Aber auch Altera empfihelt, den asynchronen Reset erst mal> einzusynchonisieren und dann erst zu verwenden
Das ist klar- aus den bekannten Gründen. Trotzdem ist das Resetnetz bei
Altera ja offenbar eine vorhandene Resource, die - wenn sie genutzt wird
- keine freien Resourcen verbrät, wie der Reset bei Xilinx ?
> Und spätestens bei der 2. Taktdomäne ist der Vorteil des einen globalen> Resetnetzes dahin und jedes Flipflop der zweiten Domäne muss vom Router> extra verdrahtet werden.
Warum sollte man nicht einen Rest für alle Domänen nutzen können? Wenn
das aus nicht geht, würde es auch nur die FFs der Sonderdomäne betreffen
und ein Verteil in der Hauptdomäne bestünde immer noch, oder?
> Wenn ich einen Reset benötige, dann nicht für das ganze FPGA.
Aha, dann reicht also doch ein Resetnetz für die wenigen resetwilligen
FFs, oder?
> Und wenn doch, dann zerre ich kurz an der Programmierleitung und lade> das FPGA neu...
hart aber herzlich, ok.
Xilinx schrieb:> A design implemented in a Xilinx FPGA does not require insertion of> a global reset network. For the vast majority of any design,> the initialization state of all flip-flops and RAM following> configuration is more comprehensive than any logical reset> will ever be
Mit der Darstellung gehe ich aus 3 Gründen nicht so 100% konform:
1. Ist das nicht (mehr ?) wirklich eine Besonderheit der Xilinx-FPGAs,
wobei ich natürlich nicht sicher bin, ob man das als Wettbewerbsvorteil
herausstellen wollte.
2. Ist das nicht der "logische", sondern der "physische" Reset -
insbesondere, wenn er asynchon angewendet wird. s.u.
3. Ist das auch kein vollständiger *re*-set, der mit dem eines ASIC
vergleichbar wäre.
Der einmalige INIT-Vorgang ist schon deshalb funktionell nicht dasselbe,
wie ein wirklicher (zur Laufzeit) durchfürbarer Reset, weil er nicht in
einem Takt durchführbar ist, insbesondere dann nicht, wenn er ein
synchroner ist, was er unter Zuhilfenahme der fabric logic in aller
Regel ja sein muss - siehe Xilinx-eigene Docu.
Weiters ist nur ein echter Reset in der Lage, alle state machines und
Register zu initialisieren, ohne dass die Ausgänge auf "Z" gehen, wie
bei einem reboot-vorgang des FPGAs. Aus FPGA-Sicht mag das logsich
Dasselbe sein, aus Schaltungssicht aber nicht. Dies gilt speziell dann,
wenn man Teile der Schaltung logisch resetten will, um Module zu starten
oder gar im Fall eines irgendwie gearteten (strahlungsbedingten)
Ausfalls komplett neu initialisieren muss, ohne den Rest anzufassen.
Ganz pauschal in allgemeinen Designs für FPGAs keinen Reset vorzusehen,
ist daher nicht so zielführend. Wenn Code verschieden genutzt werden
muss, braucht er eine logischen (für dieses Modul aktiven) Reset in der
richtigen clock domain (und damit gfs mehrere Resets bei mehreren
Domains!) und er benötigt zusätzlich auch noch einen asynchronen Reset,
wenn das VHDL mal ins ASIC wandern soll.
aReset, sReset, lReset und INIT sind jeweils verschiedene Paar Schuhe
und nur im Spezialfall gegeneinander austauschbar.
Frank schrieb:> Propagiert Xilinx dies nur, weil sie ihn elimiert haben?
Wenn Xilinx physikalisch in den FPGAs keinen (asynch! Reset) einbaut,
ist das durchaus richtig so, denn in der Tat wird damit teure Fläche
verbraten. Das bedeutet aber noch lange nicht, dass man in der
Beschreibung keinen drin haben darf und muss, denn es gibt auch Designs
für PLDs, die kein INIT haben.
Dass man bei Xilinx zudem keinen synchronen Reset einbauen muss, weil
man zur Laufzeit keinen braucht und zur Startzeit ja der INIT alles
erledigt, ist auch kein heiliger Gral sondern nur eine Option, die genau
dann gilt, wenn man zur Laufzeit auch wirklich keinen braucht. Das
aber ist nicht in allen Designs so - siehe "logischer" oder sagen wir
besser "funktioneller" Reset.
Dieser ist in vielen Designs / Modulen übrigens durchaus enthalten,
wenngleich meistens implizit, z.B. bei state machines, die von einer
übergeordneten FSM mit dynamischem timing gesteuert werden: Die werden
per Signal in einen Startzustand gesetzt oder in einem Haltzustand
gehalten, um von dort aus loszulaufen. Haben alle Module so ein
Zustandsverhalten, haben wir eine Art globalen Reset.
Frank Petelka schrieb:>> Wenn ich einen Reset benötige, dann nicht für das ganze FPGA.> Aha, dann reicht also doch ein Resetnetz für die wenigen resetwilligen> FFs, oder?
Das eine Netz würde reichen, wenn alle FF in der selben Taktdomäne
wären.
> Warum sollte man nicht einen Rest für alle Domänen nutzen können?
Weil ein wirklich asynchroner Reset von keinem FPGA Hersteller als
sinnvoller Weg beschrieben wird.
> Das ist klar- aus den bekannten Gründen. Trotzdem ist das Resetnetz bei> Altera ja offenbar eine vorhandene Resource, die - wenn sie genutzt wird> - keine freien Resourcen verbrät, wie der Reset bei Xilinx ?
Das Resetnetz ist auch bei Xilinx da und wird für den Bootvorgang
verwendet. Und ich bin mir nicht ganz sicher, ob ich nach dem
empfohlenen Einsynchronisieren bei Altera wieder so einfach auf das
Resetnetz komme.
>> Du solltest dein Wissen updaten.> Daher frage ich ja den FPGA-guru Miller :-)
Ich würde mir nie einfach so glauben. Aber das Alles kann man in
Datenblättern und Appnotes jedes Herstellers nachlesen...
Frank Petelka schrieb:> Lothar Miller schrieb:>> Wenn ich einen Reset benötige, dann nicht für das ganze FPGA.> Aha, dann reicht also doch ein Resetnetz für die wenigen resetwilligen> FFs, oder?
Nur was einen asynchronen angeht und das ist der, den man im FPGA
seltener braucht. Siehe meine Ausführung oben logischer <-> synchroner
Reset.
>> Und wenn doch, dann zerre ich kurz an der Programmierleitung und lade>> das FPGA neu...> hart aber herzlich, ok.
Das wie gesagt geht nur, wenn der FPGA eine Weile "tot" sein darf. Das
Wiederladen eines FPGAs kann mitunter recht lange dauern und in der Zeit
ist die Schaltung, die vom FPGA gesteuert wird, ebenfalls tot. Im
ungünstigsten Fall geht durch die hochohmigen Pins etwas kaputt wie z.B.
bei einer ungesteuerten Leistungsschaltung bzw bei dem, was dranhängt
(da hätte ich ein Beispiel) oder aber es verursacht einen Geräteabsturz,
bzw im Fall einer Triebwerksregelung einen Flugzeugabsturz (auch da
hätte ich einen Fall parat).
In solchen Fällen muss der FPGA arbeiten, wie ein ASIC: Mit einem Takt
global in einen definierten Urzustand, von dem aus das gesamte board
wieder garantiert sauber arbeitet. Dieser Reset ist dann quasi Teil der
use cases.
Jürgen Schuhmacher schrieb:> Im ungünstigsten Fall geht durch die hochohmigen Pins etwas kaputt wie> z.B. bei einer ungesteuerten Leistungsschaltung bzw bei dem, was> dranhängt (da hätte ich ein Beispiel) oder aber es verursacht einen> Geräteabsturz, bzw im Fall einer Triebwerksregelung einen> Flugzeugabsturz (auch da hätte ich einen Fall parat).
Spätestens beim ersten Power-Up muss die Schaltung diesen
Betriebszustand sowieso aushalten...
Aber einfach mal so zwischendurch an der Resetleitung zu zupfen ist idR.
von unbrauchbarem Schaltungsverhalten begleitet. Und meist ist ja gerade
ein Systemabsturz die Ursache für einen Reset. Was hilft es dann dem
Leistungsteil, wenn die Ansteuersignale zwar gültige Pegel, aber
sinnlose statische Zustände haben? Oder dem Flugzeugtriebwerk?
(Wobei ich fast glaube, dass im Falle des Flugzeugs noch mehr
ausgefallen sein musste, denn das Ding fällt ja nicht wie ein Stein vom
Himmel, wenn mal ein Triebwerk ausfällt...)
Mir ist klar, dass es im einzelnen Fall Gründe für lokale und evtl.
sogar asynchrone Resets gibt. Diese Spezialfälle zu verallgemeinern und
zur Regel zu erheben, das finde ich aber sehr gewagt.
Lothar Miller schrieb:>> Daher frage ich ja den FPGA-guru Miller :-)> Ich würde mir nie einfach so glauben.
der war gut ,,,
Diskutiert ihr eigentlich noch über die 50MHz zu 16kHz?
oder übers resetten?
FPGA-Progger schrieb im Beitrag #3590311:
> Diskutiert ihr eigentlich noch über die 50MHz zu 16kHz?> oder übers resetten?
Naja, weil das Thema an sich relativ Anfängerlastig ist, ist es auch
nicht schlecht, im selben Thread über Clock-Enables, die numeric_std und
den Reset zu diskutieren...
FPGA-Progger schrieb im Beitrag #3590311:
> oder übers resetten?
Das hier ist die obligatorische Reset-Diskussion, die minestens einmal
pro Jahr stattfindet :-)))
Die gesamte Diskussion wurde ohnehin nur wieder in Gang gesetzt, weil
der TE von "Taktteilung" spricht. Vermutlich tut er das, weil es in
seiner Hausaufgabe, die es ja offensichtlich ist, auch so drin steht. In
digitalen Schaltungen wie FPGAs, (Basteldesigns, alte Bautechnik mit
74er und Gespiele mal aussen vor gelassen) werden keine Frequenzteiler
benutzt, um Schaltungen zu treiben sondern je Taktdomain ein einziger
Takt, bei möglichst wenigen Domains. Alles geht über enables die vorher
passend gesetzt werden müssen. Das Resultat ist eine vollsynchrone
Schaltung mit Zustandswechseln nur zum Taktzeitpunkt und nicht innerhalb
von Taktperioden. Es gibt keine ge"gate"eten clocks und auch keine
latches, die Zwischenschaltzeitpunkte erzeugen.
Würden die Lehrherren das den Jungdigitalos mal klar und deutlich
verabreichen, wären 90% der Fragereien in Digitalforen unnötig.