Velocity Reviews > VHDL > Fix point square root

# Fix point square root

Christian
Guest
Posts: n/a

 04-25-2005
Hi,
i am trying to implement a fixpoint square root in vhdl.
The radicant consists of integer as well as fractional bits like 4.23 - dec.
Does anyone know a synthesiable algorithm ?
Thanks in advance
Christian

mk
Guest
Posts: n/a

 04-25-2005
On 25 Apr 2005 12:17:27 -0700, http://www.velocityreviews.com/forums/(E-Mail Removed) (Christian) wrote:

>Hi,
>i am trying to implement a fixpoint square root in vhdl.
>The radicant consists of integer as well as fractional bits like 4.23 - dec.
>Does anyone know a synthesiable algorithm ?
>Thanks in advance
>Christian

The first link here seems nice:
http://www.google.com/search?hl=en&q...nt+square+root

Christian
Guest
Posts: n/a

 04-26-2005
mk<kal*@dspia.*comdelete> wrote in message news:<(E-Mail Removed)>. ..
> On 25 Apr 2005 12:17:27 -0700, (E-Mail Removed) (Christian) wrote:
>
> >Hi,
> >i am trying to implement a fixpoint square root in vhdl.
> >The radicant consists of integer as well as fractional bits like 4.23 - dec.
> >Does anyone know a synthesiable algorithm ?
> >Thanks in advance
> >Christian

>
> The first link here seems nice:
> http://www.google.com/search?hl=en&q...nt+square+root

Thanks for your reply ! I tried to translate the c source code into
vhdl code but i don't get the right results.
If anyone has an idea what i did wrong, this would be very nice

Christian

typedef long TFract; /* 2 integer bits, 30 fractional bits */
TFract
FFracSqrt(TFract x)
{
register unsigned long root, remHi, remLo, testDiv, count;
root = 0; /* Clear root */
remHi = 0; /* Clear high part of partial remainder */
remLo = x; /* Get argument into low part of partial remainder */
count = 30; /* Load loop counter */
Apple Computer, Inc. Media Technologies: Computer Graphics Page 1
Turkowski Fixed Point Square Root 3 October 1994
do {
remHi = (remHi<<2) | (remLo>>30); remLo <<= 2; /* get 2 bits of arg */
root <<= 1; /* Get ready for the next bit in the root */
testDiv = (root << 1) + 1; /* Test radical */
if (remHi >= testDiv) {
remHi -= testDiv;
root++;
}
} while (count-- != 0);
return(root);
}

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity SQUARE_ROOT is

port ( arg : in std_logic_vector(31 downto 0);

output : out std_logic_vector(31 downto 0)

);

end SQUARE_ROOT;

architecture BEHAVIOR of SQUARE_ROOT is

begin

process(arg)

variable root : std_logic_vector(31 downto 0):=
"00000000000000000000000000000000";
variable remHi : std_logic_vector(31 downto 0):=
"00000000000000000000000000000000";
variable remLo : std_logic_vector(31 downto 0);
variable testDiv : std_logic_vector(31 downto 0);

variable remHi_temp : std_logic_vector(31 downto 0);
variable remLo_temp : std_logic_vector(31 downto 0);
variable root_temp : std_logic_vector(31 downto 0);

begin

remLo:= arg;

LOOP1: for I in 1 to 30 loop

remHi_temp:= remHi(remHi'high-2 downto 0) & "00";

remLo_temp:= "000000000000000000000000000000" &
remLo(remLo'high downto remLo'high-1);

remHi:= remHi_temp or remLo_temp;

remLo:= remLo(remLo'high-2 downto 0) & "00";

root:= root(root'high downto 1) & '0';

root_temp:= root;

testDiv:= root_temp(root_temp'high downto 1) & '1';

if ( remHi >= testDiv) then

remHi:= remHi - testDiv;

root:= root + 1;

end if;

end loop LOOP1;

output <= root;

end process;

end BEHAVIOR;

Pontus Stenstrom
Guest
Posts: n/a

 04-27-2005
(E-Mail Removed) (Christian) wrote in message news:<(E-Mail Removed). com>...
> Hi,
> i am trying to implement a fixpoint square root in vhdl.
> The radicant consists of integer as well as fractional bits like 4.23 - dec.
> Does anyone know a synthesiable algorithm ?
> Thanks in advance
> Christian

There is a couple of pages about this in the march 2005 issue of ieee signal
processing magazine (dsp tips and tricks).
In short it's about "quick and dirty" sqrts (sacrifice accuracy for speed),
where you calculate (iterate) 1/sqrt(x) and finnish off with a multiplication
with x. One iterative scheme is p(n+1)=0.5*p(n)*(3-x*p(n)*p(n)).
Hope this helps /Pontus

vipinlal
Member
Join Date: Feb 2010
Posts: 39

 03-18-2010
get a function from here..
vhdlguru.blogspot.com/2010/03/vhdl-function-for-finding-square-root.html

jeppe
Senior Member
Join Date: Mar 2008
Location: Denmark
Posts: 348

 03-18-2010
You must surely visit this page - the answer to your needs.

users-tima.imag.fr/cis/guyot/Cours/Oparithm/english/Extrac.htm

your welcome
Jeppe

 Thread Tools

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post Saraswati lakki ASP .Net 0 01-06-2012 06:39 AM Xah Lee Python 23 03-21-2006 07:02 AM Xah Lee Java 22 03-21-2006 07:02 AM alghazo@siu.edu VHDL 0 05-27-2004 06:23 AM Luca VHDL 1 04-29-2004 02:51 PM

Advertisments