用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读取显示存储位置中的数据,写入数据时不起作用。在不使能时设置好存储地址和输入数据后按写按键写入数据,按读按键读取数据,读完或写完后再按下不使能,再次设置好数据和地址后再按功能键进行操作
注意:本次设计读写功能分别采用一条数据线,并非采用双向数据总线