当我遇到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。
答案 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将得到所需的结果。
这可能不符合'模数为实物'的定义,但至少就我的目的而言,结果令人满意。