effitient code

Guest #4970610
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;
Moderator (Company: Titel) #4970698
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"
#4971103
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).
Moderator (Company: Titel) #4971639
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;

Reply

Please log in before posting.

or

Log in with Google account

Registration is free and takes only a minute.

Register now