Diodengleichung

1. Graphische Lösung mit Octave:

octave:1> x=0:10:800
octave:2> y1=(5000-x)/1000
octave:3> y2=1e-12*(exp(x/26)-1)
octave:4> plot(x,y1)
octave:5> hold on
octave:6> plot(x,y2)
octave:7> hold off
octave:8> x=650:1:770
octave:9> y1=(5000-x)/1000
octave:10> y2=1e-12*(exp(x/26)-1)
octave:11> plot(x,y1)
octave:12> hold on
octave:13> plot(x,y2)

2. Numerische Lösung in Tabellenkalkulation:

Diodengleichung_Numerisch.odf

3. Fazit

Wir operieren hier in einem exorbitant grossen Zahlenbereich, der jede 32-Bit-CPU überlaufen lässt. Ausser, wir arbeiten mit Fliesskomma-Zahlen. Diese ermöglichen, kleine Zahlen mit kleinen Zahlen und grosse Zahlen mit grossen Zahlen zu verrechnen. Dadurch wird der Fehler auch kleiner.

4. Test

Hier ein erster, noch unvollendeter Versuch, sowas in Verilog zu implementieren:

module diodengl (
clk,    // clock
ufd        // Dioden-Spannung (gesucht)
);

input                clk;
output     [31:0]    ufd;

reg        [31:0]    u1;        // Spannungsquelle      mV
reg        [31:0]    r1;        // Innenwiderstand      Ohm
reg        [31:0]    is;        // Dioden-Sperrstrom    pA
reg        [31:0]    ut;        // Temperaturspannung   mV
reg        [31:0]    smin;      // Abbruchbedingung     mV

reg        [31:0]    s;         // "Schrittweite"
reg        [31:0]    sa;        // "Schrittweite", absolutwert
reg        [31:0]    y1;        // Zwischenresultat 1
reg        [31:0]    y2;        // Zwischenresultat 2
reg        [31:0]    y2a;       // Zwischenresultat 2a (Ufd/Ut)
reg        [31:0]    y2b;       // Zwischenresultat 2b (e^y1)
reg     [31:0]    ufd;          // Resultat
reg     [31:0]    i;            // Zähler

initial begin
    u1=5000;
    r1=1000;
    is=1;
    ut=26;
    smin=1;

    s=1;
    sa=1;
    ufd=1;
end

always @ (posedge clk)
begin
        // Error (10119): Verilog HDL Loop Statement error at
        // diodengl.v(35): loop with non-constant loop condition must
        // terminate within 250 iterations    

        //    while(sa>tol) begin    

        ufd = ufd + s;

        y1=u1-ufd/r1;

        y2a=ufd/ut;
        // Error (10256): Verilog HDL error at diodengl.v(42):
        // exponentiation is not supported for specified operands,
        // exponent base must be a positive power of 2 with
        // non-constant exponent.

        //   y2b=2718**y2a;

        y2b=2048**y2a;
        y2=is*(y2b-1000);

        s=(y1-y2)/100;

        // Absolutwert von Schrittweite berechnen für
        // Abbruchbedingung
        // if (s[31]==1'b1) sa[31:0]={1'b1,s[30:0]};
        // else sa [31:0]=s [31:0];
        // end
end
endmodule