diff options
Diffstat (limited to 'hdl/dp_memory.v')
-rw-r--r-- | hdl/dp_memory.v | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/hdl/dp_memory.v b/hdl/dp_memory.v index fa7db30..5064df7 100644 --- a/hdl/dp_memory.v +++ b/hdl/dp_memory.v @@ -4,34 +4,37 @@ Dual-port Instrcution/Data memory */ -module dp_memory( - input wire clk, - - input wire i_read_en, - input wire [31:0] i_addr, - output wire [31:0] i_instr_out, +module dp_memory( input wire clk, + input wire i_read_en, + input wire [31:0] i_addr, + output wire [31:0] i_instr_out, - input wire d_read_en, - input wire d_write_en, - input wire [31:0] d_addr, - input wire [31:0] d_write_data, - output wire [31:0] d_data_out - ); + input wire d_read_en, + input wire d_write_en, + input wire [31:0] d_addr, + input wire [31:0] d_write_data, + output wire [31:0] d_data_out ); - reg [31:0] mem[0:1023]; - - initial begin - $readmemh("./sw/test.rom", mem); - end - - - always @(posedge clk) begin - if (d_write_en) - mem [d_addr] <= d_write_data; - end - - assign i_instr_out = i_read_en ? mem[i_addr] : 0; - assign d_data_out = d_read_en ? mem[d_addr] : 0; + localparam mem_high_addr = 32'h00000400; + + wire i_bram_select, d_bram_select; + + reg [31:0] mem[0:mem_high_addr - 1]; + + initial begin + $readmemh("./sw/test.rom", mem); + end + + assign i_bram_select = (i_addr < mem_high_addr) ? 1'b1 : 1'b0; + assign d_bram_select = (d_addr < mem_high_addr) ? 1'b1 : 1'b0; + + always @(posedge clk) begin + if (d_write_en && d_bram_select) + mem [d_addr] <= d_write_data; + end + assign i_instr_out = (i_read_en && i_bram_select) ? mem[i_addr] : 0; + assign d_data_out = (d_read_en && d_bram_select) ? mem[d_addr] : 0; + endmodule |