集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 891|回复: 2

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

[复制链接]
dameihuaxia 发表于 2022-9-1 16:42:50 | 显示全部楼层 |阅读模式
在使用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
LYF 发表于 2022-9-1 18:00:50 | 显示全部楼层
关于使用FPGA实现sin波形并读取ROM值得问题
http://www.fpgaw.com/forum.php?m ... 6&fromuid=59610
(出处: fpga论坛|fpga设计论坛)
宇xx 发表于 2022-9-2 09:03:15 | 显示全部楼层
关于使用FPGA实现sin波形并读取ROM值得问题
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-7 02:23 , Processed in 0.065815 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表