题解 | #RAM的简单实现#

RAM的简单实现

https://www.nowcoder.com/practice/2c17c36120d0425289cfac0855c28796

思路

题目要求实现一个RAM,只有一个clk,说明读和写都是由同一个clk控制。

这就是经典的套模板题目,没啥可说的。

代码

`timescale 1ns/1ns
module ram_mod(
	input clk,
	input rst_n,
	
	input write_en,
	input [7:0]write_addr,
	input [3:0]write_data,
	
	input read_en,
	input [7:0]read_addr,
	output reg [3:0]read_data
);
	parameter data_depth=8;
	parameter data_width=4;
	reg [data_width-1:0]mem[data_depth-1:0];
	integer i;
	always @(posedge clk or negedge rst_n)begin
		if (!rst_n)begin
			for (i=0;i<data_depth;i=i+1)begin
				mem[i]<=4'b0;
			end
			read_data<=4'b0;
		end
		else begin
			if (read_en)read_data<=mem[read_addr];
			if (write_en)mem[write_addr]<=write_data;
		end
		
	end
	
endmodule

注意事项

  1. 题目的读和写都是由同一个clk来控制。我个人觉得这样不太好,容易有bug。假如在一个clk上升沿,读和写都是对同一个位置,那么读的数据就可能是以前的数据,叫脏数据。个人觉得读和写应该是互斥的,读的过程中不能去写,写的过程中不能去读。
  2. 按照题目要求,如何实现读和写同时完成呢?这就是代码的第26,27行,如果不用if...if,而用if....else,那么读和写就不能同时完成。
  3. 3. 存储器的深度指的是有几个数据 位宽指的是一个数据有几位

    4.存储器的定义可以理解为二维数组,数组的高和宽由位宽和深度来决定:reg [width-1:0]mem [depth-1,0]

    5.这里的地址是8位,我不太懂地址的位数由什么决定,如果有佬知道的话麻烦告知一下,谢谢~

    6.在always语句块中写for循环,interger i需要定义在always语句块外面,定义到always语句块里面就会编译不通过。俺也不知道这是啥原因。如果有佬知道的话麻烦告知一下,谢谢~

全部评论

相关推荐

安静的垂耳兔在泡澡:ks已经第八次投递了,它起码挂了还让你再投,不错了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务