Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)

相关文章
1.Matlab与FPGA数字信号处理系列——DDS信号发生器——Quartus ii 原理图法利用 ROM 存储波形实现DDS(1)

2.FPGA仿真必备(1)——Matlab生成.mif文件——JPG图片转.mif文件——Matlab生成.txt文件

3.MATLAB与FPGA数字信号处理(数字滤波器设计)、无线通信、图像处理、信道编码系列

1.系统参数及框图

ROM 存储一个正弦波完整波形,存256个点,每个点进行 8 bit 量化,使用 Matlab 产生 .coe 存储器文件,加载到 ROM 中。

在这里插入图片描述

2.Matlab制作.coe文件

Fs_N = 256;                     % 抽样点数
Bit_Width = 2^8;               % 量化位宽
 
t=0:2*pi/Fs_N:2*pi;
y=0.5*sin(t)+0.5; % (-0.5~0.5)+0.5 ->(0~1),转成无符号数
% r=ceil(y*(Bit_Width-1));      % 量化,向上取整
% r=floor(y*(Bit_Width-1));     % 量化,向下取整
r=round(y*(Bit_Width-1));       % 量化,四舍五入
 
fid = fopen('sin.coe','w');  % 写入 'sin.coe' 文件
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=10;\n');   % 固定写法,表示写入的数据是 10进制 表示
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');     % 固定写法,下面开始写入数据
for i = 1:1:Fs_N
    fprintf(fid,'%d',r(i));
    if i==Fs_N
        fprintf(fid,';\n');   % 最后一个数据用 ;
    else
        fprintf(fid,',\n');    % 其他数据用 ,
    end
end
fclose(fid);                     % 写完了,关闭文件

写入后,文件内容如下图所示,第三行开始是波形量化后的数据,在第62-72行全部被量化为255(8-bit量化的最大值),可以想象,输出的波形在顶峰时会有一个较平的地方,是量化精度不够造成的。
在这里插入图片描述

下图中Matlab的绘图也证明了这一点,最大值处量化成了同样的数据,波形略有失真,原因在于Matlab使用的是 ceil() 函数向上取整,改成 floor() 向下取整,最小值量化成了同样的数据,波形略有失真。
向上取整

向上取整

向下取整

向下取整

四舍五入量化

四舍五入量化

3.Vivado中ROM调用.coe文件

(1)新建工程,调用ROM IP

选择“Block Memory Generator”。
在这里插入图片描述

(2)配置ROM

1处选择“Stand Alone”,2处选择“Single Port ROM”单口ROM,其中2处的可选项有:单口RAM,简化的双口RAM(一端读一端写),真双口RAM(两端都可读写),单口ROM(1个ROM),双口ROM(相当于2个ROM)。
在这里插入图片描述

1处配置数据的量化位宽,2处是ROM的深度(存储的点数),3处设置一直使能工作,能够节省一个使能引脚。
在这里插入图片描述

1处勾选加载.coe文件,2处找到.coe文件的路径,点击加载。
在这里插入图片描述

配置完成,地址8位,代表深度256,数据8位。
在这里插入图片描述

(3)配置计数器

在这里插入图片描述

1处配置成8位计数器,输出计数值位宽为8位,2处设置每次计数变化1,3处设置位向上计数,2处和3处配合实现每次加1。
在这里插入图片描述

(4)连接引脚

在这里插入图片描述

4.仿真测试

编写TestBench仿真文件,只需要给定时钟信号即可。
假设给定时钟 125 MHz,即时钟周期为 8 us,每输出一个采样点需要 8 us,输出256个正弦波的采样点需要 256×8 us,即正弦波的周期为 256×8 us,即频率为 125MHz / 256 = 0.488 MHz 左右。

在这里插入图片描述

欢迎关注:FPGA探索者

回复 “DDS256” 获取工程源码。

在这里插入图片描述

  • 10
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值