FPGA之ROM的创建

ROM是只读型存储器,写入数据之后就不能在对数据进行更改。下面提供3中创建ROM的方法:
一、自己动手通过readmemh或readmemb函数来将自己写的文件与ROM进行关联;有几点需要注意的地方:寄存器rom的大小(位宽和深度)如下面的代码中位宽为8,深度为1024

// An highlighted block
module myrom(
	clk,
	addr,
	q
);
input clk;
input [9:0] addr;
output reg[9:0] q;
reg [7:0] rom [1023:0];
initial begin 
	$readmemh("./xxx.txt",rom,0,1023);
	//读16进制的数据
	//格式$readmemh("file_name",memory_name[,start_addr[,finish_addr]]);
	//file_name:文件名;memory_name:ROM名;start_addr:开始地址;finish_addr:结束地址
	//[]的内容为可选内容,
	//readmemb 读2进制的数据
end
always(posedge clk)
	q<=rom[addr];
endmodule

二、第二中方法是通过ip核创建rom。选择菜单栏中的Tools下的ip核配置工具,搜索rom,选着Verilog语言,并命名文件。点击下一步

在这里插入图片描述
可以看到,在配置工具中依然需要设置位宽和深度。
在这里插入图片描述
在mem init中的文件名,这里需要注意的是文件必须是.mif和.hex文件。
在这里插入图片描述
三、第三中方法是直接生成代码,在代码段上进行修改。
在这里插入图片描述

在这里插入图片描述
生成的代码段如下:这里需要修改的是两个参数DATA_WIDTH、ADDR_WIDTH。然后将对应的文件名修改了就可以了。

// Quartus II Verilog Template
// Single Port ROM

module single_port_rom
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=8)
(
	input [(ADDR_WIDTH-1):0] addr,
	input clk, 
	output reg [(DATA_WIDTH-1):0] q
);

	// Declare the ROM variable
	reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];

	// Initialize the ROM with $readmemb.  Put the memory contents
	// in the file single_port_rom_init.txt.  Without this file,
	// this design will not compile.

	// See Verilog LRM 1364-2001 Section 17.2.8 for details on the
	// format of this file, or see the "Using $readmemb and $readmemh"
	// template later in this section.

	initial
	begin
		$readmemb("single_port_rom_init.txt", rom);
	end

	always @ (posedge clk)
	begin
		q <= rom[addr];
	end

endmodule

一般推荐使用方法一和方法三

  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值