module ram0( // 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 top ( input wire clk, input wire rx, output wire tx, input wire [15:0] sw, output wire [15:0] led ); wire rden; reg wren; wire [9:0] rdaddr; wire [9:0] wraddr; wire [15:0] di; wire [15:0] do; ram0 ram( .wrclk(clk), .di(di), .wren(wren), .wraddr(wraddr), .rdclk(clk), .rden(rden), .rdaddr(rdaddr), .do(do) ); reg [9:0] address_reg; reg [15:0] data_reg; reg [15: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 [1: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[14]; assign display_mode[1] = sw[15]; assign input_mode[0] = sw[12]; assign input_mode[1] = sw[13]; assign we = sw[11]; assign led = out_reg; assign di = data_reg; assign rden = 1; initial begin address_reg = 10'b0; data_reg = 16'b0; out_reg = 16'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(we == 1) begin if(input_mode == 0) begin address_reg <= sw[9:0]; wren <= 0; end else if(input_mode == 1) begin data_reg[7:0] <= sw[7:0]; wren <= 0; end else if(input_mode == 2) begin data_reg[15:8] <= sw[7:0]; wren <= 0; end else if(input_mode == 3) begin wren <= 1; end end end // Uart loopback assign tx = rx; endmodule