当前位置:   article > 正文

20210326FPGA学习笔记:运用vivado中rom的ip核生成正弦信号_fpga实现正弦输出

fpga实现正弦输出
  1. MATLAB中生成rom可以读的.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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

其中,.coe文件最终格式如下:
memory_initialization_radix=10;
memory_initialization_vector =
127,
129,
130,
132,

127;
(第一行表明数据进制类型,第二部分写数据向量,以,隔开,以;结尾)
数据:位宽8位,深度设置为2 * 2 ^ 8(尽量保证每个量化数据处都有一个点)。

  1. 配置vivado中rom的ip核
    任意打开一个project->
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
例化ip核的格式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

design:

`timescale 1ps / 1ps

module sin_test(
    input         clk,
    input         rst,
    output        sin_data
    );
    
    parameter   WD = 8;//bit width
    parameter   step = 9'd1;
    parameter   depth = 9'd511;
    wire [8:0] sin_data;
    
    reg [WD:0] address;//accumulator as address of rom
    always @(posedge clk or negedge rst)
        begin
            if(!rst) address = 9'd0;
            else if(address < depth) address = address + step;
            else address = 9'd0;
        end
    dist_mem_gen_0 rom1 (
      .a(address),  
      .clk(clk),  
      .spo(sin_data)  
    );
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

simulation:

`timescale 1ps / 1ps
module sin_sim();
    reg clk, rst;
    wire [8:0]sin_data;
    sin_test sin_1(clk, rst, sin_data);
    initial 
        begin
            clk = 1'b0;
            rst = 1'b1;
        end
    always
        #5 clk = ~clk;
    /*always @(rst)
        begin
            #5120 rst = 1'b0;
            #10 rst = 1'b1;
        end*/
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

仿真结果:
在这里插入图片描述
在这里插入图片描述

这里有个问题:刚开始时127数据会保持很多个周期,但是以后的周期中不会出现问题,在考虑是不是ip核内部设有延时的?欢迎评论!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/625475
推荐阅读
相关标签
  

闽ICP备14008679号