Entwerfen Sie eine Schaltung aus Logikgattern, Flipflops und/oder Multiplexern

Ich möchte eine einfache Schaltung aus Logikgattern, Flipflops (keine RLC-Komponenten) erstellen, um die folgende Aufgabe zu erledigen:

Diese Schaltung hat 5 Eingänge (4 positive reellwertige Signale X 1 , X 2 , X 3 , X 4 und ein Taktsignal C l k ). Die Ausgangssignale j 1 , j 2 , j 3 , j 4 werden wie folgt bestimmt:

An der steigenden Flanke von C l k , das Ausgangssignal j ich mit ich = 1 , 4 entsprechende maximale Eingabe X ich mit X ich = M A X ( X 1 , X 2 , X 3 , X 4 ) zu diesem Zeitpunkt wird Wert haben 1 während andere Ausgangssignale während dieser Periode Null sind.

Zum Beispiel, X 3 = M A X ( X 1 , X 2 , X 3 , X 4 ) Dann j 3 = 1 Und j 1 = j 2 = j 4 = 0 .

Da ich nicht weiß, wie ich von Logikgattern ausgehen soll, habe ich versucht, Verilog-Code zu schreiben und ihn dann synthetisiert, um die Schaltung zu erhalten. Allerdings finde ich das Ergebnis zu kompliziert als nötig. Komponenten wie Logikgatter, Flip-Flops, Multiplexer sind in Ordnung, aber der Komparatorblock ist möglicherweise zu komplex. Gibt es eine einfache Schaltung, um diese Aufgabe zu erledigen? Es kann aus dem Schaltungsdesign von Logikgattern bezogen oder von Verilog synthetisiert werden.

Eingangssignale X 1 , X 2 , X 3 , X 4 sind positive realwertige Signale, aber ich brauche keine hohe Präzision, nur etwa 3 signifikante Zahlen sind in Ordnung.

Unten ist mein Code und die Schaltung, die von diesem Code erhalten wird.

module example (clk, x1, x2, x3, x4, y1, y2, y3, y4);
input clk, x1, x2, x3, x4;
output reg y1, y2, y3, y4;

always @(posedge clk)
    if((x1>x2) && (x1>x3) && (x1>x4))
        begin 
            y1 <= 1'b1;
            y2 <= 1'b0;
            y3 <= 1'b0;
                y4 <= 1'b0;
        end
    else if((x2>x1) && (x2>x3) && (x2>x4)) 
        begin 
            y1 <= 1'b0;
            y2 <= 1'b1;
            y3 <= 1'b0;
            y4 <= 1'b0;
     end
    else if((x3>x1) && (x3>x2) && (x3>x4))
        begin
            y1 <= 1'b0;
            y2 <= 1'b0;
            y3 <= 1'b1;
                            y4 <= 1'b0;
        end
     else if((x4>x1) && (x4>x2) && (x4>x3))

        begin
            y1 <= 1'b0;
            y2 <= 1'b0;
            y3 <= 1'b0;
        y4 <= 1'b1;
        end
   endmodule

Schema aus dem obigen Code erhalten:

Geben Sie hier die Bildbeschreibung ein

Welche Ausgabe erwarten Sie, wenn alle xEingänge 1 sind?
Sie sagen auch, dass die xs "realwertig" sind, aber so, wie Sie es codiert haben, wird davon ausgegangen, dass es sich um digitale 1-Bit-Werte handelt. Verilog hat keine "echten" Zahlen, daher benötigen Sie einen externen ADC und erhalten die Eingabe für dieses Modul als Festkomma-Digitalwerte (es sei denn, Sie möchten einen Gleitkomma-IP-Block entwickeln oder kaufen).
@ThePhoton: 1 sind die Ausgangssignale, nicht die Eingänge.
Der Code, den Sie jetzt haben, behandelt die Eingänge x1, x2, usw. als 1-Bit-Digitalwerte.
@ThePhoton: Oh ja, dann bin ich im Code falsch.
Alternative: Verwenden Sie externe analoge Komparatoren, um Eingänge für Ihr digitales Gerät bereitzustellen. Das Design dieser ist keine Aufgabe für Verilog.
@ThePhoton: Ja, die Verwendung von Komparatoren ist in Ordnung.

Antworten (2)

  • Der Verilog-Code, den Sie für FPGAs schreiben, befasst sich mit digitaler Logik. Es sieht nur Signale, die entweder "hoch" oder "niedrig" sind, es kennt keine Werte dazwischen. In Ihrem aktuellen Code vergleichen Sie nur zwischen Signalen auf der Grundlage von Hochs und Tiefs. Sie interessieren sich für "echte Werte", sagen wir ein analoges Signal, das zwischen 0 und 5 V variiert, und möchten diese vergleichen. Was Sie brauchen, ist nur ein Satz analoger Komparatoren. Zum Beispiel für zwei Signale:

Geben Sie hier die Bildbeschreibung ein

  • Eine andere Möglichkeit besteht darin, Ihre analogen Eingänge an ADCs anzuschließen und sie in digitale Äquivalente umzuwandeln. Sagen Sie zum Beispiel 10-Bit-Digitalwerte. Und speisen Sie diese digitalen Werte in Ihr FPGA. Sie müssten einen ähnlichen Verilog-Code zum Vergleich dieser Signalvektoren schreiben und die Ausgänge entsprechend ansteuern.

Eine Möglichkeit, die Schaltung zu vereinfachen, besteht darin, das letzte else if durch ein else zu ersetzen, da Sie immer den Ausgang Ihrer Funktion für jeden Eingang angeben sollten. Danach könnten Sie immer versuchen, die Logiktabelle von Hand zu erstellen und zu sehen, ob Sie ein Muster finden, aber meine persönliche Meinung ist, dass Sie dafür wahrscheinlich ein FPGA oder einen Mikrocontroller verwenden sollten.