The Designer's Guide Community Forum
https://designers-guide.org/forum/YaBB.pl
Design Languages >> Verilog-AMS >> to solve differential equations in verilog-a?
https://designers-guide.org/forum/YaBB.pl?num=1217057135

Message started by msdryxon on Jul 26th, 2008, 12:25am

Title: to solve differential equations in verilog-a?
Post by msdryxon on Jul 26th, 2008, 12:25am

Hi,
  Now I'm using verilog-a to do some research on modeling kinematic structures. We all know that ddt or idt is accepted in verilog-a, such like the following sentences:
  Pos(v)<+ddt(x);

 But if Fdrv is from a source outside my module and i want to output the x in the following differential equation, how can i?

 a*x''+b*x'+cx=Fdrv

  i've written these codes,
  .......(includings)
  module test(Fdrv,x);
      inout Fdrv,x;
      kinematic Fdrv,x;
      kinematic v; //temp. var. to hold ddt(x)
      parameter real a=xxx, b=xxx, c=xxx; // assume a,b,c are properly defined      
              analog begin
                   Pos(v)<+ddt(x);
                   F(Fdrv)<+a*ddt(Pos(v))
                                 +b*Pos(v)
                                 +c*Pos(x);
               end
  endmodule

   if i input x to module test, i will get proper output of Fdrv, but if i want to input Fdrv and get the
proper value of x, which means i want to solve this differential equation, it never works.
   How can i solve this problem? thank you very very much....

Title: Re: to solve differential equations in verilog-a?
Post by Ken Kundert on Jul 26th, 2008, 10:10am

You can use indirect branch assignment. Looks something like this ...

kinematic drv, x;
kinematic_v v;
analog begin
   Vel(v) <+ ddt(Pos(x));
   Pos(x) : a*ddt(Vel(v) + b*Vel(v) + c*Pos(x) == F(drv);
end

The indirect branch assignment can be read: "Find Pos(x) such that ...".

Here I am assuming that I separate discipline dedicated to velocity. Otherwise the tolerances get out of whack.

-Ken

The Designer's Guide Community Forum » Powered by YaBB 2.2.2!
YaBB © 2000-2008. All Rights Reserved.