两个正弦信号变一个锯齿波(FPGA实现)

                                              图1   流程图:正余弦转三角波再到锯齿波

            说一下这样处理的目的:在位移测量领域,可以将正余弦信号产生的位移信息进行到锯齿波的转换,一方面可以更利于辨向,另一方面可以通过斜率及直线表达式 计算出位移从而没有必要对正余弦信号进行细分转方波,从而计算方波数来得到位移。

            处理两路正余弦信号的前提:两个正余弦信号的相位差为90度,幅值相同(以后有机会我再发一个将两路正余弦信号进行正交及幅值、偏置电压调节的硬件电路,处理完后再将两路信号通入FPGA即可)。

  1.第一部分:两路正余弦信号转为单个三角波

           由于缺少信号发生器,我使用FPGA做了两个相位差为90度,频率为500hz、幅值相同的两路信号(数字量位宽为8位),流程图如图3所示,有一点需要说明一下,这个波形是无符号的二进制表示的(到后面我再说明为什么我要强调这一点)。

图3

仿真波形:

          图4 仿真波形

         现在开始进行两个正余弦波到一个三角波的转换,转换公式如图5所示:

图5 正余弦转三角波公式

        最后计算的结果可以看出,是有分数的,因此需要进行浮点数的运算。FPGA在程序中进行计算的,最后算出的结果都是定点数,如果计算出1.2123,它会显示1。因此需要用到quartus自带的浮点数转换ip核、浮点数乘除与加减ip核以及绝对值IP核(绝对值的转换如果想节省资源可以利用自己写的程序实现,这个比较简单)等等。

首先要介绍一些quartus的运算Ip核:

图6 需要用到的运算ip核

           因为输入各个Ip核的信号它默认你为有符号的。如果用你无符号的二进制产生的信号信号通入那么最后生成的浮点数肯定不是和你无符号的二进制数一一对应的。我举例来说明一下:你的正余弦信号由0-256组成,也就是二进制的0000_0000到1111_1111,这些无符号的二进制组成了你的正余弦波形。 你把这些数据通入到ip核中会发生什么呢:1111_1111对应的有符号数为十进制的-1,转化为浮点数的数值为-1,而你无符号的1111_1111对应的十进制为256,转为浮点数为256。你的初衷是你的两个信号是由无符号的二进制组成的。现在全部将你的无符号二进制以有符号的二进制输入到ip核中,此时对应的浮点数不再是0-256,转化为的浮点数对应的图像也绝对不是正余弦信号。因此需要以无符号的形式通入到ip核中 。

            我们使用位拼接的做法{0(符号位一直为正),data(八位宽的数据)} 组成9为数据,这样ip核识别的就是你的无符号的二进制的数,最后转为的浮点数也是正确的。

            因此模块框图如图7所示:

                                                                               图7

然后进行ip核的加减、乘除运算:

                                                                               图8 

通过仿真,我们可以看一下,最后一步除法输出的浮点数的一些值:(不知道为什么,输出的值不够准确,有时候会差个0.1与0.2 我怀疑是除法ip核的问题,用vivado就不会出现这种情况

                                                             图9 输出的浮点数的一些值

         最后我们需要进行输出用DA去将二进制数(无符号)转化为模拟量进行输出,但是考虑一个问题,图9这些数经过定点数转换会变为0,你DA怎么采都不会出信号的。 因此需要做一个处理:将这些数扩大85倍(根据result的最大值去选择扩大倍数,比如最大值我2.9999999,你扩大85倍也不会超过256),扩大倍数越大越准确。因为我用的是8位宽的DA,数据最大为256,所以我选择了 85倍,再大的话就溢出了!所以此时需要运用乘法Ip核,再扩大85倍。需要85(浮点数形式)乘result 。

         将85变为浮点数有两种方法:第一个就是在程序中编一个A=85,再将其转化为浮点数后,再通入ip核中。  另外一种就是直接找85对应的浮点数:32'b01000010101010000000000000000000

在例化中直接例化就ok,如图10所示:

                                                                      图10

此时经过扩大的数经过Ip核再转化为定点数,如图11所示:此时出来的定点数为有符号的二进制表示的,需要把它转化为无符号的数才能让DA进行输出。因此我做了一个操作:如图12所示:

                                                                           图11

图12 有符号二进制转化为无符号二进制

       到此就完成了第一部分:两路正余弦信号转化为三角波,我们将输出的数据经过DA(8位宽)输入到示波器上:  (可能是除法Ip核的问题(建议用Vivado),导致数据不太准,波形可能有点偏差)。 (我使用的DA在我以前的文章中有对其整个原理图的讲解)

                                                                    图13 最终输出的三角波

         

  第二部分:三角波转锯齿波(后续有时间再写,主要用到了一些异或门转换等等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值