题解 | #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
注意事项
- 题目的读和写都是由同一个clk来控制。我个人觉得这样不太好,容易有bug。假如在一个clk上升沿,读和写都是对同一个位置,那么读的数据就可能是以前的数据,叫脏数据。个人觉得读和写应该是互斥的,读的过程中不能去写,写的过程中不能去读。
- 按照题目要求,如何实现读和写同时完成呢?这就是代码的第26,27行,如果不用if...if,而用if....else,那么读和写就不能同时完成。
3. 存储器的深度指的是有几个数据 位宽指的是一个数据有几位
4.存储器的定义可以理解为二维数组,数组的高和宽由位宽和深度来决定:reg [width-1:0]mem [depth-1,0]
5.这里的地址是8位,我不太懂地址的位数由什么决定,如果有佬知道的话麻烦告知一下,谢谢~
6.在always语句块中写for循环,interger i需要定义在always语句块外面,定义到always语句块里面就会编译不通过。俺也不知道这是啥原因。如果有佬知道的话麻烦告知一下,谢谢~