一、创立文件
还是直接点击左边的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是它的最小分辨率




