题解 | RAM的简单实现

RAM的简单实现

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

`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
);
//从图中可以看出是伪双端口RAM
parameter DEPTH = 256;
parameter WIDTH = 4;
reg [WIDTH-1:0] FRAM [DEPTH-1:0];

always@(posedge clk) begin
 // FRAM[write_addr] <= write_en ? write_data : FRAM[write_addr];//这么写会出现乱码
//因为write_en=0的时候,不知道该存储什么数据。

  FRAM[write_addr] <= write_en ? write_data : 0;
  read_data <= read_en ? FRAM[read_addr] : 0;
end

endmodule
`timescale 1ns/1ns
module testbench();
	reg a;
	reg clk,rst_n;
	reg write_en;
	reg [7:0] write_addr;
	reg [3:0] write_data;
	reg read_en;
	reg [7:0] read_addr;
	wire [3:0] read_data;
	wire rise,down;
always #1 clk = ~clk;
initial begin
	$dumpfile("out.vcd");
	$dumpvars(0,testbench);
   // 初始化信号
        clk = 0;
        rst_n = 0;
        write_en = 0;
        write_addr = 0;
        write_data = 0;
        read_en = 0;
        read_addr = 0;

        // 复位
        #2;
        rst_n = 1;

        // 写入操作
        write_en = 1;
        write_addr = 0;
        write_data = 1;
        #2;
        write_addr = 1;
        write_data = 2;
        #2;
        write_addr = 2;
        write_data = 4;
        #2;
        write_en = 0;
        write_addr = 3;
        write_data = 6;
        #2;
        write_en = 1;
        write_addr = 4;
        write_data = 8;
        #2;
        write_addr = 5;
        write_data = 10;
        #2;
        write_en = 0;
        write_addr = 6;
        write_data = 12;
        #2;
        write_en = 1;
        write_addr = 7;
        write_data = 14;
      
      // 读取操作
        #2;
        read_en = 1;
        read_addr = 0;
        #2;
        read_addr = 1;
        #2;
        read_addr = 2;
        #2;
        read_addr = 3;
        #2;
        read_addr = 4;
        #2;
        read_addr = 5;
        #2;
        read_addr = 6;
        #2;
        read_addr = 7;
        #2;
        read_en = 0;

        #10;
        $finish;
    
end

ram_mod dut(
	.clk(clk),
	.rst_n(rst_n),
	.write_en(write_en),
	.write_addr(write_addr),
	.write_data(write_data),
	.read_en(read_en),
	.read_addr(read_addr),
	.read_data(read_data)
);

endmodule

FRAM[write_addr] <= write_en ? write_data : 0; 当write_en=0的时候,也得给FRAM一个数去存储

FRAM[write_addr] <= write_en ? write_data : FRAM[write_addr]; 这么写会出现下面的乱码

全部评论

相关推荐

牛客nb666号:见天才的门槛罢了查看图片
点赞 评论 收藏
分享
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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