# ceil and floor

Discussion in 'VHDL' started by zlotawy, Sep 15, 2007.

1. ### zlotawyGuest

Hello,

there are three constants:

constant one : Natural := 36;
constant two : Natural := 14;
constant three: Natural := one/two;

After synthesise three equels 2.

BEcause 36/14 is more than 2 I have question, how to get this value?

Thanks
zlotawy

zlotawy, Sep 15, 2007

2. ### zlotawyGuest

U¿ytkownik "zlotawy" <_SPAM.pl> napisa³ w wiadomo¶ci

For me

36/14 = 3 36/12 = 3
36/18 = 2
36/35 = 2

zlotawy

zlotawy, Sep 15, 2007

3. ### David BishopGuest

It just takes the integer value. In the "math_real" package you will
find "ceil" and "floor" functions with take in REAL numbers and return
real numbers (which are the integer values).

If you are trying to synthesize a number that is less than 1, I would
recommend that you try a fixed point number.

David Bishop, Sep 15, 2007
4. ### zlotawyGuest

Uzytkownik "David Bishop" <> napisal w wiadomosci

hmm.. thanks but i can not use it.. library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.MATH_REAL.ALL;
package PKG is
constant one: Integer := ceil(7/ 2);
end PKG_SRAM;

And i receive error: "ceil can not have such operands in this context.". Can
I not generateconstatnt by ceil function?

Thanks,
zlotawy

zlotawy, Sep 15, 2007
5. ### KJGuest

Yes, you can. The errors you're getting are because the data types that you
are using do not have a 'ceil' function defined for it. The function
declaration for 'ceil' in the ieee.math_real package.

function CEIL (X : real ) return real;

In ieee.math_real ceil takes a 'real' as the input parameter and returns a
real type. Since you'd like to use integers you simply need to cast them
appropriately.

The correct way for your example would be
constant one: Integer := natural(ceil(real(7)/real(2)));
or equivalently...
constant one: Integer := natural(ceil(7.0/2.0));

KJ

KJ, Sep 15, 2007