Verilog实现对数运算log

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

  对于FPGA而言,其对对数运算是十分有限的,但在某些特殊场景种,需要进行精度不高但快速的对数运算,FPGA就体现了他计算速度的优势,本文主要介绍采用Verilog实现对数运算的原理及实现方法。

一、理论基础

对数换底公式:  

   log ⁡ D A \log_DA logDA = log ⁡ 2 A \log_2A log2A/ log ⁡ 2 D \log_2D log2D

log ⁡ 2 A \log_2A log2A计算变换:
A = ∑ i = 0 N − 1 a i 2 i \sum_{i=0}^{N-1} a_i2^i i=0N1ai2i ,其中N为A的bit位宽, a i a_i ai为各bit的数据(0或1)
若A中不为0的最高bit位为k,即 a k a_k ak=1, a i a_i ai(i>k)均为0,则:

log ⁡ 2 A \log_2A log2A = log ⁡ 2 ( 2 k A / 2 k ) \log_2(2^kA/2^k) log2(2kA/2k) = k + log ⁡ 2 ( A / 2 k ) \log_2(A/2^k) log2(A/2k)

A / 2 k A/2^k A/2k < 2,则0< log ⁡ 2 ( A / 2 k ) \log_2(A/2^k) log2(A/2k) <1,那么就将 log ⁡ 2 A \log_2A log2A的运算分为2个部分:整数部分k和小数部分 log ⁡ 2 ( A / 2 k ) \log_2(A/2^k) log2(A/2k)
因1/ log ⁡ 2 D \log_2D log2D位固定值,故采用乘法器可计算出最终的

log ⁡ D A \log_DA logDA = 1/ log ⁡ 2 D \log_2D log2D * (k + log ⁡ 2 ( A / 2 k ) \log_2(A/2^k) log2(A/2k)

二、Verilog实现方法

  提供一种Verilog计算log2的计算方法,最终计算 log ⁡ D A \log_DA logDA需增加乘法,实际应用中,受底数和其它影响,乘法器设计较为灵活,所以不提供乘法器设计,仅仅提供log2的计算方法。
  
1、查找不为0的最高bit位k,查找方法可开用bit轮询查找或case查找。bit轮询查找每次只能查找1个bit,耗时较长,case查找可在最短1个时钟找到。
  
2、小数位计算,从k-1bit位开始,依次向后取m个bit数据,m的大小影响计算精度,m越大,精度越高。最终得到mbit的数据,将该数据作为查找表的索引即地址,查询查找表的数据即小数部分F。
  
3、定点即运算
  如最终结果定点位Fix16_8,8位小数位,则查找表中的数据位宽位8,均为小数。7位整数,将K右移8位并扩展到16位即可得到整数位数据,整数位数据和小数位数据相加即为最终 log ⁡ 2 A \log_2A log2A的值。
  因1/ log ⁡ 2 D \log_2D log2D位固定值,故采用乘法器可计算出最终的 log ⁡ D A \log_DA logDA

4、查找表制定
查找表通过matlab制定,并定点后写入文件存储,如采用m=8,数据为8位数据

m = 8;
a = log2(1+(0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值