diff options
Diffstat (limited to 'fpga_interchange/examples/tests/ram_nexus/ram_nexus.v')
-rw-r--r-- | fpga_interchange/examples/tests/ram_nexus/ram_nexus.v | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/fpga_interchange/examples/tests/ram_nexus/ram_nexus.v b/fpga_interchange/examples/tests/ram_nexus/ram_nexus.v new file mode 100644 index 00000000..e91a64bc --- /dev/null +++ b/fpga_interchange/examples/tests/ram_nexus/ram_nexus.v @@ -0,0 +1,123 @@ +module ram0( + // Write port + input wrclk, + input [7:0] di, + input wren, + input [5:0] wraddr, + // Read port + input rdclk, + input rden, + input [5:0] rdaddr, + output reg [7:0] do); + + (* syn_ramstyle = "block_ram" *) reg [7:0] ram[0:63]; + + 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 pb0, + input wire pb1, + + input wire [7:0] sw, + output wire [13:0] led +); + wire bufclk; + DCC gbuf_i(.CLKI(clk), .CLKO(bufclk)); + + + wire rden; + reg wren; + wire [5:0] rdaddr; + wire [5:0] wraddr; + wire [7:0] di; + wire [7:0] do; + ram0 ram( + .wrclk(bufclk), + .di(di), + .wren(wren), + .wraddr(wraddr), + .rdclk(bufclk), + .rden(rden), + .rdaddr(rdaddr), + .do(do) + ); + + reg [5:0] address_reg; + reg [7:0] data_reg; + reg [7:0] out_reg; + + assign rdaddr = address_reg; + assign wraddr = address_reg; + + // input_mode == 00 -> in[3:0] -> address_reg + // input_mode == 01 -> in[3:0] -> data_reg[3:0] + // input_mode == 10 -> in[3:0] -> data_reg[7:4] + // 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 input_mode[0] = ~sw[6]; + assign input_mode[1] = ~sw[7]; + + assign we = ~pb0; + assign led = ~{address_reg, out_reg}; + assign di = data_reg; + assign rden = 1; + + initial begin + wren = 1'b0; + address_reg = 10'b0; + data_reg = 16'b0; + out_reg = 16'b0; + end + + always @ (posedge bufclk) begin + out_reg <= do; + + if(we == 1) begin + if(input_mode == 0) begin + address_reg <= ~sw[5:0]; + wren <= 0; + end else if(input_mode == 1) begin + data_reg[3:0] <= ~sw[3:0]; + wren <= 0; + end else if(input_mode == 2) begin + data_reg[7:4] <= ~sw[3:0]; + wren <= 0; + end else if(input_mode == 3) begin + wren <= 1; + end + end + end + +endmodule |