单端口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!!