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; |
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.
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.
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
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
Lothar M. wrote: > Are those two integers unsigned integers (aka naturals)? they are declared as standard logic vectors.
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
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;