Design a Black-Scholes call option price calculator using fixed-point approximations.

Module name: bs_call_price
Parameters:
  - WIDTH     = 32     // Total bit width
  - FRAC      = 16     // Fractional bits (Q16.16 fixed-point)
  - PRECISION = 4      // Number of Taylor terms for exp approximation

Ports:
  - input                        clk
  - input                        rst_n        // Active-low synchronous reset
  - input  signed [WIDTH-1:0]    spot_price   // S: spot price (Q16.16)
  - input  signed [WIDTH-1:0]    strike_price // K: strike price (Q16.16)
  - input  signed [WIDTH-1:0]    time_to_expiry // T: time to expiry in years (Q16.16)
  - input  signed [WIDTH-1:0]    volatility   // sigma: annualized volatility (Q16.16)
  - input  signed [WIDTH-1:0]    risk_free_rate // r: risk-free rate (Q16.16)
  - input                        valid_in     // Asserts for one cycle with new inputs
  - output signed [WIDTH-1:0]    call_price   // C: Black-Scholes call price (Q16.16)
  - output                       valid_out    // Asserts for one cycle when result is ready

Functional specification:
  - Computes the Black-Scholes call option price:
      C = S * N(d1) - K * exp(-r*T) * N(d2)
    where:
      d1 = (ln(S/K) + (r + sigma^2/2)*T) / (sigma * sqrt(T))
      d2 = d1 - sigma * sqrt(T)
  - N(x): Cumulative normal distribution (Abramowitz & Stegun polynomial approximation)
  - ln(x): Computed via 2*atanh((x-1)/(x+1)) with polynomial
  - sqrt(x): Newton-Raphson with 5 iterations
  - exp(-x): Taylor series with range reduction (repeated squaring)
  - This is an APPROXIMATION — results within 5% of analytical Black-Scholes
  - Sequential, multi-cycle computation
  - All arithmetic in signed Q16.16 fixed-point

Knobs:
  - WIDTH: [24, 32, 48] — precision vs area
  - PRECISION: [3, 4, 5] — Taylor series terms for exp (more terms = better accuracy, more multipliers)

Critical IO: valid_in -> valid_out (sequential, ~30-50 cycles)
