单端口rom使用教程(一)

单端口rom使用教程(一)

1.rom的基本概念

ROM是只读存储器的缩写,存储的信息在制造时由厂家一次写入。只可以读取不可以写入,断电后也不会丢失信息。
在这里插入图片描述

  • ROM由存储矩阵,地址译码器和输出缓冲器组成。

  • 地址译码器将输入的地址码译成相应的控制信号,利用这个控制信号从存储矩阵中将指定的存储单元读出,把数据送到输出缓冲器

  • 输出缓冲器可提高存储器的负载能力,实现对输出状态的三态控制

  • An是地址线,W是字线,由地址线译码得出

在这里插入图片描述

PROM:PROM是可编程只读存储器,根据用户需求可在ROM中写入数据,但只能写入一次。在ROM的基础上多了一个可熔断的熔丝,用来将原值1改为0。但写入后就不可以再做修改。
在这里插入图片描述

EPROM:EPROM是可擦除,可重新编写的只读存储器,使用专用的紫外线灯照射芯片上的受光窗口,但只能一次性全部擦除

EEPROM:电可擦除可编程只读存储器,可全部擦除也可擦除某存储单元。

2.使用matlab生成coe文件

使用matlab生成coe文件的简单方法:使用matlab生成函数结果,将这些结果按某种格式保存为coe文件。具体做法如下:

其中:

memory_initialization_radix= 10表示的是生成数据的进制,常见的有二进制,八进制,十进制,十六进制。

memory_initialization_vector= 后面就是matlab生成的数据,数据与数据之间使用逗号隔开,最后一个数据使用分号结束。

matlab中文件操作语句:将数据写入文本文件 - MATLAB fprintf - MathWorks 中国

n  = 16;%量化位数
f  = 5e4; %信号频率Hz
fs = 25600000; %采样频率Hz
N  = 1024; %本次共采样点数
t  = (0:N-1)/fs; %采样时间s
x  = cos(2*pi*f*t); %信号采样值
y  = x*(2^(n-1)); %量化
y_z= round(y); %四舍五入取整
    
%生成y.coe文件
fid=fopen('E:\fpga\project\rom_ram\sp_rom\doc\y.coe','w'); %创建y.coe文件
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=10;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');
fprintf(fid,'%d,\n',y_z); %向y.coe中写入数据
fclose(fid); %关闭y.coe文件

3.生成ip核

先贴出官方文档:Xilinx PG058 LogiCORE IP Block Memory Generator v7.3, Product Guide

1.新建ip核
!
在这里插入图片描述
在这里插入图片描述

解释一下,也许有些教程中会选择一些器件型号等过程,也是可以的。我这里是从工程中直接添加ip,软件自动会 识别器件型号,这些在建立工程的时候已经确定好了。
在这里插入图片描述

在该页面中,我们在“search IP catalog”栏中输入“BLOCK”,然后在“VIEW by Function”中可以看到“Block Memory Generator”了,选中“Block Memory Generator”后点击next,启动IP配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这个页面中,我们设置“Read width”为16bits,“Read Depth”为1024个,设置“Enable”栏为“Always Enabled”。然后点击【next】进入第四个页面。

最终生成的ip核相关文件:
在这里插入图片描述

4.在顶层文件中例化ip核

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:    09:39:16 06/02/2021 
// Design Name: 
// Module Name:    sin_top 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module sin_top(
input clk,
input [9 : 0] add,
output [15:0] outdata
);
//例化
sin sin_inst1(
  .clka(clk),
  .addra(add),
  .douta(outdata)
);

endmodule

测试文件:

`timescale 1ns / 1ps


// Company: 
// Engineer:
//
// Create Date:   09:43:21 06/02/2021
// Design Name:   sin_top
// Module Name:   E:/fpga/project/rom_ram/sp_rom/sim/sin_tp_tb.v
// Project Name:  sp_rom
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: sin_top
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 


module sin_tp_tb;

	// Inputs
	reg clk;
	reg [9:0] add;

	// Outputs
	wire [15:0] outdata;

	// Instantiate the Unit Under Test (UUT)
	sin_top uut (
		.clk(clk), 
		.add(add), 
		.outdata(outdata)
	);

	initial begin
		// Initialize Inputs
		clk = 0;
		add = 0;

		// Wait 100 ns for global reset to finish
		//#100;
     
		// Add stimulus here

	end
 always #10 clk=~clk; 
always@(posedge clk)
	add<=add+1;
	
endmodule


modelsim仿真:
在这里插入图片描述

在modelsim仿真过程中出现了一个问题:

在这里插入图片描述

解决办法:

找到ise安装路径,将提示的文件重新编译一遍。
在这里插入图片描述

这就是单口rom的测试以及使用教程。happy!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值