IP核ROM调用及验证

前言

        只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。ROM所存数据稳定 ,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。 

        ROM是"Read-Only Memory"的缩写,意为只读存储器。这是一种存储介质,一旦数据被写入ROM后,就无法被改变或者删除,除非使用特殊的硬件或软件工具进行擦除或重新编程。ROM通常用于存储计算机的基本输入输出系统(BIOS)、微控制器的程序、电子游戏机的游戏等。

        在智能手机领域,ROM也可以指设备的内部存储空间,这部分空间通常预装了操作系统和一些预装的应用程序。但是,随着Android系统的更新,ROM一词也被用来指代设备的固件,即操作系统和预装软件的集合,这一点在定制ROM和Rooting(解锁手机,获得超级用户权限)的社区中尤其常见。定制ROM通常是指由第三方开发者基于原始设备制造商(OEM)发布的固件源代码修改而来的操作系统,它们可能会包含不同的功能和用户界面。

正文

一、 IP核ROM调用及验证

        1.项目需求

        ROM为只读存储器,只能从存储器中读取数据,在应用时需要先将存储的数据文件添加到ip核中,一般应用的存储文件分为:mif文件,hex文件。需要通过地址将数据读取出来,也就是说存储的数据个数确定了存储器的地址个数,是一一对应关系。

        因为是只读存储器,里面的数据需要提前写入,这里我们使用波形数据生成器

配置一个正弦波

保存到prj文件夹下为.mif类型文件,下面是mif文件里面的数据

DEPTH = 512;
WIDTH = 8;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT 
	BEGIN
