Verilog实现整数与小数部分的二进制转化为十进制

           最近在做进制转化的FPGA实现,用到了FPGA的串口通信功能,首先将二进制数值(32定点数,末16位代表小数)由PC写入串口小助手,传给FPGA,再将转化后的结果由串口传到PC端显示,整体的过程比较简单,这部分以后再讲,今天主要来讲讲小数部分的二进制转十进制。

        首先关于整数部分的进制转化最常用的是移位加3算法,具体的实现过程如下:   

       1.将二进制码左移一位(或者乘2)

       2.找到左移后的码所对应的个,十,百位。

       3.判断在个位和百位的码是否大于5,如果是则该段码加3。

       4.继续重复以上三步直到移位8次后停止。

        在51系列里有十进制调节指令(半字节大于9,则加6),PIC里没有,只好采取变通的变法。即检查半字节+3是否大于7,也就是检查半字节是否大于4。因为,如果大于4(比如6),下一步左移就要溢出了,所以加3,等于左移后的加6,起到十进制调节的作用。检测半字节+3是否大于7,编程会变得简练一些。

(具体可参考这篇文章:http://www.360doc.com/content/11/0223/17/5169677_95465965.shtml,代码可参考:http://blog.csdn.net/li200503028/article/details/19507061)

下图是一个实例(10100010转为十进制162):

Verilog实现整数与小数部分的二进制转化为十进制_第1张图片

          接下来说说小数部分的转化。转化方法有两种,一种是简单的列表法,即小数部分的每一位二进制值,可用十进制表示(比如0.1000表示的是0.5,可用0.0101来代替)。列表的大小根据自己所取的精度有关,本文小数精度取4位。转化过程:当小数部分的二进制序列某位值为1,则加上1所在位置的进制码,这里精度计算到二进制序列的第8位。对每列进制码累加后的值若大于9则向前进1(十进制表示,该位减10并向前进1);若累加值大于19,则向前进2,以此类推。

                        Verilog实现整数与小数部分的二进制转化为十进制_第2张图片

       本文用ISE进行了代码仿真(0.1001即十进制数0.5625,整数10010011即为147),结果如图所示:

Verilog实现整数与小数部分的二进制转化为十进制_第3张图片

           当然还有一种方法是扩大整数倍在进行转化,比如有一个四位的小数0.1111,可以先扩大(10000/16=625)的倍数,再按整数的转化方法进行转化即可得到结果,列表法的缺点是想要保证精度列表就会比较大,消耗的硬件资源也会越多,尤其当小数位数很多,精度要求比较高的时候会比较明显。这里的方法仅当参考,谢谢阅读~


你可能感兴趣的:(Verilog实现整数与小数部分的二进制转化为十进制)