题解 | #ROM的简单实现#

ROM的简单实现

http://www.nowcoder.com/practice/b76fdef7ffa747909b0ea46e0d13738a

题解主体

       要实现ROM,首先要声明数据的存储空间,例如:[3:0] rom [7:0];变量名称rom之前的[3:0]表示每个数据具有多少位,指位宽;变量名称rom之后的[7:0]表示需要多少个数据,指深度,注意这里深度为8,应该是使用[7:0],而不是[2:0];

       声明存储变量之后,需要对rom进行初始化,写入数据,然后将输入地址作为rom的索引值,将索引值对应的数据输出。

可以按照如下的方式开辟存储空间,并进行数据初始化:

       reg [3:0] rom_data [7:0];

//保持ROM中的数据不变

       always @(posedge clk or negedge rst_n)

              if (!rst_n)                                          //对ROM中的数据进行初始化

                     begin

                            rom_data[0] <= 4'd0;

                            rom_data[1] <= 4'd2;

                            rom_data[2] <= 4'd4;

                            rom_data[3] <= 4'd6;         

                            rom_data[4] <= 4'd8;

                            rom_data[5] <= 4'd10;

                            rom_data[6] <= 4'd12;

                            rom_data[7] <= 4'd14;

                     end

              else

                     begin                                               //保持ROM中的数据不变

                            rom_data[0] <= 4'd0;

                            rom_data[1] <= 4'd2;

                            rom_data[2] <= 4'd4;

                            rom_data[3] <= 4'd6;         

                            rom_data[4] <= 4'd8;

                            rom_data[5] <= 4'd10;

                            rom_data[6] <= 4'd12;

                            rom_data[7] <= 4'd14;

                     end

初始化完成之后的rom的形式如下,内部存在地址和数据的对应关系,通过输入相应的地址,可以得到相应的输出数据。

      

       always @(posedge clk or negedge rst_n)

              if (!rst_n)

                     data <= 4'd0;

              else

                     data <= rom_data[addr];

只需要将地址作为rom的索引,即可得到相应的数据

参考答案

`timescale 1ns/1ns
module rom(
	input clk,
	input rst_n,
	input [7:0]addr,
	
	output [3:0]data
);
	reg [3:0] rom_data [7:0];
	
	assign data = rom_data[addr];
//保持ROM中的数据不变	
	always @(posedge clk or negedge rst_n)
		if (!rst_n) 
			begin
				rom_data[0] <= 4'd0;
				rom_data[1] <= 4'd2;
				rom_data[2] <= 4'd4;
				rom_data[3] <= 4'd6;		
				rom_data[4] <= 4'd8;
				rom_data[5] <= 4'd10;
				rom_data[6] <= 4'd12;
				rom_data[7] <= 4'd14;
			end
		else 
			begin
				rom_data[0] <= rom_data[0];
				rom_data[1] <= rom_data[1];
				rom_data[2] <= rom_data[2];
				rom_data[3] <= rom_data[3];		
				rom_data[4] <= rom_data[4];
				rom_data[5] <= rom_data[5];
				rom_data[6] <= rom_data[6];
				rom_data[7] <= rom_data[7];
			end
endmodule


全部评论
为什么是【7:0】呀?,不应该8个数,3位2进制就可以表示了嘛
2 回复 分享
发布于 2023-03-31 22:00 四川
rom初始化部分可以直接这样吧 reg [3:0] rom[0:7]; integer i; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin for(i = 0; i < 7; i = i + 1)begin rom[i] <= i * 2; end end end
1 回复 分享
发布于 2022-08-18 16:36 上海
为什么给的输入地址addr是8bit的呀?应该3bit就够了吧?
点赞 回复 分享
发布于 2024-02-29 21:07 江苏
此题就注意是组合逻辑输出就行,其他的没啥了吧
点赞 回复 分享
发布于 2023-12-14 09:21 天津
请问为什么初始化之后,else里面还需要进行重复的赋值?看你写的是保持rom的值不变?为什么呢?
点赞 回复 分享
发布于 2023-08-02 16:43 山东
给rom_data赋值还有必要分开使能端为0、1写吗?
点赞 回复 分享
发布于 2023-07-13 16:33 广东
第二维表示的不是bit数
点赞 回复 分享
发布于 2023-06-02 20:10 江苏
verilog的二维数组是这样的
点赞 回复 分享
发布于 2023-06-02 20:09 江苏
else begin..end 是不是可以不用啊
点赞 回复 分享
发布于 2023-03-16 11:26 美国

相关推荐

03-19 09:58
河海大学 Java
最喜欢春天的奇亚籽很...:同学,是小红书不是小哄书,一眼就能看到的错误
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
29
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务