一.DDS
DDS的原理就是把正弦波数据存在rom里,然后按照一定的速率输出。比如设定rom的宽度为8位,深度为256。时钟的采样速率为50M,则输出的正弦波频率为:
f_out=50M/256=195KHZ
实现调频就可以从中抽出数来输出,比如隔一个输出一次,一个周期只有128个点就可以把频率扩大一倍。或者一个数输出2次就可以把频率缩小一倍实现调频。
所以定义一个16位的计数器,高八位为rom的地址,每次加的数不同就可以实现不同的频率。
f_out/f_add=f_clk/2^16
f_add=2^16*f_out/f_clk
比如要输出100K的正弦波
f_add=131
下面用matlab生成.coe文件存放正弦波数据
由于.coe文件的格式要求在生成的文件里开头加上
再把结尾的‘,’号改为‘;’即可。
数据宽度设置为8,深度为256和matlab中设置的一样。
勾选出时钟信号
导入刚刚生成的coe文件,ROM的IP核设置就完成了。
这里就把IP核例化一下,把f_word的高八位付给IP核的地址选择位。
这里的f_add只要在后面的testbench里面进行赋值就可以看仿真了,这里不单独仿真后面一起看波形。
下面用matlab生成fir滤波器需要的.coe文件
在APP里有filter designer设置参数之后就可以自动生成抽头系数
以低通滤波器为例,选择窗函数,汉明窗采样频率设置成50M截止频率设置为500K,系数设置为50个,因为自动生成的是科学技术法的数值,在这里设置成16位的数。
选择上面的targets->xilinx(.coe)就可以自动生成.coe文件。滤波器原理不多介绍,自己拆看即可,其实就是卷积运算。
下面进行fir IP核的设置。
选择coe file导入刚刚生成的coe文件,选择滤波器类型
通道数选择1,时钟频率选择50M数据输入频率选择10M.
系数为16位,因为dds输出的数据是8位的所以输入为8为无符号数。后面的不用设置,都为默认。
下面进行fir的例化
因为输出的数据是32位的额,但是刚刚核里生成的是28位的,所以取低位的28位赋值给lpf_data。
这里是每个位的具体功能。
编写top顶层文件,因为刚刚设置的数据输入速率为10M所以设置计数器,每次计数到4把q0赋值给q。这样就完成了,开始编写testbench。
按照上面的计算方法,先生成100K的正弦波再生成1M的正弦波,开始仿真。
可以看到100K的输入信号时输出不变,当输入1M的信号时被滤去。