Medelsim仿真双极性正弦波

参考: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

波形设置:

 

这样子就得到了双极性正弦波。

没有更多推荐了,返回首页