【问题标题】:fixed point conversion from a real variable in vhdlvhdl中实变量的定点转换
【发布时间】:2011-11-03 04:56:12
【问题描述】:

我在 vhdl 中有如下代码 sn-p:

signal s: signed(31 downto 0);
s <= to_signed(to_sfixed(1.2,8,-23),32);

现在我期待 1.2 的定点版本在信号“s”中可用。

但它总是忽略小数部分。 's' 只包含小数部分(此处为“1”)。

我在这里错过了什么?

【问题讨论】:

    标签: vhdl fixed-point


    【解决方案1】:

    如果您只是想将 sfixed 中的位重新解释为有符号类型,只需使用简单的类型转换:

    signal s: signed(31 downto 0);
    ...
    s <= signed(to_sfixed(1.2,8,-23));
    

    【讨论】:

    • 太棒了,谢谢.. 作为旁注,您可以使用以下转换: r
    • 这样做,必须跟踪二进制点。一直保持sfixed 并让编译器跟踪它会更好(恕我直言)。如果目的地真的超出您的控制范围,那么您别无选择,只能管理它。我会确保我为 8-23 创建了一些常量,以防您将来想更改它们。
    • 我同意 Martin 的观点,即在整个设计过程中使用正确的类型来表示您的数据是最好的方法。另一方面,您经常不得不与不这样做的设计进行交互,知道如何在不同的表示之间进行转换是件好事。 =)
    【解决方案2】:

    s 没有任何地方可以存储任何小数部分,它是一个只能表示整数的有符号向量。

    不过你快到了 - 放弃签名并制作 s 和 sfixed 类型:

    signal s: sfixed(8 downto -23);
    s <= to_sfixed(1.2,sfixed'high,sfixed'low);
    

    【讨论】:

    • 但问题是我使用这个信号作为模块的输入,其中“s”应该是有符号格式的。由于 fixed_pkg 在许多平台上不可综合,我只在测试台代码中使用它。
    • fixed_pkg 应该可以合成就好了。如果你不能使用它,你将不得不移动 sfixed 值并跟踪二进制点在哪里......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多