uniform does not give required results

Discussion in 'VHDL' started by indu, Aug 25, 2008.

  1. indu

    indu Guest

    Hi All


    Im using ncvhdl version 6.11. For some reason, the uniform function
    suddenly does not work as required. The seed value does not change on
    different calls to the uniform function. I have debugged my program to
    find out the error but have not been successful. So, I have to write a
    random generator function (that need not be synthesized). Could
    somebody please tell me what algorithm to use for the same?


    Thanks,

    PS: This is not part of any homework/school work
    indu, Aug 25, 2008
    #1
    1. Advertising

  2. Mike Treseler, Aug 25, 2008
    #2
    1. Advertising

  3. indu

    indu Guest

    Thanks. I have initialised it but the seed does not seem to be
    changing.

    Im pasting a snippet of my code.

    procedure random_vector(
    variable seed1 :inout integer;
    variable seed2 :inout integer;
    variable vmax : in integer;
    variable result : out integer ) is

    variable x : real;
    begin
    UNIFORM(seed1,seed2,x);
    i := integer(x) mod vmax;
    result := i;
    end procedure random_vector;
    begin
    xx: process is
    ....
    ....
    variable seed1, seed2 : integer := 1;)
    random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

    ....
    end process

    When I run this behavorial code, I see that the value of seed does not
    change between calls. Am I doing something wrong here?

    Thanks,


    On Aug 25, 2:31 pm, Mike Treseler <> wrote:
    > indu wrote:
    > > Im using ncvhdl version 6.11. For some reason, the uniform function
    > > suddenly does not work as required. The seed value does not change on
    > > different calls to the uniform function.

    >
    > http://groups.google.com/groups/?q=vhdl uniform declare variable
    indu, Aug 25, 2008
    #3
  4. indu wrote:
    > Thanks. I have initialised it but the seed does not seem to be
    > changing.


    Your procedure is out of process scope.
    Maybe test it without a procedure first.

    -- Mike T

    xx: process is
    variable ...
    -- <----procedure declaration goes here
    -- other declarations
    begin
    -- ...
    Mike Treseler, Aug 25, 2008
    #4
  5. indu

    Tricky Guest

    On 25 Aug, 20:29, indu <> wrote:
    > Thanks. I have initialised it but the seed does not seem to be
    > changing.
    >
    > Im pasting a snippet of my code.
    >
    > procedure random_vector(
    >   variable seed1 :inout integer;
    >   variable seed2 :inout integer;
    >   variable vmax   : in integer;
    >   variable result : out integer ) is
    >
    >    variable x : real;
    >    begin
    >         UNIFORM(seed1,seed2,x);
    >         i := integer(x) mod vmax;
    >         result := i;
    >   end procedure random_vector;
    > begin
    > xx: process is
    > ...
    > ...
    > variable seed1, seed2  : integer := 1;)
    > random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);
    >
    > ...
    > end process
    >
    > When I run this behavorial code, I see that the value of seed does not
    > change between calls. Am I doing something wrong here?
    >
    > Thanks,
    >


    The seed values have to be possitive, but this should only throw an
    error rather than not work at all, but you have a problem with the x
    output from the UNIFORM function.

    > UNIFORM(seed1,seed2,x);
    > i := integer(x) mod vmax;
    > result := i;


    X is a real value that will be a value between 0 and 1. casting it to
    and integer will then just result in 0 or 1, and overall your "result"
    value will end up just being 0 or 1, regardless of VMAX. You need to
    take the returned x value and use that the scale the return value to
    something more meaningful. It is best to work with real types until
    the very end.

    In the words of blue peter: here's one I prepared earlier:

    procedure rand_int( variable seed1, seed2 : inout positive;
    min, max : in integer; --
    boundaries for the random result (inclusive)
    result : out integer) is
    variable rand : real;
    begin
    uniform(seed1, seed2, rand);
    result := integer(
    real(min) --set the base
    + (rand * (real(max)-real(min)) ) -- add in the random
    offset from the base, over a given range.
    );
    end procedure;
    Tricky, Aug 26, 2008
    #5
  6. indu

    indu Guest

    Thanks Tricky. You are right. I dint realise that at all.

    On Aug 26, 10:12 am, Tricky <> wrote:
    > On 25 Aug, 20:29, indu <> wrote:
    >
    >
    >
    > > Thanks. I have initialised it but the seed does not seem to be
    > > changing.

    >
    > > Im pasting a snippet of my code.

    >
    > > procedure random_vector(
    > > variableseed1 :inout integer;
    > > variableseed2 :inout integer;
    > > variablevmax : in integer;
    > > variableresult : out integer ) is

    >
    > > variablex : real;
    > > begin
    > > UNIFORM(seed1,seed2,x);
    > > i := integer(x) mod vmax;
    > > result := i;
    > > end procedure random_vector;
    > > begin
    > > xx: process is
    > > ...
    > > ...
    > >variableseed1, seed2 : integer := 1;)
    > > random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

    >
    > > ...
    > > end process

    >
    > > When I run this behavorial code, I see that the value of seed does not
    > > change between calls. Am I doing something wrong here?

    >
    > > Thanks,

    >
    > The seed values have to be possitive, but this should only throw an
    > error rather than not work at all, but you have a problem with the x
    > output from theUNIFORMfunction.
    >
    > > UNIFORM(seed1,seed2,x);
    > > i := integer(x) mod vmax;
    > > result := i;

    >
    > X is a real value that will be a value between 0 and 1. casting it to
    > and integer will then just result in 0 or 1, and overall your "result"
    > value will end up just being 0 or 1, regardless of VMAX. You need to
    > take the returned x value and use that the scale the return value to
    > something more meaningful. It is best to work with real types until
    > the very end.
    >
    > In the words of blue peter: here's one I prepared earlier:
    >
    > procedure rand_int(variableseed1, seed2 : inout positive;
    > min, max : in integer; --
    > boundaries for the random result (inclusive)
    > result : out integer) is
    > variablerand : real;
    > begin
    > uniform(seed1, seed2, rand);
    > result := integer(
    > real(min) --set the base
    > + (rand * (real(max)-real(min)) ) -- add in the random
    > offset from the base, over a given range.
    > );
    > end procedure;
    indu, Aug 26, 2008
    #6
  7. indu

    indu Guest

    Thanks Tricky. You are right. I dint realise that at all.

    On Aug 26, 10:12 am, Tricky <> wrote:
    > On 25 Aug, 20:29, indu <> wrote:
    >
    >
    >
    > > Thanks. I have initialised it but the seed does not seem to be
    > > changing.

    >
    > > Im pasting a snippet of my code.

    >
    > > procedure random_vector(
    > > variableseed1 :inout integer;
    > > variableseed2 :inout integer;
    > > variablevmax : in integer;
    > > variableresult : out integer ) is

    >
    > > variablex : real;
    > > begin
    > > UNIFORM(seed1,seed2,x);
    > > i := integer(x) mod vmax;
    > > result := i;
    > > end procedure random_vector;
    > > begin
    > > xx: process is
    > > ...
    > > ...
    > >variableseed1, seed2 : integer := 1;)
    > > random_vector(seed1 => seed1, seed2 => seed2, vmax, x=>x);

    >
    > > ...
    > > end process

    >
    > > When I run this behavorial code, I see that the value of seed does not
    > > change between calls. Am I doing something wrong here?

    >
    > > Thanks,

    >
    > The seed values have to be possitive, but this should only throw an
    > error rather than not work at all, but you have a problem with the x
    > output from theUNIFORMfunction.
    >
    > > UNIFORM(seed1,seed2,x);
    > > i := integer(x) mod vmax;
    > > result := i;

    >
    > X is a real value that will be a value between 0 and 1. casting it to
    > and integer will then just result in 0 or 1, and overall your "result"
    > value will end up just being 0 or 1, regardless of VMAX. You need to
    > take the returned x value and use that the scale the return value to
    > something more meaningful. It is best to work with real types until
    > the very end.
    >
    > In the words of blue peter: here's one I prepared earlier:
    >
    > procedure rand_int(variableseed1, seed2 : inout positive;
    > min, max : in integer; --
    > boundaries for the random result (inclusive)
    > result : out integer) is
    > variablerand : real;
    > begin
    > uniform(seed1, seed2, rand);
    > result := integer(
    > real(min) --set the base
    > + (rand * (real(max)-real(min)) ) -- add in the random
    > offset from the base, over a given range.
    > );
    > end procedure;
    indu, Aug 26, 2008
    #7
  8. indu

    Tricky Guest

    No Problem

    One thing I didnt realise till yesterday - MIN and MAX are inclusive
    boundaries, but do not have the same distribution as the other values.
    eg:

    MIN = 0, MAX = 5

    over 100 repetitions, mean distribution is:

    0 = 10
    1 = 20
    2 = 20
    3 = 20
    4 = 20
    5 = 10

    To make it evenly distributed, you'll need to + or - 0.5 from the end
    result before converting to an integer. This will make it exclusive of
    min (+0.5) or max (-0.5). For most useful purposes, it shouldnt really
    matter though.
    Tricky, Aug 27, 2008
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. grocery_stocker
    Replies:
    10
    Views:
    612
    Keith Thompson
    May 25, 2005
  2. JTL
    Replies:
    38
    Views:
    1,024
    kwikius
    Dec 7, 2006
  3. tooru honda

    Does shuffle() produce uniform result ?

    tooru honda, Aug 24, 2007, in forum: Python
    Replies:
    30
    Views:
    878
    Lawrence D'Oliveiro
    Sep 10, 2007
  4. Thomas
    Replies:
    7
    Views:
    299
    Mark Hubbart
    May 23, 2005
  5. FAQ server
    Replies:
    2
    Views:
    126
    John Hosking
    Aug 17, 2007
Loading...

Share This Page