芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 2816|回复: 0

【智多晶FPGA-036】【开发流程】IP调用之ROM

[复制链接]
  • TA的每日心情
    开心
    2022-5-11 16:38
  • 24

    主题

    25

    帖子

    163

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    163
    发表于 2022-4-25 19:25:25 | 显示全部楼层 |阅读模式
    1、建立工程ROM测试工程
    新建一个工程“ROM_test”,在【IP管理】->【IP Creator】->[SP_ROM]添加ROM到工程。

    1.png

    在配置栏我们可以对ROM进行设置,通过设置地址位宽确定地址深度,设置数据位宽。配置时要注意输出延迟,打钩“使用输出寄存器”,则读延迟=2,否则为1,我们进行默认设置,不勾选“使用输出寄存器”。初始化文件的格式为“*.mem”,需存储16进制,以列模式存储。在设置初始化文件时我们设置一个十六进制“0、1...->...7C、7D、7F、7F、7D...->...2、1、0”的数组进行列排列存储。我们可以在“Notepad++”进行操作,选择空白的127行alt+c插入数字,初始值、增量、重复次数都填1,选择十六进制
    随后再逆序排列加复制就排列好了
    排列好数组,另存文件为“rom_test.mem”,添加到我们的工程目录下。

    image.png

    在RAM初始化文件添加我们的“rom_test.mem”文件,初始化文件设置为十六进制。

    image.png

    配置好ROM后生成IP文件。

    2、设计ROM仿真文件
    设计仿真文件读取ROM中的数据,在进行计数时使能OClockEn,开始配置Address 读取ROM中初始化文件信息。

    [C#] 纯文本查看 复制代码
    `timescale 1ns/1ns
    `define CLK_PERIOD 40
    
    module rom_tb;
    
            xsGSR xsGSR_INST(.GSR(1'b1));
            xsPWR xsPWR_INST(.PUR(1'b1));
    
            reg clk;
            reg [7:0]Address;
            reg Reset;
            reg OClockEn;
    
            integer i = 0;
    
            initial clk = 1;
            always #(`CLK_PERIOD/2) clk = ~clk;
            
            wire [7:0]Q;
             
            SP_ROM SP_ROM(
                    .OClock(clk),
                    .OClockEn(OClockEn),
                    .Reset(Reset),  
                    .Address(Address),
                    .Q(Q)
            );
    
            initial begin
                    Reset = 1;
                    Address = 0;
    OClockEn = 0;
                    #201;
                    Reset =0;
                    Address = 0;
                    #201;
                    for(i=0;i<2048;i=i+1)begin
                            #`CLK_PERIOD;
                            OClockEn = 1;
                            Address = Address + 1'b1;
                    end
    OClockEn = 0;
                    #(`CLK_PERIOD * 50);
                    $stop;
            end
    endmodule


    创建Modelsim仿真工程以“ROM_tb”为顶层并命名创建仿真配置文件。

    image.png

    进行波形加载,当前版本Modelsim的信号颜色默认设置有些偏暗,我们可以进行手动设置,以方便我们进行信号观察。在主页窗口,依次进入【Tool】->【Edit Preferences...】

    image.png

    点击【By Window】->【Wave Windows】,对颜色较暗的【LOGIC_0】、【LOGIC_1】进行修改

    image.png

    在仿真波形窗口观察到,在OclockEn有效后写入地址信息读取到初始化文件内容

    image.png

    进行模拟观察得到一组最小值为“0”最大值为“7F”的三角波。

    image.png

    3、设计ROM_test测试及仿真文件
    我们设计一个顶层模块读取ROM,设计代码如下。芯片上电无法自动复位,我们设计通过计数进行复位,在使用到PLL的工程中也可以使用“Lock”进行复位。

    [C#] 纯文本查看 复制代码
    `timescale 1ns/1ns
    module ROM_test(
            clk,
            Rst_n,
            led,
            Q
    );
    
            input clk;
            input Rst_n;
            output [15:0]Q;
            output led;
            
            reg [8:0]Address;
            reg OClockEn;
            wire Reset;
    
            reg [11:0]i;
             
            SP_ROM SP_ROM(
                    .OClock(clk), 
                    .OClockEn(OClockEn),
                    .Reset(Reset), 
                    .Address(Address),
                    .Q(Q)
            );
     
            reg [15:0]Reset_cnt = 0;
            reg Reset_n;
    
            //开发板上电无法自动复位,通过计数进行复位
            always@(posedge clk)
            if(Reset_cnt >= 12_499)
                    Reset_n <= #1 Rst_n;
            else begin
                    Reset_cnt <= #1 Reset_cnt + 1;
                    Reset_n <= #1 0;
            end
            
            assign led = Reset_n;
            assign Reset = !Reset_n;
     
            always@(posedge clk or negedge Reset_n)
            if(!Reset_n)begin
                    Address <= #1 9'd0;
                    OClockEn <= #1 1'd0;
                    i <= #1 12'd0;
            end
            else if(i<=2048)begin
                    i <= #1 i+1;
                    OClockEn <= #1 1;
                    Address <= #1 Address + 1'b1;
            end
            else begin
                    Address <= #1 9'd0;
                    OClockEn <= #1 1'd0;
                    i <= #1 12'd0;
            end
    
    endmodule
    

                   
    也为“ROM_test”设计仿真文件“ROM_test_tb”并仿真。

    [C#] 纯文本查看 复制代码
    `timescale 1ns/1ns
    `define CLK_PERIOD 40
    
    module ROM_test_tb;
    
            xsGSR xsGSR_INST(.GSR(1'b1));
            xsPWR xsPWR_INST(.PUR(1'b1));
    
            reg clk;
            reg Rst_n;
    
     
            initial clk = 1;
            always #(`CLK_PERIOD/2) clk = ~clk;
            
            wire [7:0]Q;
            wire led;
             
            
            ROM_test ROM_test(
            .clk(clk),
            .Rst_n(Rst_n),
            .led(led),
            .Q(Q)
            );
     
            initial begin
                    Rst_n = 1'b0;
                    #(`CLK_PERIOD * 20 + 1);
                    Rst_n = 1'b1;
                    #(`CLK_PERIOD * 2000);
                    $stop;
            end
    
    endmodule


    在Moldesim中添加“ROM_test”及“ROM_test_tb”文件,以“ROM_test_tb”为顶层新建一个仿真配置文件。

    image.png

    运行仿真,显示模拟波形,得到与前面进行“ROM_tb”相同的模拟三角波。

    image.png

    下面我们更改ROM初始化文件进行仿真观察。下面仿真正弦波,使用 Sin3e 软件生成一个正弦波的初始化文件,Sin3e软件附在工程源码中。

    image.png

    打开Mif精灵,Mif精灵可用以生成Altera、Xilinx的Mif文件,对生成文件进行简单修改也可以得到智多晶FPGA使用的mem文件。

    image.png

    我们依次进行设置,选择【Xilinx】->数据深度【Depth】为512位->设置数据量宽度【Width】为9->格式【Radix为hex格式->【Maxi】设置为511不能设置到512->输出【Type】为sine wave,点击【OK】,生成文件如下。

    image.png

    打开文件

    image.png

    我们只保留波形数据文件,删除信息和所有符号,保存文件后修改文件格式为“*mem”,保存在工程目录下,以此初始化ROM。
    我们进入工程,重新设置数据位宽为16位,重新添加初始化文件并更新IP,如果读者在IP管理页更新IP要注意保存IP目录与原目录一致。

    image.png

    重新运行仿真,得到正弦波模拟波形,这里波形加载范围超出信号观察范围,我们重新设置加载模拟数据波形等待片刻即可显示正常。



    也可以右键点击进入【Properties...】修改波形的数据范围,调整波形最大幅度。在数据理论幅值偏大而实际采样数据幅值偏小的情况下,设置模拟波形范围可以帮助我们更好的分析数据。

    image.png

    波形重新显示正常。

    image.png


    工程源码。

    ROM_test.zip (1017.95 KB, 下载次数: 208)

    更多智多晶FPGA相关资料,请查看下述汇总贴
    【智多晶FPGA-001】小梅哥智多晶FPGA产品使用自助服务手册










    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-4-26 07:50 , Processed in 0.116936 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

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