|
在使用FPGA实现sin波形的时候采用查找表法比较简单,也就是读取ROM表的值,具体的步骤如下:
1、第一步是需要在ROM中添加初始化数据,创建.mif文件,采用matlab来实现。matlab代码如下:
width=12; %宽度是
depth=4096; %深度是1024
n=0:depth-1;
yn=sin(2*pi/4096*n);
yn=round((yn+1)*2047);
plot(n,yn);
%===============================开始写mif文件===============================
addr=0:depth-1;
str_width=strcat('WIDTH=',num2str(width));
str_depth=strcat('DEPTH=',num2str(depth));
fid=fopen('E:\code\matlab_code\sin_code.mif','wt'); %打开或者新建mif,存放位置和文件名任意
%如果只写文件名,则在当前目录下建立此文件
fprintf(fid,str_width);
fprintf(fid,';\n');
fprintf(fid,str_depth);
fprintf(fid,';\n\n');
fprintf(fid,'ADDRESS_RADIX=HEX;\n'); %因为下面的数据输入我选的是16进制,
%这里可根据情况改写
fprintf(fid,'DATA_RADIX=HEX;\n\n');
fprintf(fid,'CONTENT BEGIN\n');
fprintf(fid,'\t%X : %X;\n',[addr;yn]) %开始写数据了
fprintf(fid,'END;\n');
fclose(fid);
可以得到如下所示的.mif文件
WIDTH=12;
DEPTH=4096;
ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;
CONTENT BEGIN
0 : 7FF;
1 : 802;
2 : 805;
3 : 808;
注意数据的位宽和数据的深度,也就是ROM表中数据个数,这里我设置的是位宽为12位,深度为4096,把sin一个周期采样成4096份。
2、第二步是建立ROM表,主要的问题也是数据的位宽和深度。
Attention!!!
添加的.mif文件一定要放在所建立的工程文件下面,不然会读不出ROM表中的数据。(至少quartusII 12版本是这个样子的)
3、写主module,然后将生成的ROM例化进去
module sin(clk,rst_n,start,data_out,phase);
input clk;
input rst_n;
input start;
output [11:0]data_out;
output [11:0]phase ;
/******************************/
wire [11:0]phase;
myrom U1(
.address(phase),
.clock(clk),
.q(data_out));
/*******************************/
reg [11:0]cnt=12'd0;
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
cnt<=12'd0;
else if(start)
cnt<=cnt+1'b1;
else
cnt<=cnt;
end
assign phase=cnt;
endmodule
4、编写testbench
`timescale 1 ns/1 ns
module sin_simulation();
reg clk;
reg rst_n;
reg start=1;
wire [11:0]data_out;
wire [11:0]phase;
/*******************************/
sin U1(.clk(clk),.rst_n(rst_n),.start(start),.data_out(data_out),.phase(phase));
initial
begin
rst_n=1'b0;
#5;
rst_n=1'b1;
end
initial
begin
clk=0;
forever #5 clk=~clk;
end
endmodule
5、运行modelsim
设置modelsim模式为示波器模式,数据格式设置为无符号类型
Radix——unsigned
Format——Analog(automatic)
这样就得到要显示的波形啦!
6、通过设置设置地址的步进长度可以得到不同周期的正弦波,同时创建不同波形的.mif文件,同样可以通过按键得到不同的相应的波形,制作一个简易的波形发生器。
需要注意的就两点:1、.mif文件中数据的宽度和深度,然后还有创建的ROM的数据宽度和深度,两者不匹配的话就 会读不 出数据
2、添加.mif文件的地址需要注意,如果碰到读不出数据,首先检查一下添加地址是否正确
————————————————
版权声明:本文为CSDN博主「llllllchang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38492080/article/details/78558976 |
|