time quantity in vhdl

N

Nav

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
 
D

David Jones

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

If r_n were declared as:

constant r_n:real := 2000.0

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

Niv

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.
 
N

Nav

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top