ну или вот оно (на ahdl)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Romario 09 сентября 2004 г. 13:37
В ответ на: еще в соседней конфе пролетало HammerCores by Altera "square root function" ищите по нику IgorK отправлено Romario 09 сентября 2004 г. 13:34


--*********************************************************************
--*** 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 greater

subdesign 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 chain

IF (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