EmbDev.net

Forum: FPGA, VHDL & Verilog effitient code


von nick (Guest)


Rate this post
useful
not useful
hi evryone,

is there any best way to check if the difference between two integers is 
greater than a threshold


i find the code witten by me is quite big..need ur inputs thanks
1
if((unsigned(a)>unsigned(b))and((unsigned(a)-unsigned(b))>=500)) or ((unsigned(a)<unsigned(b)) and ((unsigned(b)-unsigned(a))>=500))then
2
---my code
3
end if;

von Boris O. (bohnsorg)


Rate this post
useful
not useful
Absolute value of difference of absolute integer values? Depending on 
your compiler it may recognize the pattern abs(abs(a)-abs(b)) and do 
some sign bit optimization. If you need to be certain of clock cycles: 
do it in assembler, otherwise trust the compiler.

von H-G S. (haenschen)


Rate this post
useful
not useful
It seems as if you could simply subtract b from a and then somehow 
ignore the possible negative sign if the first value was smaller than 
the second. Check only if the difference is bigger than 500.

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
nick wrote:
> i find the code witten by me is quite big..
What means "big" here?

> check if the difference between two integers
Are those two integers unsigned integers (aka naturals)?

nick wrote:
> if((unsigned(a)>unsigned(b))and((unsigned(a)-unsigned(b))>=500)) or
> ((unsigned(a)<unsigned(b)) and ((unsigned(b)-unsigned(a))>=500))then
> ---my code
> end if;
With integers simply this:
1
if abs(a-b)>=500 then
2
...
3
end if;

Boris O. wrote:
> If you need to be certain of clock cycles: do it in assembler
We are in real hardware here. It is done in one clock cycle... ;-)

H-G S. wrote:
> and then somehow ignore the possible negative sign
Have a closer look at the chapter "twos complement and integers". There 
is no such thing like a "negative sign" on a integer. All of the bits 
are "signs". So you cannot "cut away" or "simply ignore" the sign. Look 
at this "8-bit-integer":
 2 = 00000010
 1 = 00000001
 0 = 00000000
-1 = 11111111
-2 = 11111110
See it: you don't see a "negative sign"

: Edited by Moderator
von H-G S. (haenschen)


Rate this post
useful
not useful
As i read your code again now it seems it lacks something. Does it work 
the way it is now ?

To me it seems you have to implement more code for this task, especially 
for the case that the subtraction causes a rollover. Simple asking if 
the first value is bigger than the subtracted one does not always mean 
that the subtraction of 500 does not cause a rollover.

But it may be that the higher language compiler has a solution for this 
problem and counts that all in (the "bigger than"-routine for example 
could automaticalle handle rollovers).

: Edited by User
von nick (Guest)


Rate this post
useful
not useful
Lothar M. wrote:
> Are those two integers unsigned integers (aka naturals)?

they are declared as standard logic vectors.

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
nick wrote:
> they are declared as standard logic vectors.
Then why do you write somewhat about "integers"? An integer is a 
predefined data type in VHDL. Never ever call a std_logic_vector an 
integer!

Ok so you must use the numeric_std.all and write it that way:
1
if abs(unsigned(a)-unsigned(b))>=500 then
2
...
3
end if;

: Edited by Moderator
von nick (Guest)


Rate this post
useful
not useful
Lothar M. wrote:
> if abs(unsigned(a)-unsigned(b))>=500 then
> ...
> end if;

but abs works only with signed operand

so..

if abs(signed(a)-signed(b))>=500 then
...
end if;

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.