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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc/] [src/] [rom/] [28F128J3/] [rom.v] - Blame information for rev 288

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

Line No. Rev Author Line
1 220 hellwig
//
2
// rom.v -- parallel flash ROM interface
3
//
4
 
5
 
6
module rom(clk, reset,
7
           en, wr, size, addr,
8
           data_out, wt, spi_en,
9
           ce_n, oe_n, we_n, byte_n, a, d);
10
    // internal interface signals
11
    input clk;
12
    input reset;
13
    input en;
14
    input wr;
15
    input [1:0] size;
16
    input [23:0] addr;
17
    output reg [31:0] data_out;
18
    output reg wt;
19
    input spi_en;
20
    // flash ROM interface signals
21
    output ce_n;
22
    output oe_n;
23
    output we_n;
24
    output byte_n;
25
    output [23:0] a;
26
    input [15:0] d;
27
 
28
  reg [3:0] state;
29
  reg upper_half;
30
 
31
  // the following control signals are all
32
  // either constantly asserted or deasserted
33
  assign ce_n = 0;
34
  assign oe_n = spi_en;
35
  assign we_n = 1;
36
  assign byte_n = 1;
37
 
38
  // the flash ROM is organized in 16-bit halfwords
39
  // address line a[1] is controlled by the state machine
40
  // (this is necessary for word accesses)
41
  // address line a[0] is not used
42
  // (it controls high/low byte select in byte mode)
43
  assign a[23:2] = addr[23:2];
44
  assign a[1] = upper_half;
45
  assign a[0] = 0;
46
 
47
  // the state machine
48
  always @(posedge clk) begin
49
    if (reset == 1) begin
50
      state <= 0;
51
      wt <= 1;
52
    end else begin
53
      if (state == 0) begin
54
        // wait for start of access
55
        if (en == 1 && wr == 0) begin
56
          state <= 1;
57
          if (size[1] == 1) begin
58
            // word access
59
            upper_half <= 0;
60
          end else begin
61
            // halfword or byte access
62
            upper_half <= addr[1];
63
          end
64
        end
65
      end else
66
      if (state == 6) begin
67
        if (size[1] == 1) begin
68
          // word access
69
          // latch upper halfword
70
          data_out[31:24] <= d[7:0];
71
          data_out[23:16] <= d[15:8];
72
          state <= 7;
73
          upper_half <= 1;
74
        end else begin
75
          // halfword or byte access
76
          data_out[31:16] <= 16'h0000;
77
          if (size[0] == 1) begin
78
            // halfword access
79
            data_out[15:8] <= d[7:0];
80
            data_out[7:0] <= d[15:8];
81
          end else begin
82
            // byte access
83
            data_out[15:8] <= 8'h00;
84
            if (addr[0] == 0) begin
85
              // even address
86
              data_out[7:0] <= d[7:0];
87
            end else begin
88
              // odd address
89
              data_out[7:0] <= d[15:8];
90
            end
91
          end
92
          state <= 13;
93
          wt <= 0;
94
        end
95
      end else
96
      if (state == 12) begin
97
        // word access (state is only reached in this case)
98
        // latch lower halfword
99
        data_out[15:8] <= d[7:0];
100
        data_out[7:0] <= d[15:8];
101
        state <= 13;
102
        wt <= 0;
103
      end else
104
      if (state == 13) begin
105
        // end of access
106
        wt <= 1;
107
        state <= 0;
108
      end else begin
109
        // wait for flash ROM access time to pass
110
        state <= state + 1;
111
      end
112
    end
113
  end
114
 
115
endmodule

powered by: WebSVN 2.1.0

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