题解 | 单端口RAM

单端口RAM

https://www.nowcoder.com/practice/a1b0c13edba14a2984e7369d232d9793

`timescale 1ns/1ns

module RAM_1port(
    input clk,
    input rst,
    input enb,
    input [6:0]addr,
    input [3:0]w_data,
    output wire [3:0]r_data
);
//*************code***********//
parameter DEPTH = 128;
parameter WIDTH = 4;
reg [WIDTH-1:0] RAM [DEPTH-1:0];
//写入RAM
always@(posedge clk) 
    RAM[addr] <= enb ? w_data : RAM[addr];   

//读取RAM
assign r_data = enb ? 0 : RAM[addr];
//*************code***********//
endmodule
module testbench();
reg rst;
reg enb;
reg [6:0] addr;
reg [3:0] w_data;
wire [3:0] r_data;
	reg clk=0;
	always #1 clk = ~clk;  //题目要求是周期5ns,但是时间有点长,牛客跑不动,我就改成2了
// A testbench   
//end 
integer i;   
  initial begin
    $dumpfile("out.vcd");
    // This will dump all signal, which may not be useful
    //$dumpvars;
    // dumping only this module
    //$dumpvars(1, testbench);
    // dumping only these variable
    // the first number (level) is actually useless
    $dumpvars(0, testbench);
     rst = 0;
    enb = 0;
    w_data = 0;
    addr = 0;
    #2;
    rst = 1;
    enb = 1;
    for(i=0;i<17;i++)//节约时间,这里随便写了一个值
      @(posedge clk) begin
        addr <= i;
        w_data <=(w_data==4'd15) ? 0 : (w_data + 1);
      end
    #2;
    enb = 0;
    for(i=0;i < 13; i++)//节约时间,这里随便写了一个值
    @(posedge clk)
      addr <= i;  
    #2;
    $finish;
end  

RAM_1port RAM_1port_tb(
  .clk(clk),
  .rst(rst),
  .enb(enb),
  .addr(addr),
  .w_data(w_data),
  .r_data(r_data)
); 

https://blog.csdn.net/Loudrs/article/details/130956115?fromshare=blogdetail&sharetype=blogdetail&sharerId=130956115&sharerefer=PC&sharesource=&sharefrom=from_link

这篇文章讲解了单端口、伪双端口、真双端口的区别以及相应代码,可以看看

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:35
虽然不怎么光彩,经过这件事,可能我真的要去认同“面试八股文早该淘汰!不会用AI作弊的程序员=新时代文盲!”这句话了
HellowordX:Ai的出现是解放劳动力的,不是用来破坏公平竞争环境的,这样下去,轻则取消所有线上面试,严重了会影响整个行业对所有人产生影响,企业会拉高入职考核各种离谱考核会层出不穷
你找工作的时候用AI吗?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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