OpenCores
URL https://opencores.org/ocsvn/m1_core/m1_core/trunk

Subversion Repositories m1_core

[/] [m1_core/] [trunk/] [hdl/] [rtl/] [m1_core/] [m1_mmu.v] - Rev 2

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 * Simply RISC M1 Memory Management Unit
 * 
 * It will include the following components:
 * - Instruction Cache
 * - Data Cache
 * - TLB
 * but for now it's just a fake MMU.
 */
 
module m1_mmu (
    sys_clock_i, sys_reset_i,
    imem_addr_i, imem_data_o, imem_read_i, imem_busy_o,
    dmem_addr_i, dmem_data_o, dmem_data_i, dmem_read_i, dmem_write_i, dmem_busy_o ,dmem_sel_i
  );
 
  // System
  input sys_clock_i, sys_reset_i;
 
  // Instruction Memory
  input[31:0] imem_addr_i;
  output[31:0] imem_data_o;
  input imem_read_i;
  output imem_busy_o;
 
  // Data Memory
  input[31:0] dmem_addr_i;
  output[31:0] dmem_data_o;
  input[31:0] dmem_data_i;
  input dmem_read_i;
  input dmem_write_i;
  output dmem_busy_o;
 
  // Fake Instruction and Data Memories
  reg[31:0] imem_data[0:1023];   // 4KB I$
  reg[31:0] dmem_data[0:255];    // 1KB D$
 
 
  //Selector
  input[3:0] dmem_sel_i;
  reg[31:0] data_temp;                    
 
  // Initialize fake memories
  integer i;
  initial begin
 
    // I$ is initialized from file
    $readmemh("code.txt", imem_data);
 
    // D$ defaults to zeroes
    for(i=0; i<256; i=i+1) dmem_data[i] = 0;
 
  end
 
  assign imem_busy_o = 0;
  assign dmem_busy_o = 0;
 
 
  assign imem_data_o = imem_data[{2'b00, imem_addr_i[31:2]}];
  assign dmem_data_o = dmem_data[{2'b00, dmem_addr_i[31:2]}];
 
 
  always @(dmem_write_i or dmem_read_i) begin          
 
    if(dmem_write_i) begin
 
       if(dmem_sel_i[0]) begin
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
                         data_temp[7:0] = dmem_data_i[7:0];
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
       end 
       if(dmem_sel_i[1]) begin
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
                         data_temp[15:8] = dmem_data_i[15:8];
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
       end 
       if(dmem_sel_i[2]) begin
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
                         data_temp[24:16] = dmem_data_i[24:16];
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
       end 
       if(dmem_sel_i[3]) begin
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
                         data_temp[31:24] = dmem_data_i[31:24];
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
       end
       $display("INFO: MEMH(%m): WRITE_ADDR=%X, WRITE_DATA=%X", dmem_addr_i, dmem_data_i);
    end             
 
 
    if(dmem_read_i) begin
      $display("INFO: MEMH(%m): READ_ADDR=%X, READ_DATA=%X", dmem_addr_i, dmem_data[{2'b00, dmem_addr_i[31:2]}]);  
    end
  end
 
 
endmodule
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.