正弦信号,是一个模拟信号。而FPGA只能产生数字信号。因此需要用DA将数字量转化为模拟量。这里采用modelsim的模拟波形显示,就不需要DA模块了。产生正弦信号的方法有很多,这里用的是查找rom的方法,产生正弦信号。
正弦信号,是一个介于-1和1之间的模拟量。而正弦信号是周期变化的,因此这里只需要将半个正弦信号周期的值存进rom里,其余周期可以根据这个半个周期的值变化可得到。用matlab产生正弦信号的值。以0.01为步长,从0采集到pi/2。共158个点。
因此sin的值是小数,而FPGA是不能表示小数的,因此需要将小数扩大,以整数来表示。此次是以12位二进制来显示这整数。扩大的方法就是乘以212即可了。12位二进制数最大能表示212-1的值。这里用0表示最小值0,212-1表示最大值1,则0到1中间的数,就可以扩大到用0到212-1中间的数来表示了。例如,0.3,就可用整数0.3*2^12=1228.8,在向上取整,为1228,当然这样表示会有误差。
这里rom用的是ISE的IP rom。将matlab生成的数据放进rom里面。然后依次读取rom的值,即可生成正弦信号了。
首先是生成rom的初始化文件。Xilinx的rom的初始化文件的后缀为.coe。而这个特殊文件有固定的格式。
第一行的10表示下面的数字是10进制的。。。 后面的数据是依次存入rom的值,以逗号分开,最后一个以分号结束。前面两行的内容是固定的。
生成初始化文件的matlab如下所示:
fid = fopen(‘sin_rom.txt’,‘w’);
fprintf(fid,‘MEMORY_INITIALIZATION_RADIX = 10;\n’);
fprintf(fid,‘MEMORY_INITIALIZATION_VECTOR =\n’);
for i = 0:1:pi/2*100
y = sin(i/100);
rom =floor( y * 2^12);
if i == 157
fprintf(fid,‘%d;’,rom);
else
fprintf(fid,‘%d,’,rom);
end
if mod(i,10)==0 && i ~= 0
fprintf(fid,'\n');
end
初始化文件生成后,剩下就是编写verilog代码。
首先建一个工程,然后新建一个IP。找到rom,打开。设置按如下设置:
这里是设置位宽,采用的是13位(第一位为符号位,后面12位为数据位)来显示sin的值。因此这里是设置为13.深度是因为要存158个值,所以这里设置为158.
这里将刚刚生成的.coe文件载入,如果没有显示红色,就说明正确,否则错误。错误的原因是数据和设定的深度没有对齐。
接下来直接生成就行了。
接着就是编写verilog代码了。
首次查看用ip生成的rom的HDL例化代码.
其代码,如下所示:
测试代码如下所示:
module sin_top_test;
// Inputs
reg clk;
reg [9:0] address;
// Outputs
wire [12:0] data_out;
// Instantiate the Unit Under Test (UUT)
sin_top uut (
.clk(clk),
.address(address),
.data_out(data_out)
);
always#5 clk = ~clk;
initial begin
// Initialize Inputs
clk = 0;
address = 0;
// Wait 100 ns for global reset to finish
while(1) begin
@(negedge(clk));
if( address < 631 )
address = address + 1;
else
address = 0;
end
end
endmodule
接着用modelsim仿真。因为有用到xilinx的IP ROM。因此用modelsim单独仿真比较麻烦。因此这里是直接在ISE里面调用modelsim,这样比较简单。
只需在设置器件这里将仿真器设置为modelsim就可以了。
然后就可以直接仿真了。
在modelsim里面
将out的format的格式改为analog。这样一会显示的波形就会以模拟的形式显示了。
仿真后,标准的正弦波形就出来了。是不是很酷啊。。哈哈哈
这里采用的modelsim仿真,而不是用的是ISE自带的仿真,因为ISE的波形不能以模拟波形显示。
这样产生的正弦波,方法比较简单,但是不能调节,调节的话,就要重新生成rom的值。而且还伴随着误差。可以增大位数,和减小采样间隔时间来减小误差。
如果你想要快速入门、转行做数字前端设计,不妨到学习这些课程,给自己一次蜕变的可能。芯片东西还是挺多的,要讲的也太多。慢慢学吧。祝好运!
因篇幅问题不能全部显示,请点此查看更多更全内容