为什么没有为实际值定义mod运算符?

时间:2016-01-23 14:57:53

标签: vhdl

当我遇到VHDL没有为REAL值定义mod运算符的问题时,我想计算和模拟时钟相移。

我查看旧的VHDL书籍和online source。两者都提到整数mod,但不提及数字(包括浮点数)。

GHDL还报告mod为未知。

示例计算:

constant Period     : TIME := 10.0 ns;
constant PhaseDelay : TIME := Period * (((Phase + 360.0) mod 360.0) / 360.0);

为什么没有为实际值定义mod运算符?

整数值的模数/余数定义a,b:
a = (a/b)*b + (a REM b)

该等式也可用于负数的均匀计算。负数的模运算需要一些技巧来处理符号,但它也基于add,sub,mult,div。

2 个答案:

答案 0 :(得分:3)

Modulo定义为整数,但不适用于实数。 Modulo为你提供整数除法a / b的余数,但真正的除法没有余数,它给你一个真实的......

例如,如果你执行13除以3.整数除法将给出4的结果,余数(模数)为1.实分将给你大约4.333333333333,没有余数,因为它是精确的(忽略有限表示数量)。

要在a / b = c真正划分后获得模数,您必须执行(c - floor(c))*b之类的操作。在 13/4示例的情况下,它会返回1。

答案 1 :(得分:0)

我有类似的问题,我很容易解决。我有一个实数变量 r ,我需要钳制(如 modulo ),因此它保持在0.0到1.0的范围内。首先,我创建一个整数 i = floor( r )。然后我从 r 中减去 i 以获得我的答案。如果您的代码允许您缩放结果,我怀疑将此乘以360将得到所需的结果。

这可能不符合'模数为实物'的定义,但至少就我的目的而言,结果令人满意。