嵌入式ROM核的调用

Posted noticeable

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式ROM核的调用相关的知识,希望对你有一定的参考价值。

本次设计的工具和源码在:http://download.csdn.net/detail/noticeable/9914766

 

课程目的:调用quartus II提供的rom(read only memory)进行系统项目设计

 

实验现象:将一组固定的波形数据以MIF的格式存储于fpga中使用IP核构建的片上ROM中,开发板上电后,系统从ROM 中读取数据,并将数据通过I/O口输出,使用signal TAP II取I/O口输出的数据,即可得到三角波形;并通过quartus II提供的in system memory content editor 工具在线更改ROM 中的数据,然后再次通过signal TAP II将更改后的波形读取出来。

 

 

 知识点:1、mif文件的生成方法2、ROM IP核的使用。3、In-system memory content editor 内存查看工具的使用。4、signalTap II 调试工具的简单使用

 

 

开发流程:

首先,自己创建对应波形的mif文件,以便后面调用rom IP核的时候使用

可以自己创建一个文本,然后在文件中输入自己想自己想要显示的波形的数据再保存,但是这样设计使得设计过于繁琐,这里推荐使用软件mif_maker2010直接生成.mif文件(软件在源码压缩包中)

打开软件

设置全局参数

本次设计为256个数据长度8位位宽

选择期望生成的波形,保存即可得到相应波形对应参数的mif文件。

 

 

新建工程,调用rom ip核

 

 

 之后直接next到finish即完成生成rom文件了。

将IP核设置为顶层文件

然后编写IP核的testbench文件

`timescale 1ns/1ns
`define clock_period 20
                module rom_tb;
                reg [7:0]addr;
                reg clk;
                wire [7:0]q;
                        rom        rom (
                                                .address(addr),
                                                .clock(clk),
                                                .q(q));
                    initial clk=1;
                    always#(`clock_period/2)
                    clk=~clk;
                
                integer i;
                    initial 
                    begin 
                    addr=0;
                    for(i=0;i<=2550;i=i+1)begin
                    #`clock_period;
                    addr=addr+1;
                    end
                    #(`clock_period*50);
                    $stop;
                    end 
                    
                    
                    


endmodule 

设定仿真路径进行仿真,可以看到q成功的将mif文件提取出来了,并通过仿真加强对romIP核的理解

 

 选中q,右键修改显示格式,即可看到仿真出来的模拟的锯齿波形。

 

 将mif未见改为正弦波的mif文件观察

此时发现波形有断层

这是因为选择的显示格式为无符号的,将格式改为有符号的即可

 

 在这里,波形发生器的仿真设计已经完成了(对于控制频率,其实就是一个控制地址变化的方式)。

 

新建一个rom_top文件,将其设置为顶层文件,其目的是设计地址发生模块:

module rom_top(clk,
                                        rst_n,
                                        q
                                        );
                    
                input clk;
                input rst_n;
                output [7:0]q;
                reg [7:0]addr;
                rom        rom_1 (
                                                .address(addr),
                                                .clock(clk),
                                                .q(q));
                
                    always@(posedge clk or negedge rst_n)
                                    if(!rst_n)
                                    addr<=0;
                                    else 
                                    addr<=addr+1;
                
endmodule    

 

 

 

 

下面为了使in system memory content editor 工具在线修改ROM中的数据,需要对IP核进行设置

对引脚进行分配,其中q[0]~q[7]对应开发板上GOIP09~GPIO2

 

 全编译后,通过FPGA内部搭建一个片上的逻辑分析仪,抓取rom里的文件:

新建一个signal tap II  logic  analyzer file文件

 

 

 

 

保存在工程目录下

 

 

 将逻辑分析仪工具添加到工程文件夹中,对工程进行全编译

将工程生成的.sof文件下载到FPGA开发板中,进行板级验证,烧写完成后打开logic.stp文件

 

即可看到成功显示的正弦波波形了

下面通过in system memory content editor 工具对rom 内容进行更改

 

 可以看到signalTap II logic analyzer中显示的波形变为了锯齿波了。

至此,整个设计就完成了

以上是关于嵌入式ROM核的调用的主要内容,如果未能解决你的问题,请参考以下文章

FPGA教程案例5基于vivado核的ROM设计与实现

fpga中reg[7:0] mem[0:255]怎么赋初值,还有它与通过mif初始化的ROM有啥区别?

技术圈几个硬核的男人

嵌入ARM硬核的FPGA

嵌入式进阶必看!7个硬核的 C 语言要点

《嵌入式 - 嵌入式大杂烩》详解ROM和RAM