AHDL - nadmiar

Mar 03, 2005 3 Replies

Wybaczcie mi pytanie jeśli jest banalne, ale trochę się z tym głowię. Mam w AHDL dane wejściowe w postaci:



WE[15..0] : OUTPUT;



dane te ulegają pewnej operacji (np *8).



Oraz dane wyjściowe WY[15..0] : OUTPUT; oraz przekroeczenie zakresu P: OUTPUT;



Jak mogę w czasie wykonywania operacji sprawdzić czy zakres WY został przekroczony i ustawić wtedy P na 1?


INPUT ?

Formalnie to chyba powinienes zrobic operacje na odpowiedniej ilosci bitow, 16 mlodszych wyprowadzic dalej, a starsze sprawdzic czy sa zerowe [albo 111... o ile wynik jest ujemny], a jak nie - ustawiamy P.

Ale .. jesli to naprawde jest *8 - to wystarczy sprawdzic czy 3 najstarsze bity WE sa zerowe przed mnozeniem.

J.

"s.slawek':

moze tak:

******************************* include "lpm_mult";

subdesign mply ( clk :input; in_A[15..0], in_B[15..0] :input; out_dat[15..0] :output; p :output; )

variable

mpy_result[31..0] :lcell;

-- mnozenie liczb 16 bitowych daje wynik 32 bity p_tmp :lcell;

-- powinno byc 'node', jest lcell zeby kompilator

-- zachowal nazwe

begin

mpy_result[] = lpm_mult(in_A[], in_b[],,,,) with (lpm_widtha = 16, lpm_widthb = 16, lpm_widthp = 32, lpm_widths = 1 ) returns (.result[]) ; -- lpm_mult to macro Altery mnozace -- zobacz Help -> Megafunctions/LPM -> lpm_mult

for i in 15 to 0 generate out_dat[i] = dff(mpy_result[i],clk,,); end generate; -- zapisanie mlodszych bitow wyniku mnozenia w rejestrach WY

p_tmp = (mpy_result[31..16]) == 0; -- sprawdzenie, czy starsze bity mnozenia sa = 0

p = dff(!p_tmp,clk,,);

end;

****************************

to jest wariant ogolny, obie liczby wejsciowe moga przybierac dowolna, 16 bitowa wartosc, jesli w Twoim przypadku mnozenie jest przez stala, to JF podpowiedzial, jak to zrobic naprawde prosto :)

JA

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required