blob: 783515b5895ce32e8a7b9958e0bdf94fb42bc253 [file] [log] [blame] [edit]
module ram16(
// Write port
input wrclk,
input [15:0] di,
input wren,
input [9:0] wraddr,
// Read port
input rdclk,
input rden,
input [9:0] rdaddr,
output reg [15:0] do);
(* ram_style = "block" *) reg [15:0] ram[0:1023];
initial begin
ram[0] = 16'b00000000_00000001;
ram[1] = 16'b10101010_10101010;
ram[2] = 16'b01010101_01010101;
ram[3] = 16'b11111111_11111111;
ram[4] = 16'b11110000_11110000;
ram[5] = 16'b00001111_00001111;
ram[6] = 16'b11001100_11001100;
ram[7] = 16'b00110011_00110011;
ram[8] = 16'b00000000_00000010;
ram[9] = 16'b00000000_00000100;
end
always @ (posedge wrclk) begin
if(wren == 1) begin
ram[wraddr] <= di;
end
end
always @ (posedge rdclk) begin
if(rden == 1) begin
do <= ram[rdaddr];
end
end
endmodule
module ram32(
// Write port
input wrclk,
input [31:0] di,
input wren,
input [8:0] wraddr,
// Read port
input rdclk,
input rden,
input [8:0] rdaddr,
output reg [31:0] do);
(* ram_style = "block" *) reg [31:0] ram[0:511];
initial begin
ram[0] = 32'b00000000_00000001_00000000_00000001;
ram[1] = 32'b10101010_10101010_10101010_10101010;
ram[2] = 32'b01010101_01010101_01010101_01010101;
ram[3] = 32'b11111111_11111111_11111111_11111111;
ram[4] = 32'b11110000_11110000_11110000_11110000;
ram[5] = 32'b00001111_00001111_00001111_00001111;
ram[6] = 32'b11001100_11001100_11001100_11001100;
ram[7] = 32'b00110011_00110011_00110011_00110011;
ram[8] = 32'b00000000_00000010_00000000_00000010;
ram[9] = 32'b00000000_00000100_00000000_00000100;
end
always @ (posedge wrclk) begin
if(wren == 1) begin
ram[wraddr] <= di;
end
end
always @ (posedge rdclk) begin
if(rden == 1) begin
do <= ram[rdaddr];
end
end
endmodule
module ram8(
// Write port
input wrclk,
input [7:0] di,
input wren,
input [10:0] wraddr,
// Read port
input rdclk,
input rden,
input [10:0] rdaddr,
output reg [7:0] do);
(* ram_style = "block" *) reg [7:0] ram[0:1023];
initial begin
ram[0] = 8'b00000001;
ram[1] = 8'b10101010;
ram[2] = 8'b01010101;
ram[3] = 8'b11111111;
ram[4] = 8'b11110000;
ram[5] = 8'b00001111;
ram[6] = 8'b11001100;
ram[7] = 8'b00110011;
ram[8] = 8'b00000010;
ram[9] = 8'b00000100;
end
always @ (posedge wrclk) begin
if(wren == 1) begin
ram[wraddr] <= di;
end
end
always @ (posedge rdclk) begin
if(rden == 1) begin
do <= ram[rdaddr];
end
end
endmodule
module top (
input wire clk,
//input wire rx,
//output wire tx,
input wire [19:0] sw,
output wire [14:0] led
);
wire rden8, rden16, rden32;
reg wren8, wren16, wren32;
wire [10:0] rdaddr;
wire [10:0] wraddr;
wire [32:0] di;
wire [32:0] do;
wire [7:0] do8;
wire [15:0] do16;
ram8 ram1(
.wrclk(clk),
.di(di[7:0]),
.wren(wren8),
.wraddr(wraddr),
.rdclk(clk),
.rden(rden8),
.rdaddr(rdaddr),
.do(do8[7:0])
);
ram16 ram2(
.wrclk(clk),
.di(di[15:0]),
.wren(wren16),
.wraddr(wraddr[9:0]),
.rdclk(clk),
.rden(rden16),
.rdaddr(rdaddr[9:0]),
.do(do16[15:0])
);
ram32 ram3(
.wrclk(clk),
.di(di),
.wren(wren32),
.wraddr(wraddr[8:0]),
.rdclk(clk),
.rden(rden32),
.rdaddr(rdaddr[8:0]),
.do(do)
);
reg [10:0] address_reg;
reg [31:0] data_reg;
reg [31:0] out_reg;
assign rdaddr = address_reg;
assign wraddr = address_reg;
// display_mode == 00 -> ram[address_reg]
// display_mode == 01 -> address_reg
// display_mode == 10 -> data_reg
wire [2:0] display_mode;
// input_mode == 00 -> in[9:0] -> address_reg
// input_mode == 01 -> in[7:0] -> data_reg[7:0]
// input_mode == 10 -> in[7:0] -> data_reg[15:8]
// input_mode == 11 -> data_reg -> ram[address_reg]
wire [1:0] input_mode;
// WE == 0 -> address_reg and data_reg unchanged.
// WE == 1 -> address_reg or data_reg is updated because on input_mode.
wire we;
assign display_mode[0] = sw[17];
assign display_mode[1] = sw[18];
assign display_mode[2] = sw[19];
assign input_mode[0] = sw[13];
assign input_mode[1] = sw[14];
assign input_mode[2] = sw[15];
assign input_mode[3] = sw[16];
assign we = sw[12];
assign led = out_reg;
assign di = data_reg;
assign rden = 1;
initial begin
address_reg = 10'b0;
data_reg = 32'b0;
out_reg = 32'b0;
end
always @ (posedge clk) begin
if(display_mode == 0) begin
out_reg <= do;
end else if(display_mode == 1) begin
out_reg <= address_reg;
end else if(display_mode == 2) begin
out_reg <= data_reg;
end if(display_mode == 3) begin
out_reg <= do16;
end if(display_mode == 4) begin
out_reg <= do8;
end
if(we == 1) begin
if(input_mode == 0) begin
address_reg <= sw[9:0];
wren16 <= 0;
end else if(input_mode == 1) begin
data_reg[7:0] <= sw[7:0];
wren16 <= 0;
end else if(input_mode == 2) begin
data_reg[15:8] <= sw[7:0];
wren16 <= 0;
end else if(input_mode == 3) begin
wren16 <= 1;
end else if(input_mode == 4) begin
address_reg <= sw[8:0];
wren16 <= 0;
end else if(input_mode == 5) begin
data_reg[7:0] <= sw[7:0];
wren32 <= 0;
end else if(input_mode == 6) begin
data_reg[15:8] <= sw[7:0];
wren32 <= 0;
end else if(input_mode == 7) begin
data_reg[23:16] <= sw[7:0];
wren32 <= 0;
end else if(input_mode == 8) begin
data_reg[31:17] <= sw[7:0];
wren32 <= 0;
end else if(input_mode == 9) begin
wren32 <= 1;
end else if (input_mode == 10) begin
address_reg <= sw[10:0];
wren8 <= 0;
end else if(input_mode == 11) begin
data_reg[7:0] <= sw[7:0];
wren8 <= 0;
end else if(input_mode == 12) begin
wren8 <= 1;
end
end
end
// Uart loopback
//assign tx = rx;
endmodule