| 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 |