基于国产FPGA的DDS信号源(一)

频率控制

许久没有更新CSDN,这两个月一直在弄信号源,使用的是上海安陆集团的fpga EG4S20FPGA,用了他的小核心板Lichee Tang。话不多说,讲下原理吧

我们使用的所谓的DDS,我觉得就是查表,我们用MATLAB生成一个MIF文件,然后控制FPGA来读表,在ROM中每一个位置都有对应的数据值,这些离散的数据值的包络也就是sin函数,说的简单一点就是说我将sin函数的值存在表中,然后再读取表中的数据,这样我的离散sin函数就是最标准的,然后再过一个低通滤波器,重建波形后就可以得到标准的罪函数。

    那么我怎么控制频率呢?

    思想是是这样的,我需要访问ROM的每一个位置来得到sin函数的值。起初,我们应该是每一个位置都要读到,即序列为0,1,2,3 ...... 1021,1022,1023每个点我们都将读出来给我们的DAC。那么我现在要隔一个位置读ROM,即序列为1,3,5 ...... .1021,2023。我们的点数会少一半,而我们生成一个周期的罪函数时间变短了一倍,即只有原来的1/2。也就说我原来一个周期需要1024点,也就是需要访问1024点的时间,现在一个周期只有512个点,也就是访问512点的时间。

    那我们怎么调节呢?

    我们只需要调整每次读取ROM到底间隔几个点,就可以得到对应的频率,举个例子,比方说我现在要得到原来的4倍频率,即我只需要读四分之一千○二十四= 256个点就可以实现原来频率的4倍,也就是我隔3个点读一次ROM,当中“隔几个点”也就是我们的频率控制字,我们当前读的点就是我们的相位控制字(注意:后面还给大家将如何调节相位,该相位说的读ROM的点的相位,非输出函数的相位)

我们设频率控制字为K,相位累加器字长为N,时钟频率为fc,则累加器长度为2 N,每次累加所需时间为1 f c  ,当相位累加次数为2 K / K时,累加器溢出,所消耗的总时间即为输出波形的一个周期,于是就可以得到DDS的输出频率为

f out = f c 2 N K.

我们这样虽然是可以修改频率,但所带来的问题也是有的。比如我初始的频率是1MHz时,我需要10MHz的频率的信号,那么我需要得到十分之一千○二十四= 102个点,那我需要30MHz的频率的信号,那么我需要得到三十分之一千零二十四= 34个点。随着我频率越来越高,我一个周期函数的点数会越来越少,所带来的波形失真也会越来越严重。

我们怎么解决这个问题呢方法一:可以在生成sin函数的MIF文件的点数取多一点,比如4096个,8192个等等......但也带来了更严重的问题,是我们的ROM只有那么大,没办法存下这么大的数据量。

我们采用的解决措施一是:SIN函数是一个非常特殊的函数,是关于中心对称的,我们可以将它分成4份,以Π/ 2为单位,0到Π/ 2我们存1024个点,如图:

我们的Π/ 2到Π的图形可以用0到Π/ 2图像得到,即函数= T / 2-sinx的。

Π到3Π/ 2的图像可以用0到Π/ 2图像得到,即函数= -sinx。

同理得到最后一个部分的。

这样我的每一个Π/ 2都是1024点,整个周期就是4096个点,就实现了我ROM表还是存放1024点的空间,而我们使用却有4096个点。

理论分析一波

若相位累加器为q位,若相位累加器为R,则相位累加器的输出经过截尾后,取到ROM中的数据为

ü 2 [R] = 2 q · [R ,R = 0,1,2,...,2 q -1

其中相位累加器r = K·n(n = 0,1,2,3,...,N-1),频率控制字K = 2 q N = 2 q f x f s 。(0≤K< 2 q -1

由于相位累加器的位数q与采样频率˚F小号固定,所以产生的频率FX与频率控制字ķ成正比。˚F Ç = ˚F 小号2 Q K,由于1 ķ 2 Q -1,所以˚F 小号2 q ˚F ç ˚F 小号2,频率由给DAC的时钟决定。

频率的控制原理就算理清楚了

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值