Vivado ROM仿真教程

本例程主要使用Vivado 调用ROM IP核,用含有正弦曲线的.coe文件初始化ROM,最终通过仿真实现波形的显示

一、首先建立工程
在这里插入图片描述
在这里插入图片描述

二、选择芯片的型号
我使用的是zynq7020
在这里插入图片描述
三、调用ROM IP核 这里选择Distributed Memory Generate
在这里插入图片描述

四、打开IP核,进行IP核设置
这里根据初始化文件内容选择所需要的深度和位宽,我们这里选用深度1024,因为文件中有900个数据,数据的宽度我们选择15位
这里根据初始化文件内容选择所需要的深度和位宽,我们这里选用深度1024,因为文件中有900个数据,数据的宽度我们选择15位
在这里插入图片描述
在这里插入图片描述
这里将准备好的.coe文件加入ROM中,.coe用我上个博客里面的程序生成https://blog.csdn.net/weixin_39578861/article/details/89646035
在这里插入图片描述
生成IP核
五、添加程序
在这里插入图片描述
在这里插入图片描述
代码:

`timescale 1ps / 1ps

module sin_lut(
    input         sclk,
    input         rst_n,
    output        q_out
    );
    
    parameter   DW = 15;
    parameter   AW = 10;
    parameter   ADDR_MAX = 900;
    
    parameter   CONST_HALF_PI = ADDR_MAX - 1;
    parameter   CONST_PI      = ADDR_MAX * 2 - 1;
    parameter   CONST_DOUBLE_PI = ADDR_MAX * 4 - 1;
    
    reg     [AW-1:0]  address;
    wire     [DW-1:0]  data;
    wire     [DW-1:0]  q_data;
    wire     [DW-1:0] q_out;
    
    reg     [AW+2-1:0]  address_tmp;
    reg     [DW+1-1:0]  data_tmp;
    
    dist_mem_gen_0 rom1 (
      .a(address),      // input wire [9 : 0] a
      .clk(sclk),  // input wire clk
      .spo(data)  // output wire [13 : 0] spo
    );
    
    always @ (posedge sclk or negedge rst_n) 
        if(!rst_n) 
           address_tmp <= {AW+2{1'b0}}; 
        else if(address_tmp == CONST_DOUBLE_PI)
           address_tmp <= {AW+2{1'b0}};
        else
            address_tmp <= address_tmp + 1;
             
    always @ (posedge sclk or negedge rst_n)
        if(!rst_n) 
            address <= {AW{1'b0}};
        else if(address_tmp <= CONST_HALF_PI)
                address <= address_tmp[AW-1:0];
        else if(address_tmp <= CONST_PI)
                address <= CONST_PI - address_tmp;
        else if(address_tmp <= (CONST_PI + CONST_HALF_PI))
                address <= address_tmp - CONST_PI;
        else if(address_tmp <= CONST_DOUBLE_PI)
                address <= CONST_DOUBLE_PI - address_tmp;
        
        
      always @ (posedge sclk or negedge rst_n)
            if(!rst_n)
                data_tmp <= 1'b0;
            else if(address_tmp <= CONST_PI)
                data_tmp <= {1'b0,data};
            else if(address_tmp <= CONST_DOUBLE_PI)
                data_tmp <= {DW+2-1{1'b0}} - {1'b0,data};
                
      assign q_out = data_tmp[DW-1:0];
endmodule

ROM例化文件的方法:点击IP Sources 按照如图所示即可
在这里插入图片描述
六、测试文件:
在这里插入图片描述
在这里插入图片描述
代码

`timescale 1ps / 1ps

module sin_tb;
    parameter   DW = 15;
    reg         sclk;
    reg         rst_n;
    wire    [DW-1:0]     q_data;
    
    initial begin
        #50 sclk <= 1'b0;
        #50 rst_n <= 1'b0;
        #50 rst_n <= 1'b1;
    end
    
    always #50 sclk = ~sclk;
    
    sin_lut  sin( 
        .sclk(sclk),
        .rst_n(rst_n),
        .q_out(q_data)
    );
    
endmodule

七、仿真波形
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Vado ROM IP核是一种在Xilinx Vivado开发环境中使用的IP核,用于实现只读存储器(ROM)功能。ROM IP核可以从事先存储的数据中读取信息,并在设计中使用这些数据。该IP核可以配置为具有不同的位宽和深度,以满足设计需求。例如,可以使用MATLAB生成的coe文件作为输入,其中包含了不同波形(正弦、方波、三角波)和组合采样文件的数据。 在使用Vivado进行ROM IP核设计时,您需要编写仿真文件,其中定义了时钟、复位和数据地址信号,并将ROM IP核实例化到仿真设计中。通过仿真文件的代码,您可以验证ROM IP核的功能和正确性。 下面是一个关于如何使用Vivado ROM IP核的例子,其中包含了时钟、复位和数据地址信号的定义,并将ROM IP核实例化到仿真设计中: ```verilog `timescale 1ns / 1ps module tb_rom(); reg sys_clk; reg sys_rst_n; reg [7:0 addra; wire [7:0 douta; // Initialize sys_clk initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; #20; sys_rst_n <= 1'b1; end // Change sys_clk always #10 sys_clk = ~sys_clk; // Increment addra always @(posedge sys_clk or negedge sys_rst_n) begin if (sys_rst_n == 1'b0) begin addra <= 8'b0; end else if (addra == 8'd255) begin addra <= 8'b0; end else begin addra <= addra + 1'b1; end end // Instantiate ROM IP核 rom tb_rom( .addra(addra), .douta(douta), .sys_clk(sys_clk) ); endmodule ``` 这是一个简单的仿真文件示例,其中定义了sys_clk时钟信号、sys_rst_n复位信号和addra数据地址信号,并将这些信号与ROM IP核实例中的相应端口连接起来。通过仿真文件,您可以验证ROM IP核在仿真级别中的功能和行为。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值