0000 : 0080;
0001 : 0081;
0002 : 0083;
0003 : 0084;
0004 : 0086;
0005 : 0087;
0006 : 0089;
0007 : 008A;
0008 : 008C;
0009 : 008E;
000A : 008F;
000B : 0091;
000C : 0092;
000D : 0094;
000E : 0095;
000F : 0097;
0010 : 0098;
0011 : 009A;
0012 : 009B;
0013 : 009D;
0014 : 009E;
0015 : 00A0;
0016 : 00A2;
0017 : 00A3;
0018 : 00A5;
0019 : 00A6;
001A : 00A7;
001B : 00A9;
001C : 00AA;
001D : 00AC;
001E : 00AD;
001F : 00AF;
0020 : 00B0;
0021 : 00B2;
0022 : 00B3;
0023 : 00B5;
0024 : 00B6;
0025 : 00B7;
0026 : 00B9;
0027 : 00BA;
0028 : 00BC;
0029 : 00BD;
002A : 00BE;
002B : 00C0;
002C : 00C1;
002D : 00C2;
002E : 00C4;
002F : 00C5;
0030 : 00C6;
0031 : 00C8;
0032 : 00C9;
0033 : 00CA;
0034 : 00CB;
0035 : 00CD;
0036 : 00CE;
0037 : 00CF;
0038 : 00D0;
0039 : 00D2;
003A : 00D3;
003B : 00D4;
003C : 00D5;
003D : 00D6;
003E : 00D7;
003F : 00D9;
0040 : 00DA;
0041 : 00DB;
0042 : 00DC;
0043 : 00DD;
0044 : 00DE;
0045 : 00DF;
0046 : 00E0;
0047 : 00E1;
0048 : 00E2;
0049 : 00E3;
004A : 00E4;
004B : 00E5;
004C : 00E6;
004D : 00E7;
004E : 00E8;
004F : 00E9;
0050 : 00EA;
0051 : 00EA;
0052 : 00EB;
0053 : 00EC;
0054 : 00ED;
0055 : 00EE;
0056 : 00EE;
0057 : 00EF;
0058 : 00F0;
0059 : 00F1;
005A : 00F1;
005B : 00F2;
005C : 00F3;
005D : 00F3;
005E : 00F4;
005F : 00F5;
0060 : 00F5;
0061 : 00F6;
0062 : 00F6;
0063 : 00F7;
0064 : 00F8;
0065 : 00F8;
0066 : 00F9;
0067 : 00F9;
0068 : 00FA;
0069 : 00FA;
006A : 00FA;
006B : 00FB;
006C : 00FB;
006D : 00FC;
006E : 00FC;
006F : 00FC;
0070 : 00FD;
0071 : 00FD;
0072 : 00FD;
0073 : 00FD;
0074 : 00FE;
0075 : 00FE;
0076 : 00FE;
0077 : 00FE;
0078 : 00FE;
0079 : 00FF;
007A : 00FF;
007B : 00FF;
007C : 00FF;
007D : 00FF;
007E : 00FF;
007F : 00FF;
0080 : 00FF;
0081 : 00FF;
0082 : 00FF;
0083 : 00FF;
0084 : 00FF;
0085 : 00FF;
0086 : 00FF;
0087 : 00FF;
0088 : 00FE;
0089 : 00FE;
008A : 00FE;
008B : 00FE;
008C : 00FE;
008D : 00FD;
008E : 00FD;
008F : 00FD;
0090 : 00FD;
0091 : 00FC;
0092 : 00FC;
0093 : 00FC;
0094 : 00FB;
0095 : 00FB;
0096 : 00FA;
0097 : 00FA;
0098 : 00FA;
0099 : 00F9;
009A : 00F9;
009B : 00F8;
009C : 00F8;
009D : 00F7;
009E : 00F6;
009F : 00F6;
00A0 : 00F5;
00A1 : 00F5;
00A2 : 00F4;
00A3 : 00F3;
00A4 : 00F3;
00A5 : 00F2;
00A6 : 00F1;
00A7 : 00F1;
00A8 : 00F0;
00A9 : 00EF;
00AA : 00EE;
00AB : 00EE;
00AC : 00ED;
00AD : 00EC;
00AE : 00EB;
00AF : 00EA;
00B0 : 00EA;
00B1 : 00E9;
00B2 : 00E8;
00B3 : 00E7;
00B4 : 00E6;
00B5 : 00E5;
00B6 : 00E4;
00B7 : 00E3;
00B8 : 00E2;
00B9 : 00E1;
00BA : 00E0;
00BB : 00DF;
00BC : 00DE;
00BD : 00DD;
00BE : 00DC;
00BF : 00DB;
00C0 : 00DA;
00C1 : 00D9;
00C2 : 00D7;
00C3 : 00D6;
00C4 : 00D5;
00C5 : 00D4;
00C6 : 00D3;
00C7 : 00D2;
00C8 : 00D0;
00C9 : 00CF;
00CA : 00CE;
00CB : 00CD;
00CC : 00CB;
00CD : 00CA;
00CE : 00C9;
00CF : 00C8;
00D0 : 00C6;
00D1 : 00C5;
00D2 : 00C4;
00D3 : 00C2;
00D4 : 00C1;
00D5 : 00C0;
00D6 : 00BE;
00D7 : 00BD;
00D8 : 00BC;
00D9 : 00BA;
00DA : 00B9;
00DB : 00B7;
00DC : 00B6;
00DD : 00B5;
00DE : 00B3;
00DF : 00B2;
00E0 : 00B0;
00E1 : 00AF;
00E2 : 00AD;
00E3 : 00AC;
00E4 : 00AA;
00E5 : 00A9;
00E6 : 00A7;
00E7 : 00A6;
00E8 : 00A5;
00E9 : 00A3;
00EA : 00A2;
00EB : 00A0;
00EC : 009E;
00ED : 009D;
00EE : 009B;
00EF : 009A;
00F0 : 0098;
00F1 : 0097;
00F2 : 0095;
00F3 : 0094;
00F4 : 0092;
00F5 : 0091;
00F6 : 008F;
00F7 : 008E;
00F8 : 008C;
00F9 : 008A;
00FA : 0089;
00FB : 0087;
00FC : 0086;
00FD : 0084;
00FE : 0083;
00FF : 0081;
0100 : 007F;
0101 : 007E;
0102 : 007C;
0103 : 007B;
0104 : 0079;
0105 : 0078;
0106 : 0076;
0107 : 0075;
0108 : 0073;
0109 : 0071;
010A : 0070;
010B : 006E;
010C : 006D;
010D : 006B;
010E : 006A;
010F : 0068;
0110 : 0067;
0111 : 0065;
0112 : 0064;
0113 : 0062;
0114 : 0061;
0115 : 005F;
0116 : 005D;
0117 : 005C;
0118 : 005A;
0119 : 0059;
011A : 0058;
011B : 0056;
011C : 0055;
011D : 0053;
011E : 0052;
011F : 0050;
0120 : 004F;
0121 : 004D;
0122 : 004C;
0123 : 004A;
0124 : 0049;
0125 : 0048;
0126 : 0046;
0127 : 0045;
0128 : 0043;
0129 : 0042;
012A : 0041;
012B : 003F;
012C : 003E;
012D : 003D;
012E : 003B;
012F : 003A;
0130 : 0039;
0131 : 0037;
0132 : 0036;
0133 : 0035;
0134 : 0034;
0135 : 0032;
0136 : 0031;
0137 : 0030;
0138 : 002F;
0139 : 002D;
013A : 002C;
013B : 002B;
013C : 002A;
013D : 0029;
013E : 0028;
013F : 0026;
0140 : 0025;
0141 : 0024;
0142 : 0023;
0143 : 0022;
0144 : 0021;
0145 : 0020;
0146 : 001F;
0147 : 001E;
0148 : 001D;
0149 : 001C;
014A : 001B;
014B : 001A;
014C : 0019;
014D : 0018;
014E : 0017;
014F : 0016;
0150 : 0015;
0151 : 0015;
0152 : 0014;
0153 : 0013;
0154 : 0012;
0155 : 0011;
0156 : 0011;
0157 : 0010;
0158 : 000F;
0159 : 000E;
015A : 000E;
015B : 000D;
015C : 000C;
015D : 000C;
015E : 000B;
015F : 000A;
0160 : 000A;
0161 : 0009;
0162 : 0009;
0163 : 0008;
0164 : 0007;
0165 : 0007;
0166 : 0006;
0167 : 0006;
0168 : 0005;
0169 : 0005;
016A : 0005;
016B : 0004;
016C : 0004;
016D : 0003;
016E : 0003;
016F : 0003;
0170 : 0002;
0171 : 0002;
0172 : 0002;
0173 : 0002;
0174 : 0001;
0175 : 0001;
0176 : 0001;
0177 : 0001;
0178 : 0001;
0179 : 0000;
017A : 0000;
017B : 0000;
017C : 0000;
017D : 0000;
017E : 0000;
017F : 0000;
0180 : 0000;
0181 : 0000;
0182 : 0000;
0183 : 0000;
0184 : 0000;
0185 : 0000;
0186 : 0000;
0187 : 0000;
0188 : 0001;
0189 : 0001;
018A : 0001;
018B : 0001;
018C : 0001;
018D : 0002;
018E : 0002;
018F : 0002;
0190 : 0002;
0191 : 0003;
0192 : 0003;
0193 : 0003;
0194 : 0004;
0195 : 0004;
0196 : 0005;
0197 : 0005;
0198 : 0005;
0199 : 0006;
019A : 0006;
019B : 0007;
019C : 0007;
019D : 0008;
019E : 0009;
019F : 0009;
01A0 : 000A;
01A1 : 000A;
01A2 : 000B;
01A3 : 000C;
01A4 : 000C;
01A5 : 000D;
01A6 : 000E;
01A7 : 000E;
01A8 : 000F;
01A9 : 0010;
01AA : 0011;
01AB : 0011;
01AC : 0012;
01AD : 0013;
01AE : 0014;
01AF : 0015;
01B0 : 0015;
01B1 : 0016;
01B2 : 0017;
01B3 : 0018;
01B4 : 0019;
01B5 : 001A;
01B6 : 001B;
01B7 : 001C;
01B8 : 001D;
01B9 : 001E;
01BA : 001F;
01BB : 0020;
01BC : 0021;
01BD : 0022;
01BE : 0023;
01BF : 0024;
01C0 : 0025;
01C1 : 0026;
01C2 : 0028;
01C3 : 0029;
01C4 : 002A;
01C5 : 002B;
01C6 : 002C;
01C7 : 002D;
01C8 : 002F;
01C9 : 0030;
01CA : 0031;
01CB : 0032;
01CC : 0034;
01CD : 0035;
01CE : 0036;
01CF : 0037;
01D0 : 0039;
01D1 : 003A;
01D2 : 003B;
01D3 : 003D;
01D4 : 003E;
01D5 : 003F;
01D6 : 0041;
01D7 : 0042;
01D8 : 0043;
01D9 : 0045;
01DA : 0046;
01DB : 0048;
01DC : 0049;
01DD : 004A;
01DE : 004C;
01DF : 004D;
01E0 : 004F;
01E1 : 0050;
01E2 : 0052;
01E3 : 0053;
01E4 : 0055;
01E5 : 0056;
01E6 : 0058;
01E7 : 0059;
01E8 : 005A;
01E9 : 005C;
01EA : 005D;
01EB : 005F;
01EC : 0061;
01ED : 0062;
01EE : 0064;
01EF : 0065;
01F0 : 0067;
01F1 : 0068;
01F2 : 006A;
01F3 : 006B;
01F4 : 006D;
01F5 : 006E;
01F6 : 0070;
01F7 : 0071;
01F8 : 0073;
01F9 : 0075;
01FA : 0076;
01FB : 0078;
01FC : 0079;
01FD : 007B;
01FE : 007C;
01FF : 007E;
END ;

        2.技术介绍

         调用ip核,在工具栏找到tools 点击其目录下megawizard plug-ln manager (创建ip核向导)勾选create a new custom ...      

