Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Ray Andraka <ray@xxxxxxxxxxx>
- Date: Thu, 11 May 2006 13:27:22 -0400
Marko S wrote:
Thank you all. I will have a look at "Dijkstra's square root". I have 2000 clock cycles at 40 Mhz to complete the calculation (It should be enough). It is used for calculating the AM envelop after demodulating the signal with a coherent detector
You can se the principle of the detector at http://www.cycom.co.uk/art1.html.
"Symon" <symon_brewer@xxxxxxxxxxx> wrote in message news:4462fbb4$0$15793$14726298@xxxxxxxxxxxxxxxxxx
"Michael Schöberl" <MSchoeberl@xxxxxxxxxxxx> wrote in message news:4462f354$1@xxxxxxxxxxxxxx
Marko S schrieb:
How do i calculate sqrt(a^2 + b^2) in synthesizable VHDL?
The signals a and b are 32 bit signed fix point numbers (std_logic_vector (31 downto 0)).
how accurate? how fast? latency?
just for the sqrt(x) I once worked an idea to take len=ceil(log_2(x)) by counting the length of x (leading 0s) ...
then you shift x>>(len/2) or something (+1?) ... this worked as a good approximation and I added only one or two stages of a newton-raphson
Hi Marko,
For square root, you could use modified Dijkstra's square root.
http://lib.tkk.fi/Diss/2005/isbn9512275279/article3.pdf
One clock per output bit. No multipliers.
HTH, Syms.
You aren't really looking for square root, you are looking for vector magnitude. Vector magnitude can be computed without computing the square root. For arbitrary precision, you can use the cordic algorithm in vectoring mode. It basically rotates the vector to the I axis using a series of progressively smaller fixed angle rotations selected so that each elemental rotation is done with a shift and add operation. After rotating the vector the I axis, the magnitude is read directly from the non-zero (I component) of the rotated vector. If you don't need a lot of precision, there are table methods and linear approximations (the most famous is "larger plus half smaller" that will often get you a good enough answer with less computation. Either way, computing magnitude using a square root is going about it the hard way (hardware-wise anyway). For 32 bit arguments, CORDIC is going to be your best bet.
.
- Follow-Ups:
- Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Trainee
- Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- References:
- sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Marko S
- Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Michael Schöberl
- Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Symon
- Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- From: Marko S
- sqrt(a^2 + b^2) in synthesizable VHDL?
- Prev by Date: Re: CoolRunner XPLA3 getting axed?
- Next by Date: Re: [Newbie] 64-point complex FFT with 32 bit floating-point representation
- Previous by thread: Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- Next by thread: Re: sqrt(a^2 + b^2) in synthesizable VHDL?
- Index(es):
Relevant Pages
|