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] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 fafa1971
/*
2
 * Simply RISC M1 Memory Management Unit
3
 *
4
 * It will include the following components:
5
 * - Instruction Cache
6
 * - Data Cache
7
 * - TLB
8
 * but for now it's just a fake MMU.
9
 */
10
 
11
module m1_mmu (
12
    sys_clock_i, sys_reset_i,
13
    imem_addr_i, imem_data_o, imem_read_i, imem_busy_o,
14
    dmem_addr_i, dmem_data_o, dmem_data_i, dmem_read_i, dmem_write_i, dmem_busy_o ,dmem_sel_i
15
  );
16
 
17
  // System
18
  input sys_clock_i, sys_reset_i;
19
 
20
  // Instruction Memory
21
  input[31:0] imem_addr_i;
22
  output[31:0] imem_data_o;
23
  input imem_read_i;
24
  output imem_busy_o;
25
 
26
  // Data Memory
27
  input[31:0] dmem_addr_i;
28
  output[31:0] dmem_data_o;
29
  input[31:0] dmem_data_i;
30
  input dmem_read_i;
31
  input dmem_write_i;
32
  output dmem_busy_o;
33
 
34
  // Fake Instruction and Data Memories
35
  reg[31:0] imem_data[0:1023];   // 4KB I$
36
  reg[31:0] dmem_data[0:255];    // 1KB D$
37
 
38
 
39
  //Selector
40
  input[3:0] dmem_sel_i;
41
  reg[31:0] data_temp;
42
 
43
  // Initialize fake memories
44
  integer i;
45
  initial begin
46
 
47
    // I$ is initialized from file
48
    $readmemh("code.txt", imem_data);
49
 
50
    // D$ defaults to zeroes
51
    for(i=0; i<256; i=i+1) dmem_data[i] = 0;
52
 
53
  end
54
 
55
  assign imem_busy_o = 0;
56
  assign dmem_busy_o = 0;
57
 
58
 
59
  assign imem_data_o = imem_data[{2'b00, imem_addr_i[31:2]}];
60
  assign dmem_data_o = dmem_data[{2'b00, dmem_addr_i[31:2]}];
61
 
62
 
63
  always @(dmem_write_i or dmem_read_i) begin
64
 
65
    if(dmem_write_i) begin
66
 
67
       if(dmem_sel_i[0]) begin
68
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
69
                         data_temp[7:0] = dmem_data_i[7:0];
70
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
71
       end
72
       if(dmem_sel_i[1]) begin
73
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
74
                         data_temp[15:8] = dmem_data_i[15:8];
75
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
76
       end
77
       if(dmem_sel_i[2]) begin
78
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
79
                         data_temp[24:16] = dmem_data_i[24:16];
80
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
81
       end
82
       if(dmem_sel_i[3]) begin
83
                         data_temp = dmem_data[{2'b00, dmem_addr_i[31:2]}];
84
                         data_temp[31:24] = dmem_data_i[31:24];
85
                         dmem_data[{2'b00, dmem_addr_i[31:2]}] = data_temp;
86
       end
87
       $display("INFO: MEMH(%m): WRITE_ADDR=%X, WRITE_DATA=%X", dmem_addr_i, dmem_data_i);
88
    end
89
 
90
 
91
    if(dmem_read_i) begin
92
      $display("INFO: MEMH(%m): READ_ADDR=%X, READ_DATA=%X", dmem_addr_i, dmem_data[{2'b00, dmem_addr_i[31:2]}]);
93
    end
94
  end
95
 
96
 
97
endmodule
98
 

powered by: WebSVN 2.1.0

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