点击next ,跳出一个新页面

上图左边installed plug ins目录下是该版本软件支持的ip核目录,本项目选择在IO目录下的ROM,后选择使用的语言,这里勾选verilog HDL ,路径放在prj文件夹下,(也可以在prj中新建ip文件夹),命名IP名字,这里用my_rom.

点击next,进入ip核配置界面,设置数据深度和宽度,选择读取的条件(一个时钟一次或多时钟控制)

点击next,该界面进行端口的配置,这里选择默认

点击next,进行数据初始化,勾选需要预留地址,点击browse...添加mif文件

添加完成后点击next,EDA界面保持不变,勾选生成文件中的my_rom_inst.v

点击finish,工程库中留下需要的文件,这里的几个.v文件都是后面添加的,新建完ip工作库目录下只留个my_rom.qip

        3.顶层架构

        addr模块进行IP核地址的切换,my_rom是调用的ip核

        4.端口描述

clk时钟
rst_n复位按键
wave数据读出

二、代码验证

        addr_ctrl模块:产生变化的地址,使用频率控制字fword来控制计数器的增量,从而生成一个地址信号。

module addr_ctrl(

	input clk,
	input rst_n,
	
	output  [7:0] addr//地址
);

reg [31:0] cnt;
parameter fword = 32'd8589930;//频率控制字,可以改变控制读取速度
parameter pword = 8'd64;

