当前位置:   article > 正文

Quartus ROM IP核的使用

quartus rom

ROM简介
ROM(read only memory)中的数据需要先进行初始化,即要先将数据写入到 ROM 内部的存储单元中;然后系统正常工作时,只能读出其中存储的数据。而不能写入信息。掉电不丢失。
在 FPGA 中,ROM 常 用于存放初始数据。

IP核的配置

思想与Vivado ROM IP核的配置一样。
主要有:
How wide should the ‘q’ output bus be?:用于指定输出端口的位宽,默认值为 8;
z How many 8-bit words of memory?:用于指定存储器的深度,默认值为 256;
q output port:用于选择是否寄存输出端口 q,默认值为选择。
Do you want to specify the initial content of the memory?:用于指定存储器的初始存储数据内容,我们需要为存储器提供存储器初始化文件(.mif)或者 Inter 格式的 16 进制文件(.hex)。
该 IP 核能生成的所有文件中,ROM_inst.v 是我们 ROM 初始化模板。

mif文件的创建

用记事本打开,可以看到.mif的格式
在这里插入图片描述
最后有个end

  1. 利用 Quartus II 软件自带的 mif 编辑器生成 mif 文件:对于小容量的 ROM,我们可以快速方便的完成 mif 文件的编辑工作
    【File】→【new】,在弹出的对话框中,我们选择【Memory Initialization file】点击打开
    在这里插入图片描述
    在这里插入图片描述

  2. 利用 C 语言、Matlab 或者一些实用的软件工具生成 mif 文件

仿真

testbench

`timescale 1 ps/ 1 ps
module Verilog_Ip_ROM_vlg_tst();
reg CLK_50M;
reg RST_N;
reg [4:0] address;
reg [4:0] address_n;                                     
wire [7:0]  readdata;
                 
Verilog_Ip_ROM i1 ( 
	.CLK_50M(CLK_50M),
	.RST_N(RST_N),
	.address(address),
	.readdata(readdata)
);
initial                                                
begin                                                  
	CLK_50M = 0;
	RST_N = 0;
	#10 RST_N = 1;
	#1000000 $stop;
end                                                    
always #10000 CLK_50M = ~CLK_50M;  

always @ (negedge CLK_50M or negedge RST_N)
begin
	if(!RST_N)
		address <= 1'b0;
	else
		address <= address_n;
end    
always @ (*)
begin
	if(address == 5'd31)
		address_n = 1'b0;
	else
		address_n = address + 1'b1;
end
                                                   
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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

仿真结果:

  1. address的生成是在下降沿,ROM IP读取地址输出数据工作在上升沿,所以会有半个时钟的延迟。但是在 30ns 的时候读取了 1 地址,紧接着就在后面就输出了 01 数据,在 50ns 的时候读取了 2 地址,紧接着在后面就输出了 02 数据。即读取地址和输出数据没延时。
    在这里插入图片描述
  2. 30ns,ROM IP 核读取了 1 地址,然后紧着在一个时钟之后,˿就是 50ns 的时候输出了 01 数据。这是因为我们在 Regs/Clken/Aclrs 配置页面设置了 q output port为寄存器输出。
    在这里插入图片描述
  3. 如果把address的控制时钟改成上升沿,data与address有一个clk的延迟。可能是因为上升沿到来时,读取address旧值,上升沿结束时才更新address的值。
    在这里插入图片描述

在这里插入图片描述

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

闽ICP备14008679号