time quantity in vhdl

N

Nav

Guest
Hi,

could anyone help me out with this ? look at the following comments
inside the code.


constant cin:time := 20.0 fs;
constant r_p:time := 2000.0;
constant r_n:time := 2000.0;
begin
p1: process(x)
variable t:time;
begin
if(x'EVENT and x='1') then
--
--Can I assign a real value multiplication to a time quanity.

t := time(cin*r_n);
y <= (not x) after t ps;
else
-- This is working fine but the above t equation is not working.
t := 20.0*2.0 ps;
y <= (not x) after t;
end if;
end process p1;

thanks a lot.
naveen
 
In article <9d0686de.0310011045.5cdd9555@posting.google.com>,
Nav <lnkm@rediffmail.com> wrote:
Hi,

could anyone help me out with this ? look at the following comments
inside the code.


constant cin:time := 20.0 fs;
constant r_p:time := 2000.0;
constant r_n:time := 2000.0;
The last two declarations should be illegal, as they do not give a unit.

A physical type such as time is represented internally as an integer,
expressing a multiple of the base physical unit. So, if your simulation
time type starts off as fs, then 1 ns is represented as 1,000,000.

You are permitted to multiply and divide by scalars. The result is still
an integer, in the base unit. So, 1.5 * 3 fs is 4 fs or 5 fs, due to rounding
(the exact outcome is simulator-dependent.)

The other problem spot is that time quantities are often quantized to the
simulator time resolution. For example, if your simulation timestep is 1 ns,
then all time literals will be a multiple of 1,000,000 fs. At this point,
you get wierdness such as:

constant t1:time := 1 ps;
constant t2:time := 2 ps;

variable ratio: integer;

if (t1 = t2) then
-- Surprise! This branch executes if resolution is ns.
ratio := t2 / t1; -- And this halts due to divide by zero.
else
-- And this branch executes if resolution is ps.
ratio := t2 / t1; -- And this works fine, producing 2.
end if;

This is done to increase the dynamic range of time. The VHDL standard requires
that 1 fs be accepted as a time unit, but this allows simulation for only
18,445 seconds if time is to be tracked as a 64-bit integer. By quantizing
time to 64 bits, simulators permit much longer simulation runs while
sacrificing sub-ns precision which many users don't care about.

begin
p1: process(x)
variable t:time;
begin
if(x'EVENT and x='1') then
--
--Can I assign a real value multiplication to a time quanity.
t := time(cin*r_n);
If r_n were declared as:

constant r_n:real := 2000.0

then this is legal, and will result in 40,000 fs.

y <= (not x) after t ps;
else
-- This is working fine but the above t equation is not working.
t := 20.0*2.0 ps;
y <= (not x) after t;
end if;
end process p1;

thanks a lot.
naveen
 
It looks as if you've declared r_p & r_n as "time", so you're trying to
create "time_squared"
Make r_p & r_n of type INTEGER or NATURAL, then the multiply should work.

Niv.

"Nav" <lnkm@rediffmail.com> wrote in message
news:9d0686de.0310011045.5cdd9555@posting.google.com...
Hi,

could anyone help me out with this ? look at the following comments
inside the code.


constant cin:time := 20.0 fs;
constant r_p:time := 2000.0;
constant r_n:time := 2000.0;
begin
p1: process(x)
variable t:time;
begin
if(x'EVENT and x='1') then
--
--Can I assign a real value multiplication to a time quanity.

t := time(cin*r_n);
y <= (not x) after t ps;
else
-- This is working fine but the above t equation is not working.
t := 20.0*2.0 ps;
y <= (not x) after t;
end if;
end process p1;

thanks a lot.
naveen
 
Hi Niv and dave,

Thanks for ur brief explanation into time....

I made one modification instead of defining r_p and r_n and c as time
I defined them as real. It makes sense since, if I define them all as
time then the varibale to which I assign this value will become time
squared which will make the physical quantity definition of t error.
I got it going... thanks to ur help....

keep it going folks,
Nav

"Niv" <niv**mines_a_pint_you_spamheads**@ntlworld.com> wrote in message news:<7bGeb.1615$y67.1215@newsfep1-gui.server.ntli.net>...
It looks as if you've declared r_p & r_n as "time", so you're trying to
create "time_squared"
Make r_p & r_n of type INTEGER or NATURAL, then the multiply should work.

Niv.

"Nav" <lnkm@rediffmail.com> wrote in message
news:9d0686de.0310011045.5cdd9555@posting.google.com...
Hi,

could anyone help me out with this ? look at the following comments
inside the code.


constant cin:time := 20.0 fs;
constant r_p:time := 2000.0;
constant r_n:time := 2000.0;
begin
p1: process(x)
variable t:time;
begin
if(x'EVENT and x='1') then
--
--Can I assign a real value multiplication to a time quanity.

t := time(cin*r_n);
y <= (not x) after t ps;
else
-- This is working fine but the above t equation is not working.
t := 20.0*2.0 ps;
y <= (not x) after t;
end if;
end process p1;

thanks a lot.
naveen
 

Welcome to EDABoard.com

Sponsor

Back
Top