always @(posedge clk,negedge rst_n)
begin
	if(rst_n == 0)
		cnt <= 32'd0;
	else
		cnt <= cnt + fword;
//d0000000 + d8589930 = d8589930 = b0000 1000 0011 0001 0010 0110 1010
//d8589930 + d8589930 = d8589930 = b0001 0000 0110 0010 0100 1101 0100
//b0001 1000 1001 0011 0111 0011 1110
//b0010 0000 1100 0100 1001 1010 1000
//b0010 1000 1111 0101 1100 0001 0010

end 

assign addr = cnt[31:24] + pword;//每两个时钟后地址变化一次

endmodule 

        rom_apply模块:顶层连线

module rom_apply(

	input clk,
	input rst_n,
	
	output [7:0] wave
);

wire [8:0]wave_r;

wire [7:0] rom_addr;

addr_ctrl addr_ctrl_inst(

			.clk(clk),
			.rst_n(rst_n),
			
			.addr(rom_addr)
);

my_rom	my_rom_inst (
	.address ( rom_addr ),
	.clock ( clk ),
	.q ( wave )
	);

assign wave_r = {wave,1'b0};	
	
endmodule 

仿真文件

`timescale 1ns/1ps
module rom_apply_tb;

	reg clk;
	reg rst_n;
	
	wire [7:0] wave;

rom_apply rom_apply_inst(

			.clk(clk),
			.rst_n(rst_n),
			
			.wave(wave)
);

initial clk = 1;
always #10 clk = ~clk;

initial begin
	rst_n = 0;
	#200
	rst_n = 1;
	#20000
	$stop;
end 

endmodule 

三、仿真验证

        全局编译,运行仿真将输出数据改为模拟,编译没有输出数据或报错说找不到mif文件时,双击ip核

重新添加一遍.mif文件

重新编译,调出地址信号,观察输出

可以完整得将数据读出,打开.mif文件

可以看到正弦波的数据,对照输出数据,对照后没有缺失数据。

参考资料

只读存储器

ROM只读存储器

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张明阳.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值