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 中。

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

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与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第2张图片

下图中Matlab的绘图也证明了这一点,最大值处量化成了同样的数据,波形略有失真,原因在于Matlab使用的是 ceil() 函数向上取整,改成 floor() 向下取整,最小值量化成了同样的数据,波形略有失真。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第3张图片

向上取整

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

向下取整

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

四舍五入量化

3.Vivado中ROM调用.coe文件

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

选择“Block Memory Generator”。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第6张图片

(2)配置ROM

1处选择“Stand Alone”,2处选择“Single Port ROM”单口ROM,其中2处的可选项有:单口RAM,简化的双口RAM(一端读一端写),真双口RAM(两端都可读写),单口ROM(1个ROM),双口ROM(相当于2个ROM)。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第7张图片

1处配置数据的量化位宽,2处是ROM的深度(存储的点数),3处设置一直使能工作,能够节省一个使能引脚。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第8张图片

1处勾选加载.coe文件,2处找到.coe文件的路径,点击加载。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第9张图片

配置完成,地址8位,代表深度256,数据8位。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第10张图片

(3)配置计数器

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

1处配置成8位计数器,输出计数值位宽为8位,2处设置每次计数变化1,3处设置位向上计数,2处和3处配合实现每次加1。
Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)_第12张图片

(4)连接引脚

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

4.仿真测试

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

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

欢迎关注:FPGA探索者

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

你可能感兴趣的:(笔试面试,FPGA,DDS信号发生器,fpga,matlab,verilog,数字信号处理,数字通信)