MATLAB生成.coe文件并用ROM输出仿真

rom可读.coe文件,我们想要把波形存储到ROM中就要用MATLAB生产.coe文件,以下是代码。

clc;
clear all;
close all;

width = 8;   %位宽
depth = 2 ^ 8 * 2; %深度(采样点个数)
x = linspace(0, 2 * pi, depth);
y = sin(x);
y = round(y * (2 ^ (width - 1) - 1) + 2 ^ (width - 1) - 1);%量化
plot(y);

fid = fopen('dds_sin.coe','w');
fprintf(fid,'memory_initialization_radix=10;\n');
fprintf(fid,'memory_initialization_vector =\n');
fprintf(fid, '%d,\n', y);

fclose(fid);

用Matlab运行上面的代码以后会在与这个.m文件相同的目录下产生一个.coe文件,这个.coe文件可以导入到ROM中。

(17条消息) 20210326FPGA学习笔记:运用vivado中rom的ip核生成正弦信号_acmgotoac的博客-CSDN博客

以三个不同频率相位的正弦波为例 

 之后设置IP核我们用DBG就可以

这里ROM有一个数据位,要比MATLAB中多一位,深度就是采样点个数。

 

 

选电脑最大线程生成全局IP

之后就是程序设计

`timescale 1ps / 1ps


module many_sin(
    input         clk,
    input         rst,
    output        sin_data
    );
    
    parameter   WD = 9;//bit width
    parameter   step = 9'd1;
    parameter   depth = 10'd1023;
    wire [8:0] sin_data;
    
    reg [9:0] address;//accumulator as address of rom      512=2^9
    always @(posedge clk or negedge rst)begin
            if(!rst) 
                address = 10'd0;
            else if(address < depth) 
                address = address + step;
            else 
                address = 10'd0;
        end
    dist_mem_gen_0 rom1 (
      .a(address),  
      .clk(clk),  
      .spo(sin_data)  
    );
endmodule

tb

`timescale 1ps / 1ps


module tb_many_sin();
    reg               clk;
    reg               rst;
    wire  [8:0]  sin_data;
    
    always # 5 clk=~clk;
    
    initial begin
        clk=1'b0;
        rst=1'b0;
        #200
        rst=1'b1;
    end
    
    many_sin u_many_sin(
    .clk      (clk),  
    .rst      (rst), 
    .sin_data (sin_data)   
    );
    
endmodule

然后进行仿真测试,选如下 

 

 有比较大的失真,虽然能看出一些来。。猜测是采样不够多,然后ROM深度设置。

之后我们采样率拉高

 这里有一段小于0的波形会一直在上面?

过了一天排除了很多原因其实就只是自己设计的波形位宽的问题。。。。3个8位的相加有10位啊,然后ROM里设11位就可以。。

 

 中秋快乐!

  • 7
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值