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

Subversion Repositories uart2spi

[/] [uart2spi/] [trunk/] [verif/] [models/] [st_m25p16/] [memory_access.v] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 dinesha
// Author: Hugues CREUSY modified by Xue feng
2
// June 2004
3
// Verilog model
4
// project: M25P16 50 MHz,
5
// release: 1.2
6
 
7
 
8
 
9
// These Verilog HDL models are provided "as is" without warranty
10
// of any kind, included but not limited to, implied warranty
11
// of merchantability and fitness for a particular purpose.
12
 
13
 
14
 
15
 
16
 
17
`timescale 1ns/1ns
18
`include "parameter.v"
19
 
20
module memory_access (add_mem, be_enable, se_enable, add_pp_enable, pp_enable, read_enable, data_request, data_to_write, page_add_index, data_to_read);
21
 
22
   input[(`NB_BIT_ADD_MEM - 1):0] add_mem;
23
   input be_enable;
24
   input se_enable;
25
   input add_pp_enable;
26
   input pp_enable;
27
   input read_enable;
28
   input data_request;
29
   input[(`NB_BIT_DATA - 1):0] data_to_write;
30
   input[(`LSB_TO_CODE_PAGE-1):0] page_add_index;
31
 
32
   output[(`NB_BIT_DATA - 1):0] data_to_read;
33
   reg[(`NB_BIT_DATA - 1):0] data_to_read;
34
 
35
   reg[(`NB_BIT_DATA - 1):0] p_prog[0:(`PLENGTH-1)];
36
   reg[(`NB_BIT_DATA - 1):0] content[0:`TOP_MEM];
37
   reg[`BIT_TO_CODE_MEM - 1:0] cut_add;
38
 
39
   integer i;
40
   integer deb_zone;
41
   integer int_add;
42
   integer int_add_mem;
43
   //parameter initfile = "initM25P16.txt"; // Modification introduced on 14/11/02 
44
                                             //to create default initialization file
45
 
46
   initial
47
   begin
48
      cut_add = 0;
49
      deb_zone = 0;
50
      int_add = 0;
51
      int_add_mem = `BIT_TO_CODE_MEM ;
52
 
53
 
54
      //-------------------------------
55
      // initialisation of memory array
56
      //-------------------------------
57
      //$display("%t : NOTE : Load memory with Initial content",$realtime); 
58
      //$readmemh(initfile, content); //12/11/02 Modification to initialize the memory content with external file
59
                                    //14/11/02 File name replaced by a generic all FFh file overideable in testbench
60
      //$display("%t : NOTE : Initial Load End",$realtime); 
61
 
62
      for(i = 0; i <= (`PLENGTH-1); i = i + 1)
63
      begin
64
         p_prog[i] = 8'b11111111 ;
65
      end
66
   end
67
 
68
   //--------------------------------------------------
69
   //                PROCESS MEMORY
70
   //--------------------------------------------------
71
 
72
   always
73
   begin
74
      @(negedge add_pp_enable )
75
 
76
         for(i = 0; i <= (`PLENGTH-1); i = i + 1)
77
         begin
78
            p_prog[i] = 8'b11111111 ;
79
         end
80
   end
81
 
82
   always
83
   begin
84
      @(page_add_index)
85
      if ($time != 0)
86
      begin
87
         if (page_add_index !== 8'bxxxxxxxx)
88
         begin
89
            if (add_pp_enable == 1'b1 && pp_enable == 1'b0)
90
            begin
91
               p_prog[page_add_index] <= data_to_write ;
92
            end
93
         end
94
      end
95
   end
96
 
97
   always
98
      @(posedge se_enable or posedge read_enable or add_pp_enable)
99
      if ($time != 0)
100
      begin
101
         for(i = 0; i <= `BIT_TO_CODE_MEM - 1; i = i + 1)
102
         begin
103
            cut_add[i] = add_mem[i];
104
         end
105
      end
106
 
107
 
108
 wire #1 delayed_data_request = data_request;
109
   always
110
      @(posedge delayed_data_request)
111
      if ($time != 0)
112
      begin
113
         if (read_enable)
114
         begin
115
            int_add = cut_add;
116
            //---------------------------------------------------------
117
            // Read instruction
118
            //---------------------------------------------------------
119
            if (int_add > `TOP_MEM)
120
            begin
121
               for(i = 0; i <= `BIT_TO_CODE_MEM - 1; i = i + 1)
122
               begin
123
                  cut_add[i] = 1'b0;
124
               end
125
               int_add = 0; // roll over at the end of mem array
126
            end
127
            data_to_read <= content[int_add] ;
128
            //cut_add <= cut_add + 1; // next address 
129
         end
130
      end
131
 
132
  always
133
      @(negedge data_request)
134
       if ($time != 0)
135
           begin
136
           cut_add <= cut_add+1;
137
           end
138
 
139
 
140
   always
141
      @(negedge read_enable)
142
      if ($time != 0)
143
      begin
144
         for(i = 0; i <= `NB_BIT_DATA - 1; i = i + 1)
145
         begin
146
            data_to_read[i] <= 1'b0 ;
147
         end
148
      end
149
 
150
   //--------------------------------------------------------
151
   // Page program instruction
152
   // To find the first adress of the memory to be programmed
153
   //--------------------------------------------------------
154
   always
155
      @(add_pp_enable)
156
         if (add_pp_enable == 1'b1)
157
         begin
158
            int_add_mem = cut_add;
159
            int_add = `TOP_MEM + 1;
160
            while (int_add > int_add_mem)
161
            begin
162
               int_add = int_add - `PLENGTH ;
163
            end
164
         end
165
 
166
      //----------------------------------------------------
167
      // Sector erase instruction
168
      // To find the first adress of the sector to be erased
169
      //----------------------------------------------------
170
   always
171
      @(posedge se_enable)
172
         begin
173
            int_add = cut_add & `MASK_SECTOR ;
174
         end
175
   //----------------------------------------------------
176
   // Write or erase cycle execution
177
   //----------------------------------------------------
178
   always
179
      @(posedge pp_enable)
180
      if ($time != 0)            // to avoid any corruption at initialization of variables
181
      begin
182
         for(i = 0; i <= (`PLENGTH - 1); i = i + 1)
183
         begin
184
            content[int_add + i] = p_prog[i] & content[int_add + i];
185
         end
186
      end
187
 
188
   always
189
      @(negedge be_enable)
190
      if ($time != 0)            // to avoid any corruption at initialization of variables
191
      begin
192
         for(i = 0; i <= `TOP_MEM; i = i + 1)
193
         begin
194
            content[i] = 8'b11111111;
195
         end
196
      end
197
 
198
   always
199
      @(negedge se_enable)
200
      if ($time != 0)            // to avoid any corruption at initialization of variables
201
      begin
202
         for(i = int_add; i <= (int_add + (`SSIZE / `NB_BIT_DATA) - 1); i = i + 1)
203
         begin
204
            content[i] = 8'b11111111;
205
         end
206
      end
207
 
208
endmodule

powered by: WebSVN 2.1.0

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