Visjnoe
|
Hi,
I'm a bit stuck on generating a realistic OTA model, especially with regard to slewrate.
My main idea was to implement a simple small-signal model for the OTA, something like this:
I(out) <+ gm*V(inp,inn); I(out) <+ V(out)/rout;
This approximation is valid in the region abs(V(inp,inn)) < SQRT(2)*(Vgs-Vt) with Vgs-Vt the (equilibrium) overdrive voltage of the differential input pair. This is in fact the classic 'gm*Rout' model of a simple OTA.
Now, I could include slewrate limiting by using the slew() function on the OTA output.
However, I would like to be able to use the OTA in different surroundings, meaning that I would like to provide some sort of maximum current for the OTA and then let the slewrate arise from the capacitive load the OTA sees at its output.
In contrast, the slew() function imposes a minimum/maximum slewrate, independent of the capacitive load/OTA surroundings. I find this to be a disadvantage for system-level design.
Now, my problem is to unify the small-signal (gm*Rout) model and the slew-rate behavior of the OTA, which is clearly large signal.
At the moment, I only see 1 solution: if the input voltage is smaller than SQRT(2)*(Vgs-Vt) I implement the behavior is shown in the code above and otherwise I would implement it as follows:
I(out) <+ Imax*dir; (dir being -1 or 1)
So, using different branch contributions for small-signal and for large-signal behavior.
Does anyone have some experience with this? All comments are welcome.
Although being regarded as a basic building block, how come I find a OTA harder to model than most other blocks?:)
Kind Regards
Peter
|