Frequenzteiler für ungerade Zahlen

Wichtiger Hinweis: Sie helfen mir nicht bei meinen Hausaufgaben. Dies ist ein Wettbewerb für Ingenieurstudenten, der Sie dazu ermutigt, "Ihr Netzwerk zu nutzen" ;)

Ich habe dieses Muster für einen Frequenzteiler, der den Takt durch 5 teilt. Es soll ein großes Problem haben, aber ich kann nicht genau herausfinden, was es ist.

Geben Sie hier die Bildbeschreibung ein

Die Optionen, die ich habe, um dieses Problem zu beheben, sind:

  • X==(000|001|100), Y==(001)
  • X==(000|001|010|011), Y==(010|011)
  • X==(001|010|011), Y==(000)
  • Sowohl a) als auch c) sind richtig!

Ich habe mir die Zeit genommen, die Signale im ursprünglichen Design und in Option Nummer 3 abzubilden, da ich dachte, das sei die Antwort.

http://imgur.com/dD30q

Ich habe die Uhr um einen halben Taktzyklus verschoben, hoppla. Sollte aber nichts ändern. Der Rest wird von Hand erledigt.

Hat hier jemand gute Vorschläge?

Antworten (3)

Es soll ein großes Problem haben

Das einzige mögliche Problem, das mir auffällt, ist die Glitch-Prävention. Ihr Ausgang ist ein Taktsignal, daher wäre er sehr empfindlich gegenüber zusätzlichen Flanken. Da es sich jedoch um eine kombinatorische Ausgabe handelt, kann es zu Störungen kommen.

Nehmen wir nur als Beispiel an, Sie hätten diese naive Implementierung eines vollständigen Übertragsgenerators (mindestens 2 Eingaben von 3 sind wahr), nämlich

Y = ABC + AB(!C) + A(!B)C + (!A)BC

Wenn Ihre ABC-Signale von 111 auf 011 wechseln, besteht je nach Ausbreitungsverzögerung die Möglichkeit, dass der Ausgang Y, der die ganze Zeit eine 1 sein sollte, Ihnen einen kurzen Glitch von 0 gibt. Was im Grunde los ist, ist, dass der Ausgang ist Die Richtigkeit muss sich von einem Term zum anderen verschieben: ABC -> (!A)BC in diesem Fall. Wenn der (!A)BC-Term eine längere Ausbreitungsverzögerung hat als der ABC-Term für den 1 -> 0-Übergang auf A, dann können beide Terme ABC und (!A)BC für kurze Zeit 0 sein, und Sie erhalten eine 0 als Ausgang.

Eine ordnungsgemäße Implementierung ist eine, bei der eine Änderung eines einzelnen Eingangsbits keine Störungen im Ausgang erzeugt: Der Pegel des Ausgangs wird von zwei Termen geteilt, wenn er übergeht. Im Falle eines Full-Carry-Generators funktioniert dies:

Y = AB + BC + CA

In Ihrem Fall gibt es zwei mögliche Ursachen für Störungen.

Einer ist, dass sich X und Z fast gleichzeitig ändern - aber in Ihrem Fall sollte dies gemäß Ihren Zeitdiagrammen nicht passieren.

Die andere ist, dass die kombinatorische Logik, die X erzeugt, störanfällig ist. Wir wissen nicht, wie es implementiert ist, also ist das schwer zu sagen.

Die einfachste Lösung besteht in beiden Fällen darin, ein Flip-Flop an den Ausgang zu kleben, mit demselben Takteingang wie Ihre anderen Flip-Flops. Moderne Flipflops haben Sample/Hold-Spezifikationen, so dass jede Ausbreitungsverzögerung >= 0 und < (Taktperiode - Setup-Zeit) stabile, störungsfreie Ausgänge erzeugt. Wenn Ihre Taktperiode also nicht wirklich schnell ist, wird jede Störung am Eingang von das Flip-Flop wird sich bis zum Beginn seines Setup-Zeitfensters an der nächsten Taktflanke beruhigen.

Wenn Sie die Verzögerung durch das Setzen eines Flip-Flops am Ausgang nicht tolerieren können, müssen Sie sicherstellen, dass die gesamte kombinatorische Logik, die den Ausgang direkt erzeugt, störungsfrei ist.

Ich hatte übersehen, dass es sich um einen Taktausgang handelte. Glitches sind mit ziemlicher Sicherheit das "Hauptproblem". Ich dachte, dass eine der Antworten eine optimalere Logiklösung hatte (weniger Gatter).

Ich würde vorschlagen, mit einem Division-durch-fünf-Zähler zu beginnen, dessen Bits für zwei Zählungen hoch und für drei niedrig sind. Zum Beispiel:

Q0 := !Q1 & !Q2;
Q1 := Q0;
Q2 := Q1;

Dieser Zähler durchläuft die Sequenz: 000 001 011 110 100 (ein Wert von 101 erreicht einen gültigen Zustand nach zwei Takten; 010 oder 111 erreichen einen gültigen Zustand nach einem Takt). Jedes Bit davon kann als Zwei-Hot-Ausgang verwendet werden.

Nehmen Sie den Ausgang dieses Zählers und speisen Sie ihn in einen Latch ein, der durch die entgegengesetzte Taktflanke getriggert wird. Das "ODER" dieses Zählerausgangs mit dem ersten würde die gewünschte Wellenform ergeben.

Keine Notwendigkeit, es so komplex zu machen. Ich habe für die Division durch 3 gemacht. Sie können es verallgemeinern oder für die Division durch 5 fest codieren, indem Sie einfach den Wert von c1 und Sensitivity Elements ändern. Unten ist der Code:

module clk ();
reg clk,clkout;
initial clk =0;
initial clkout = 0;
int c1,c2,c3;
always #5 clk = ~clk;
always@(posedge clk or negedge clk)
begin
c1 <= c1 +1;

if (c1 == 5)
begin
c1 <= 0;
end

//
end

always@(posedge clk or negedge clk)
begin
if(c1==0 || c1 == 3)
begin
clkout = ~clkout;
end
end


endmodule
Sie sollten Ihren Code formatieren, das ist sehr schwer zu lesen
Wählen Sie den Text aus und drücken Sie die {}Code-Schaltfläche in der Editor-Symbolleiste. Beachten Sie, dass Sie anscheinend ein Programm für etwas bereitgestellt haben, ohne zu sagen, was dieses Etwas ist. Beachten Sie auch, dass es bei der Frage um Logik geht, nicht um Programmierung. Sehen Sie schließlich, dass das OP vor sieben Jahren eine Antwort akzeptiert hat.
@DHANESH: nidhin hat die Code-Tags hinzugefügt, aber Sie müssen den Code richtig einrücken und erklären, wie dies die Frage beantwortet.