参考:https://www.jianshu.com/p/beab73eb8f2f
https://www.cnblogs.com/xiaomeige/p/8846786.html
背景:由于AD9226模块采集回来的数据以二进制补码的形式输出,总的有12位,最高位为符号位,11位为数据位。n位有符号整数的表示范围是,所以总的数据范围是 。所以正弦波幅值不能超过2047。在傅里叶变换时采样的点是1024个点,所以仿真时采样点数为2048个点满足要求。
- MATLAB产生波形离散数据
Matlab中没有直接将负整数转化为补码(有符号整型)存储的函数,需要先将其转化为有符号二进制形式保存到txt中。正数的补码是他本身,负数的补码讲道理是除了符号位按位取反加一,不过在MATLAB里参考别人程序,是采用加的方法,其中奥妙没有参透,如果有大神知道请指导。
fc = 10e6; % 波形频率,1Mhz
n = 1/fc/2048; %分为2048个点,大于1024即可
t = [0:2047]*n; %时间轴
x = 2047*sin(2*pi*fc*t); %波形
xx = fix(x); %取整函数
xx(find(xx<0))=4096+xx(find(xx<0)); %负数转化为有符号形式
y = dec2hex(xx); %转化为16进制存储
fid=fopen('sin.txt','wt'); %写入文件
for i=1:2048
fprintf(fid,'%s\n',y(i,:)); %一个数存储一行
end
fclose(fid); %关闭数据流
运行结果:
x的波形:
Xx的波形:
Txt格式:
- Modelsim仿真波形数据
在Modelsim中新建一个工程,将sin.txt拷贝到该文件夹下,新建Verilog文件代码如下:
`timescale 1ns/1ns
module dds_sim_tb();
parameter T = 2;
//input
reg clk;
reg reset_n;
reg signed [11:0] data_mem[0:2047];
reg signed[11:0] data_out;
reg [10:0] i;
initial
begin
$readmemh("sin.txt",data_mem);
clk = 1'b0;
reset_n = 1'b0;
i=0;
#50 reset_n = 1'b1;
end
always #(T/2) clk = ~clk;
always@(posedge clk)
begin
if(!reset_n)
begin
data_out <=12'd0;
i <= 11'd0;
end
else
begin
data_out <= data_mem[i];
i <= i+11'd1;
end
end
endmodule
波形设置:
这样子就得到了双极性正弦波。