Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog Math Functions meistern für effizientes Hardware-Design

Verilog-Mathematik-Funktionen können anstelle von konstanten Ausdrücken verwendet werden und unterstützen sowohl Integer- als auch Real-Mathematik.

Integer-Mathematik-Funktionen

Die Funktion $clog2 gibt das Ceiling von log2 des gegebenen Arguments zurück. Dies wird typischerweise verwendet, um die minimale Breite zu berechnen, die erforderlich ist, um einen Speicher gegebener Größe zu adressieren.

Zum Beispiel, wenn das Design 7 parallele Addierer hat, dann ist die minimale Anzahl der Bits, die erforderlich sind, um alle 7 Addierer darzustellen, $clog2 von 7, was 3 ergibt.

module des #(parameter NUM_UNITS = 7)
  // Verwendung dieser Systemfunktion hilft, die
  // Anzahl der Eingangsdrähte zu diesem Modul zu reduzieren
  (input [$clog2(NUM_UNITS)-1:0] active_unit);
  initial $monitor("active_unit = %d", active_unit);
endmodule

`define NUM_UNITS 5
module tb;
  integer i;
  reg [`NUM_UNITS-1:0] active_unit;
  des #(.NUM_UNITS(`NUM_UNITS)) u0(active_unit);
  initial begin
    active_unit = 1;
    #10 active_unit = 7;
    #10 active_unit = 8;
  end
endmodule

Beachten Sie, dass das Signal active_unit 3 Bits hat, um insgesamt 5 Einheiten zu speichern.

Simulationslog:

xcelium> run
active_unit = 001
active_unit = 111
active_unit = 000
xmsim: *W,RNQUIE: Simulation is complete.

Real-Mathematik-Funktionen

Diese Systemfunktionen akzeptieren reelle Argumente und geben eine reelle Zahl zurück.

Funktion Beschreibung
$ln(x) Natürlicher Logarithmus log(x)
$log10(x) Dekadischer Logarithmus log10(x)
$exp(x) Exponentialfunktion von x (ex) wobei e=2.718281828...
$sqrt(x) Quadratwurzel von x
$pow(x, y) xy
$floor(x) Floor von x
$ceil(x) Ceiling von x
$sin(x) Sinus von x, wobei x in Radiant ist
$cos(x) Kosinus von x, wobei x in Radiant ist
$tan(x) Tangens von x, wobei x in Radiant ist
$asin(x) Arkussinus von x
$acos(x) Arkuskosinus von x
$atan(x) Arkustangens von x
$atan2(x, y) Arkustangens von x/y
$hypot(x, y) Hypotenuse von x und y: sqrt(x2 + y2)
$sinh(x) Hyperbolischer Sinus von x
$cosh(x) Hyperbolischer Kosinus von x
$tanh(x) Hyperbolischer Tangens von x
$asinh(x) Flächeninhalt des hyperbolischen Sinus von x
$acosh(x) Flächeninhalt des hyperbolischen Kosinus von x
$atanh(x) Flächeninhalt des hyperbolischen Tangens von x
module tb;
  real x, y;
  initial begin
    x = 10000;
    $display("$log10(%0.3f) = %0.3f", x, $log10(x));
    x = 1;
    $display("$ln(%0.3f) = %0.3f", x, $ln(x));
    x = 2;
    $display("$exp(%0.3f) = %0.3f", x, $exp(x));
    x = 25;
    $display("$sqrt(%0.3f) = %0.3f", x, $sqrt(x));
    x = 5; y = 3;
    $display("$pow(%0.3f, %0.3f) = %0.3f", x, y, $pow(x, y));
    x = 2.7813;
    $display("$floor(%0.3f) = %0.3f", x, $floor(x));
    x = 7.1111;
    $display("$ceil(%0.3f) = %0.3f", x, $ceil(x));
    x = 30 * (22.0/7.0) / 180; // 30 Grad in Radiant umrechnen
    $display("$sin(%0.3f) = %0.3f", x, $sin(x));
    x = 90 * (22.0/7.0) / 180;
    $display("$cos(%0.3f) = %0.3f", x, $cos(x));
    x = 45 * (22.0/7.0) / 180;
    $display("$tan(%0.3f) = %0.3f", x, $tan(x));
    x = 0.5;
    $display("$asin(%0.3f) = %0.3f rad, %0.3f deg", x, $asin(x), $asin(x) * 7.0/22.0 * 180);
    x = 0;
    $display("$acos(%0.3f) = %0.3f rad, %0.3f deg", x, $acos(x), $acos(x) * 7.0/22.0 * 180);
    x = 1;
    $display("$atan(%0.3f) = %0.3f rad, %f deg", x, $atan(x), $atan(x) * 7.0/22.0 * 180);
  end
endmodule

Simulationslog:

xcelium> run
$log10(10000.000) = 4.000
$ln(1.000) = 0.000
$exp(2.000) = 7.389
$sqrt(25.000) = 5.000
$pow(5.000, 3.000) = 125.000
$floor(2.781) = 2.000
$ceil(7.111) = 8.000
$sin(0.524) = 0.500
$cos(1.571) = -0.001
$tan(0.786) = 1.001
$asin(0.500) = 0.524 rad, 29.988 deg
$acos(0.000) = 1.571 rad, 89.964 deg
$atan(1.000) = 0.785 rad, 44.981895 deg
xmsim: *W,RNQUIE: Simulation is complete.

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Verilog Clock Generator: Design & Implementierungsleitfaden
  8. Verilog $timeformat meistern: Präzision und Anzeigesteuerung
  9. Verilog Timescales an jedem Scope verstehen und ausgeben
  10. Datei-E/A in Verilog meistern: Öffnen, Lesen, Schreiben und Schließen