module ram_16x2 (
input clk, // 时钟信号
input we, // 写使能
input en, // 使能信号
input [3:0] addr, // 地址线
input [1:0] datain, // 输入数据线
output reg [1:0] dataout // 输出数据线
);
// 定义存储器数组
reg [1:0] mem [15:0];
always @(posedge clk) begin
if (en) begin
if (we) begin
mem[addr] <= datain; // 写入数据
end
dataout <= mem[addr]; // 读取数据
end
end
endmodule
module ram_16x8 (
input clk, // 时钟信号
input we, // 写使能
input en, // 使能信号
input [3:0] addr, // 地址线
input [7:0] datain, // 输入数据线
output [7:0] dataout // 输出数据线
);
// 输出数据线
wire [1:0] dataout0, dataout1, dataout2, dataout3;
// 实例化4个16×2位存储器
ram_16x2 ram0 (
.clk(clk),
.we(we),
.en(en),
.addr(addr),
.datain(datain[1:0]),
.dataout(dataout0)
);
ram_16x2 ram1 (
.clk(clk),
.we(we),
.en(en),
.addr(addr),
.datain(datain[3:2]),
.dataout(dataout1)
);
ram_16x2 ram2 (
.clk(clk),
.we(we),
.en(en),
.addr(addr),
.datain(datain[5:4]),
.dataout(dataout2)
);
ram_16x2 ram3 (
.clk(clk),
.we(we),
.en(en),
.addr(addr),
.datain(datain[7:6]),
.dataout(dataout3)
);
// 合并4个16×2位存储器的输出数据
assign dataout = {dataout3, dataout2, dataout1, dataout0};
endmodule