|
--*********************************************************************
--*** TOP_LEVEL_ROOTB ***
--*** ***
--*** Parameterized Square Root Function ***
--*** ***
--*** Usage: ***
--*** ***
--*** WIDTH : Input Word Precision - any value > 6 ***
--*** PREC : Output Word Precision - any value > (WIDTH/2) ***
--*** ***
--*** (WIDTH/2) most significant bits of output contain the root, ***
--*** following bits are the fractional portion of the root ***
--*** ***
--*** Compile with Carry Chains ***
--*** ***
--*** ***
--*** ***
--*********************************************************************FUNCTION rootb (rad[WIDTH..1])
RETURNS (root[PREC..1]);PARAMETERS
(
WIDTH = 12,
PREC = 8
);subdesign top_level_rootb
(
rad[WIDTH..1] : INPUT;
root[PREC..1] : OUTPUT;
)BEGIN
root[] = rootb (rad[]) WITH (WIDTH=WIDTH,PREC=PREC);
END;
FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub, clock, aclr)
RETURNS (result[LPM_WIDTH-1..0], cout, overflow);PARAMETERS
(
WIDTH = 16,
PREC = 16
);constant pw = 2*PREC;
constant odd = ((floor(WIDTH DIV 2)) == (ceil(WIDTH DIV 2))) ? 0:1;
constant inwidth = width+odd; -- if odd, internal width is 1 greatersubdesign rootb
(
rad[WIDTH..1] : INPUT;
root[PREC..1] : OUTPUT;
)VARIABLE
inrad[inwidth..1] : node;
stone[2..1] : node;
top[PREC..2][pw..1] : node;
bot[PREC..2][pw..1] : node;
st[PREC..2][pw..1] : node;dummy[(pw-4)..1], dumst[pw..1] : node;
preroot[PREC..1] : node;
BEGIN
ASSERT (WIDTH>5)
REPORT "Parameter WIDTH must be at least 6"
SEVERITY ERROR;
ASSERT (PREC >= (ceil(WIDTH DIV 2)))
REPORT "Parameter PREC must be at least (WIDTH/2)"
SEVERITY ERROR;IF (odd == 1) GENERATE
inrad[] = (GND,rad[]);
ELSE GENERATE
inrad[] = rad[];
END GENERATE;dummy[] = 0;
(stone[],,) = lpm_add_sub (VCC, inrad[inwidth..(inwidth-1)], (GND,VCC),,,)
WITH (LPM_WIDTH = 2, LPM_DIRECTION = "SUB");preroot[PREC] = inrad[inwidth] # inrad[inwidth-1];
top[2][pw..(pw-3)] = ( (stone[] & preroot[PREC]), inrad[(inwidth-2)..(inwidth-3)]);
bot[2][pw..(pw-3)] = ( 0, preroot[PREC], 0, 1);(st[2][pw..(pw-3)],,) = lpm_add_sub (VCC, top[2][pw..(pw-3)], bot[2][pw..(pw-3)],,,)
WITH (LPM_WIDTH = 4, LPM_DIRECTION = "SUB");top[2][(pw-4)..1] = top[2][(pw-4)..1] # dummy[(pw-4)..1];
bot[2][(pw-4)..1] = bot[2][(pw-4)..1] # dummy[(pw-4)..1];
st[2][(pw-4)..1] = st[2][(pw-4)..1] # dummy[(pw-4)..1];preroot[PREC-1] = !st[2][pw];
FOR k IN 3 TO PREC GENERATE
top[k][pw..(pw+3-(k*2))] = (st[k-1][pw..(pw+3-(k*2))] & preroot[PREC+2-k]) #
(top[k-1][pw..(pw+3-(k*2))] & !preroot[PREC+2-k]);IF (k<=(inwidth DIV 2)) GENERATE
top[k][(pw+2-(k*2))..(pw+1-(k*2))] = inrad[(inwidth+2-(k*2))..(inwidth+1-(k*2))];
ELSE GENERATE
top[k][(pw+2-(k*2))..(pw+1-(k*2))] = (GND,GND);
END GENERATE;FOR j IN 1 TO (k-1) GENERATE
bot[k][pw+1-j] = GND;
END GENERATE;FOR j IN 1 TO (k-1) GENERATE
bot[k][pw+2-k-j] = preroot[PREC+1-j];
END GENERATE;bot[k][(pw+2-(k*2))..(pw+1-(k*2))] = (GND,VCC);
(st[k][pw..(pw+1-(k*2))],,) = lpm_add_sub (VCC, top[k][pw..(pw+1-(k*2))],
bot[k][pw..(pw+1-(k*2))],,,)
WITH (LPM_WIDTH = (k*2), LPM_DIRECTION = "SUB");
preroot[PREC+1-k] = lcell(!st[k][pw]); -- make sure that MP2 doesnt build huge carry chainIF (k
top[k][(pw-(k*2))..1] = top[k][(pw-(k*2))..1] # dummy[(pw-(k*2))..1];
bot[k][(pw-(k*2))..1] = bot[k][(pw-(k*2))..1] # dummy[(pw-(k*2))..1];
st[k][(pw-(k*2))..1] = st[k][(pw-(k*2))..1] # dummy[(pw-(k*2))..1];
END GENERATE;END GENERATE;
dumst[] = st[PREC][pw..1] # dumst[];
root[] = preroot[];
END;
E-mail: info@telesys.ru