verilog 存储器组织

用Verilog写一个组合逻辑的ram64x8的存储器组织,实现简单的读写功能
一个ram64x8的存储器由4x2=8个ram16x4的存储芯片组成

核心代码:
连接其他模块和外部接口的模块文件Virtual_Lab_Top.v:

//64x4存储器实验
`default_nettype none 
module Virtual_Lab_Top 			//信号的输入和输出
(
    input  wire  CLOCK,
    input  wire  [4:0] BUTTON, //按键
    input  wire [35:0] SWITCH, //开关
    output wire [35:0] LED,    //指示灯 
    output wire  [3:0] HEX0,   //数码管
	 output wire  [3:0] HEX1,
	 output wire  [3:0] HEX2,
	 output wire  [3:0] HEX3
); 

//输入端口赋值给内部信号
wire [5:0] adrs = SWITCH[5:0];
wire [7:0] data = SWITCH[13:6];
wire write = BUTTON[0];
wire read = BUTTON[1];
wire re = BUTTON[2];

//内部信号赋值给输出端口(数码管)观察
assign HEX0 = temp[3:0];
assign HEX1 = temp[7:4];

//实验逻辑
wire [7:0] temp;
reg _ce,_we,_oe;
always@(posedge write or posedge read or posedge re)
begin
	if(write)
	begin
	_ce<=1'b0;
	_we<=1'b0;
	_oe<=1'b1;
	end
	else if(read)
	begin
	_ce<=1'b0;
	_we<=1'b1;
	_oe<=1'b0;
	end
	else
	begin
	_ce<=1'b1;
	_we<=1'b1;
	_oe<=1'b1;
	end
end

ram64x8 u1(.adrs(adrs),.data(data),._ce(_ce),._we(_we),._oe(_oe),.temp(temp));
 
endmodule

ram16x4存储器模块文件ram16x4.v:

module ram16x4(
	input [3:0]adrs,
	input [3:0]data,
	input _ce,_we,_oe,
	output reg [3:0] temp
); 

reg [3:0] mem[0:15];//16 X 4 RAM
//assign data = (~_ce & _we & ~_ce)? temp:4'hz;
always@(*)
begin 
if(_ce == 0) begin
	if(_we == 0&&_oe == 1)
		mem[adrs] <= data;
	else if(_we == 1&&_oe == 0)
		temp <= mem[adrs];
	else
		temp <= 4'hz;
end
end
endmodule

ram16x8存储器模块文件ram16x8.v:

module ram16x8(
	input [3:0] adrs, 
	input [7:0] data, 
	input _ce,_we,_oe,
	output [7:0] temp
);
ram16x4	u1(adrs,data[7:4],_ce,_we,_oe,temp[7:4]);
ram16x4	u2(adrs,data[3:0],_ce,_we,_oe,temp[3:0]);
endmodule

ram64x8存储器模块文件ram64x8.v:

module ram64x8(
	input [5:0] adrs, 
	input [7:0] data, 
	input _ce,_we,_oe,
	output [7:0] temp
);
reg [3:0] _cee;
ram16x8	u1(adrs[3:0],data,_cee[0],_we,_oe,temp);
ram16x8	u2(adrs[3:0],data,_cee[1],_we,_oe,temp);
ram16x8	u3(adrs[3:0],data,_cee[2],_we,_oe,temp);
ram16x8	u4(adrs[3:0],data,_cee[3],_we,_oe,temp);
//2-to-4 decode
always@(*) 
begin 
	if(_ce==0)
	case(adrs[5:4])
	0:_cee=4'b1110;
	1:_cee=4'b1101;
	2:_cee=4'b1011;
	3:_cee=4'b0111; 
	default:_cee=4'hf; 
	endcase 
	else
		_cee = 4'hf;
end
endmodule

完整的工程文件我已经上传到CSDN了,可以去我的主页查看并下载完整的工程文件进行使用
工程内包含文件如下图:
在这里插入图片描述
WeLab虚拟面板设置图片:
在这里插入图片描述
address输入读写的存储位置,共有2的6次方即64个可以存储8位二进制数的存储位置,data为输入数据,在写入时有效,读取时不起作用,数码管temp读取显示存储位置中的数据,写入数据时不起作用。在不使能时设置好存储地址和输入数据后按写按键写入数据,按读按键读取数据,读完或写完后再按下不使能,再次设置好数据和地址后再按功能键进行操作

注意:本次设计读写功能分别采用一条数据线,并非采用双向数据总线

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值