欢迎光临
我们一直在努力

dds的查表法

一、创立文件

还是直接点击左边的IP这部分,点击create这个按钮,在右边的diagram点击加号搜索

选取Block Memory Generator,添加。添加完之后依旧双击打开这个,

Block Memory Generator第一页配置

这部分,MODE选择STAND alone,memory type 配置成single port rom

Block Memory Generator第二页配置:

port a width 代表配置的点的数据位,本次使用8位数据位。

port a depth 代表配置的查找表深度,也就是采样的点,我们这里设置一周期采样256

enable port选取always让他一直使能

optional部分第一个pritimitive勾选上,会导致它的输出延迟一两个时钟,好处是会对输出的时序进行一定的优化,这里我们先勾选上。

Block Memory Generator第三页:

这里的load init file是用来配置初始化的文件,现在我们需要初始化文件怎么办,我们需要用到matlab产生一个初始化的文件。

如果你的芯片是xlinx,那么文件尾缀是.coe文件

如果你的是quartus altera ,那么文件尾缀是.mif文件

matlab实现coe文件

这里给出生成十进制,均为正y轴上的sin函数,matlab生成coe文件的代码:

Fs_n=256; % 抽样点数,采样深度,这里是一个周期采样256个点
Bit_Width=2^8; %抽样的数据占的数据,这里是占8位数据

% 生成单周期正弦波,共Fs_n个点,避免首尾数值重复
t = 0 : 2*pi/Fs_n : 2*pi*(Fs_n-1)/Fs_n;
y=0.5*sin(t)+0.5;
% r=ceil(y*(Bit_Width-1)); %量化,向上取整
% r=floor(y*(Bit_Width-1)); %量化,向下取整
r=round(y*(Bit_Width-1)); %量化,四舍五入到256-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); %写完了,关闭文件
figure;
plot(r);

不会的可以问豆包,哪里有问题也问豆包,记得开专家模式

然后再次点开我们生成的ip

给这个coe文件配置进去

再增加一个计数器的ip核,问就是懒得写

Binary Counter计数器第一页配置

output部分就是数据的位宽,这里写8位

HEX表示一次增加多少,计数我这里选一次加1

count mode部分可以选择向上计数,向下计数

第二页的蛮特殊的,不用管,要用了问豆包把。

第二页部分细节

第二页的SINIT注意一下,它代表我们从哪里开始计数,这部分可以设定我们的相位,蛮不错,比如我们256采样深度,从计数的256*1/4也就是64开始计数,就是sin函数的pi/2相位开始

连接q到数据端,然后输出的就是我们的波形

然后还是和之前一样,先生成output文件,然后再生成hdl顶层文件

依旧调用,依旧生成仿真文件

总结部分

这部分解释为什么输出的正弦波频率0.488mhz

这部分解释了频率控制字固定为1,达到我们最小的分辨率,图中的dds_min是它的最小分辨率

赞(0)
未经允许不得转载:171主机测评 » dds的查表法
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址