blob: bc104de60bd7ca43c9f87e341e434375e6eee310 [file] [log] [blame] [edit]
module ram0 #(
parameter ADDR_WIDTH = 10,
parameter DATA_WIDTH = 8,
parameter MAX_ADDRESS = 1023
) (
// Write port
input wrclk,
input [DATA_WIDTH-1:0] di,
input wren,
input [ADDR_WIDTH-1:0] wraddr,
// Read port
input rdclk,
input rden,
input [ADDR_WIDTH-1:0] rdaddr,
output reg [DATA_WIDTH-1:0] do);
(* ram_style = "block" *) reg [DATA_WIDTH-1:0] ram[0:MAX_ADDRESS];
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 bram_test #(
parameter ADDR_WIDTH = 10,
parameter DATA_WIDTH = 8,
parameter ADDRESS_STEP = 1,
parameter MAX_ADDRESS = 1023
) (
input wire clk,
input wire rx,
output wire tx,
input wire [15:0] sw,
output wire [15:0] led
);
reg nrst = 0;
wire tx_baud_edge;
wire rx_baud_edge;
// Data in.
wire [7:0] rx_data_wire;
wire rx_data_ready_wire;
// Data out.
wire tx_data_ready;
wire tx_data_accepted;
wire [7:0] tx_data;
assign led[14:0] = sw[14:0];
assign led[15] = rx_data_ready_wire ^ sw[15];
UART #(
.COUNTER(25),
.OVERSAMPLE(8)
) uart (
.clk(clk),
.rst(!nrst),
.rx(rx),
.tx(tx),
.tx_data_ready(tx_data_ready),
.tx_data(tx_data),
.tx_data_accepted(tx_data_accepted),
.rx_data(rx_data_wire),
.rx_data_ready(rx_data_ready_wire)
);
wire [ADDR_WIDTH-1:0] write_address;
wire [ADDR_WIDTH-1:0] read_address;
wire [DATA_WIDTH-1:0] read_data;
wire [DATA_WIDTH-1:0] write_data;
wire write_enable;
wire read_enable = !write_enable;
wire [ADDR_WIDTH-1:0] rom_read_address;
wire [DATA_WIDTH-1:0] rom_read_data = 16'b0;
//assign rom_read_data[9:0] = rom_read_address;
wire loop_complete;
wire error_detected;
wire [7:0] error_state;
wire [ADDR_WIDTH-1:0] error_address;
wire [DATA_WIDTH-1:0] expected_data;
wire [DATA_WIDTH-1:0] actual_data;
RAM_TEST #(
.ADDR_WIDTH(ADDR_WIDTH),
.DATA_WIDTH(DATA_WIDTH),
.IS_DUAL_PORT(1),
.ADDRESS_STEP(ADDRESS_STEP),
.MAX_ADDRESS(MAX_ADDRESS)
) dram_test (
.rst(!nrst),
.clk(clk),
// Memory connection
.read_data(read_data),
.write_data(write_data),
.write_enable(write_enable),
.read_address(read_address),
.write_address(write_address),
// INIT ROM connection
.rom_read_data(rom_read_data),
.rom_read_address(rom_read_address),
// Reporting
.loop_complete(loop_complete),
.error(error_detected),
.error_state(error_state),
.error_address(error_address),
.expected_data(expected_data),
.actual_data(actual_data)
);
ram0 #(
.ADDR_WIDTH(ADDR_WIDTH),
.DATA_WIDTH(DATA_WIDTH),
.MAX_ADDRESS(MAX_ADDRESS)
) bram (
// Write port
.wrclk(clk),
.di(write_data),
.wren(write_enable),
.wraddr(write_address),
// Read port
.rdclk(clk),
.rden(read_enable),
.rdaddr(read_address),
.do(read_data)
);
ERROR_OUTPUT_LOGIC #(
.DATA_WIDTH(DATA_WIDTH),
.ADDR_WIDTH(ADDR_WIDTH)
) output_logic (
.clk(clk),
.rst(!nrst),
.loop_complete(loop_complete),
.error_detected(error_detected),
.error_state(error_state),
.error_address(error_address),
.expected_data(expected_data),
.actual_data(actual_data),
.tx_data(tx_data),
.tx_data_ready(tx_data_ready),
.tx_data_accepted(tx_data_accepted)
);
always @(posedge clk) begin
nrst <= 1;
end
endmodule