fpga初学者遇到的问题——关于浮点数支持

在正式学习fpga之前我有听说fpga不支持浮点数,而fpga寄存器类型里面又有一种real实数类型。那是否矛盾呢?答:不矛盾。因为real只是纯数学的抽象描述,只能用于仿真,无法用于综合,不对应任何具体的硬件电路。

如果想要在fpga里面使用小数这种,可以尝试定点数如:

  在 Verilog 中,由于没有直接的定点数数据类型,定点数一般是通过使用整数类型(regwire)来模拟定点数的表示。常见的做法是将一个整数变量的一部分位宽用来表示整数部分,另一部分位宽用来表示小数部分。

定点数的表示方式:

假设我们有一个16 位的定点数,其中8 位用来表示整数部分,8 位用来表示小数部分。这种情况下,定点数表示的范围将是:

  • 整数部分范围:-128 到 127
  • 小数部分的精度:每个小数位代表 1/256

Verilog 中表示定点数的例子:

 

verilog

复制代码

module fixed_point_example(); // 定义 16 位定点数,其中 8 位整数部分,8 位小数部分 reg signed [15:0] fixed_point_a; reg signed [15:0] fixed_point_b; reg signed [15:0] fixed_point_result; // 缩放因子:8 位用于小数部分,代表 2^8 = 256 parameter SCALE = 256; initial begin // 赋值:假设我们要表示 3.75 和 -2.25 fixed_point_a = 3.75 * SCALE; // 3.75 * 256 = 960 (十进制) fixed_point_b = -2.25 * SCALE; // -2.25 * 256 = -576 (十进制) // 输出原始值(带缩放因子) $display("fixed_point_a (scaled) = %d", fixed_point_a); $display("fixed_point_b (scaled) = %d", fixed_point_b); // 相加操作 fixed_point_result = fixed_point_a + fixed_point_b; // 输出加法结果(带缩放因子) $display("fixed_point_result (scaled) = %d", fixed_point_result); // 恢复为实数输出 $display("fixed_point_result (real) = %f", fixed_point_result / SCALE); end endmodule

代码解析:

  1. 定点数表示

    • fixed_point_afixed_point_b 是 16 位的定点数寄存器,使用其中的高 8 位表示整数部分,低 8 位表示小数部分。
    • 定义一个缩放因子 SCALE,这里我们选用 256(因为有 8 位小数部分,即 2^8)。
  2. 定点数赋值

    • 变量 fixed_point_a 赋值为 3.75 * 256 = 960,用 960 来表示定点数 3.75。
    • 变量 fixed_point_b 赋值为 -2.25 * 256 = -576,用 -576 来表示定点数 -2.25。
  3. 定点数运算

    • 在定点数上可以进行整数运算,例如加法。在 fixed_point_result = fixed_point_a + fixed_point_b 中,结果为 960 + (-576) = 384
  4. 恢复实数表示

    • 在仿真中,通过除以 SCALE 来恢复实数值,例如 384 / 256 = 1.5,表示最终结果为 1.5。

定点数的优缺点:

  • 优点
    • 资源消耗较少,适合 FPGA 等硬件实现。
    • 运算简单,不需要复杂的浮点单元。
  • 缺点
    • 精度有限,特别是小数部分的位数较少时,会导致精度损失。
    • 开发者需要手动处理缩放因子,增加了设计复杂度。

这种手动管理位宽和缩放因子的方式非常适合在 FPGA 中实现高效的定点数运算。

或者使用浮点数相关的第三方ip核

定点数和浮点数的优缺点比较

特性定点数浮点数
表示范围较小,固定范围较大,支持非常大的数和非常小的数
精度高,适合精度要求明确的场景精度不确定,可能有舍入误差
硬件实现简单,效率高,资源消耗少复杂,资源消耗大,需要更多的逻辑单元
应用场景DSP、FPGA、嵌入式系统科学计算、需要大范围数值表示的场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值