Konstantendivision

#2712201
Lesenswert?

Hallo,
Ich möchte in meinem VHDL Code beim Synthetisieren ein paar Konstanten 
aus anderen Konstanten berechnen lassen. Vorgestellt habe ich mir das in 
etwa so:
1
LIBRARY IEEE;
2
USE IEEE.Std_Logic_1164.ALL;
3
USE ieee.numeric_std.all;
4
USE ieee.math_real.ceil;
5

6
ENTITY deglitch IS    
7
GENERIC
8
  ( t_clk : natural := 17;                      
9
    t_wait: natural := 33                      
10
);
11

12
ARCHITECTURE Behavioral OF deglitch IS
13
constant top_value : integer := integer(ceil(t_wait/t_clk));
14

15
BEGIN  
16
  PROCESS (clk)
17
  BEGIN
18
...

Quartus meint aber leider: can't determine definition of operator ""/""
Wie macht man das richtig?

Danke und Grüße
Paul
Moderator (Firma: Titel) Persönliche Seite #2712418
Lesenswert?

Paul P. schrieb:
> Wie macht man das richtig?
1
In the "math_real" package you will find "ceil" and "floor" functions 
2
wichh take in REAL numbers and return real numbers and return a REAL number
Du verwendest aber zwei NATURAL Integer. Das sind keine REAL Zahlen, und 
zudem solltest du auch eine REAL Division bekanntgeben, wenn du zwei 
REAL Zahlen dividieren willst. Denn es mach absolut keinen Sinn, zwei 
Integerzahlen zu dividieren, und das Ergebnis nach "oben" zu runden, 
weil das Ergebnis einer Integer-Division sowieso schon auf ,0000 
endet...

Sieh dir mal an, wie ich da rumcaste und konvertiere:
http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html

Kurz: in VHDL geht eine Typumwandlung nicht wie bei C "so irgendwie 
implizit halbautomatisch", sondern du musst dem Synthesizer genau den 
Typ angeben oder umwandeln.

Und falls dein Google nicht richtig funktioniert, hier der erste Treffer 
bei der Suche nach "math_real.ceil":
http://objectmix.com/vhdl/190883-ceil-floor.html
#2712526
Lesenswert?

1
LIBRARY IEEE;
2
USE IEEE.Std_Logic_1164.ALL;
3
USE ieee.numeric_std.all;
4
USE ieee.math_real.ceil;
5

6
ENTITY deglitch IS    
7
GENERIC
8
  ( t_clk : real := 17.66;                      
9
    t_wait: real := 33.33                      
10
);
11

12
ARCHITECTURE Behavioral OF deglitch IS
13
constant top_value : integer := integer(ceil(t_wait/t_clk));
14

15
BEGIN  
16
  PROCESS (clk)
17
  BEGIN
18
...
so funktioniert es tatsächlich.
Habe die Fehlermeldung auf den Divisions-Operator bezogen (es 
dementsprechend auch mit zwei unsigned versucht, was aber nichts 
gebracht hat) und daher nicht nach der Definition von ceil gesucht.
Vielen Dank für die Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren