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 290

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 220 hellwig
//
2
// rom.v -- parallel flash ROM interface
3 290 hellwig
//          4M x 32 bit = 16 MB
4 220 hellwig
//
5
 
6
 
7 290 hellwig
`timescale 1ns/10ps
8
`default_nettype none
9
 
10
 
11
module rom(clk, rst,
12
           stb, we, addr,
13
           data_out, ack, spi_en,
14 220 hellwig
           ce_n, oe_n, we_n, byte_n, a, d);
15
    // internal interface signals
16
    input clk;
17 290 hellwig
    input rst;
18
    input stb;
19
    input we;
20
    input [23:2] addr;
21 220 hellwig
    output reg [31:0] data_out;
22 290 hellwig
    output reg ack;
23 220 hellwig
    input spi_en;
24
    // flash ROM interface signals
25
    output ce_n;
26
    output oe_n;
27
    output we_n;
28
    output byte_n;
29
    output [23:0] a;
30
    input [15:0] d;
31
 
32
  reg [3:0] state;
33
  reg upper_half;
34
 
35
  // the following control signals are all
36
  // either constantly asserted or deasserted
37
  assign ce_n = 0;
38
  assign oe_n = spi_en;
39
  assign we_n = 1;
40
  assign byte_n = 1;
41
 
42
  // the flash ROM is organized in 16-bit halfwords
43
  // address line a[1] is controlled by the state machine
44 290 hellwig
  // ("upper half" means "at higher address in ROM")
45 220 hellwig
  // address line a[0] is not used
46
  // (it controls high/low byte select in byte mode)
47
  assign a[23:2] = addr[23:2];
48
  assign a[1] = upper_half;
49
  assign a[0] = 0;
50
 
51
  // the state machine
52
  always @(posedge clk) begin
53 290 hellwig
    if (rst) begin
54 220 hellwig
      state <= 0;
55 290 hellwig
      ack <= 0;
56 220 hellwig
    end else begin
57
      if (state == 0) begin
58
        // wait for start of access
59 290 hellwig
        if (stb & ~we) begin
60 220 hellwig
          state <= 1;
61 290 hellwig
          upper_half <= 0;
62 220 hellwig
        end
63
      end else
64
      if (state == 6) begin
65 290 hellwig
        // latch upper halfword
66
        data_out[31:24] <= d[7:0];
67
        data_out[23:16] <= d[15:8];
68
        state <= 7;
69
        upper_half <= 1;
70 220 hellwig
      end else
71
      if (state == 12) begin
72
        // latch lower halfword
73
        data_out[15:8] <= d[7:0];
74
        data_out[7:0] <= d[15:8];
75
        state <= 13;
76 290 hellwig
        ack <= 1;
77 220 hellwig
      end else
78
      if (state == 13) begin
79
        // end of access
80 290 hellwig
        ack <= 0;
81 220 hellwig
        state <= 0;
82
      end else begin
83
        // wait for flash ROM access time to pass
84
        state <= state + 1;
85
      end
86
    end
87
  end
88
 
89
endmodule

powered by: WebSVN 2.1.0

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