关于使用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
- 关于使用FPGA实现sin波形并读取ROM值得问题
- FPGA基础实验:用计数器读取ROM数据产生信号波形(直接数字频率合成DDS)
- C# 实现wav 文件读取并绘制波形图
- FPGA作业3:ROM的读取
- 读取播放wav文件并显示波形
- matlab 读取音频并显示波形
- 使用 For 循环的自动索引功能创建数组y1=sin(x/10)和y2=cos(x/10),(x=0-99),并分别用一个波形图和一个波形图表来进行显示。
- FPGA实现基于ROM的正弦波发生器
- FPGA笔记(九)-实现ROM步骤
- 基于FPGA PLL锁相环实现及示波器波形失真分析
- DS18B20多ROM搜索并读取温度
- C中关于sin(),cos(),pow()函数使用的一个问题
- 关于FPGA加密问题
- Python 读取WAV文件并绘制波形图
- java 读取.wav文件(波形文件)并绘制波形图例子
- 关于c#实现计算机音频接口输出固定频率波形的一些问题
- ROM 之 任意波形发生器
- 关于值得传递问题
- 文件路径操作
- 修改Android Studio Build生成apk的默认名称
- NOIP2017总结
- 1075. 链表元素分类(25)
- c的回调函数与java中抽象函数,接口函数,抽象类简单理解
- 关于使用FPGA实现sin波形并读取ROM值得问题
- ElasticSearch5.6.3 安装步骤
- 【机器学习实验】使用朴素贝叶斯进行文本的分类
- 使用Kotlin进行服务器端开发
- redis的持久化存储
- Fiddler系列教程3:使用Fiddler录制Jmeter性能测试脚本
- linux telnet服务
- 回调函数理解的文章
- Python垃圾回收机制