关于使用FPGA实现sin波形并读取ROM值得问题

来源:互联网 发布:adb删除数据库 编辑:程序博客网 时间:2024/05/29 17:09

在使用FPGA实现sin波形的时候采用查找表法比较简单,也就是读取ROM表的值,具体的步骤如下:

1、第一步是需要在ROM中添加初始化数据,创建.mif文件,采用matlab来实现。matlab代码如下:

width=12; %宽度是depth=4096; %深度是1024n=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 BEGIN0 : 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;endassign phase=cnt;endmodule 

4、编写testbench

`timescale 1 ns/1 nsmodule 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;endinitial    begin   clk=0;  forever #5 clk=~clk;endendmodule 


5、运行modelsim
设置modelsim模式为示波器模式,数据格式设置为无符号类型
Radix——unsigned
Format——Analog(automatic)
这样就得到要显示的波形啦!

6、通过设置设置地址的步进长度可以得到不同周期的正弦波,同时创建不同波形的.mif文件,同样可以通过按键得到不同的相应的波形,制作一个简易的波形发生器。
需要注意的就两点:1、.mif文件中数据的宽度和深度,然后还有创建的ROM的数据宽度和深度,两者不匹配的话就 会读不                              出数据
                      2、添加.mif文件的地址需要注意,如果碰到读不出数据,首先检查一下添加地址是否正确


















 
阅读全文
0 0