source: PlatformSupport/CustomPeripherals/pcores/eeprom_v1_07_a/hdl/verilog/one_wire_interface.v

Last change on this file was 1166, checked in by murphpo, 15 years ago

adding updated EEPROM core/driver with better clocking

File size: 13.4 KB
Line 
1//--------------------------------------------------------------------------
2//                                                                        --
3//  OneWireMaster                                                         --
4//   A synthesizable 1-wire master peripheral                             --
5//   Copyright 1999-2005 Dallas Semiconductor Corporation                 --
6//                                                                        --
7//--------------------------------------------------------------------------
8//                                                                        --
9//  Purpose:  Provides timing and control of Dallas 1-wire bus            --
10//            through a memory-mapped peripheral                          --
11//  File:     one_wire_interface.v                                        --
12//  Date:     February 1, 2005                                            --
13//  Version:  v2.100                                                      --
14//  Authors:  Rick Downs and Charles Hill,                                --
15//            Dallas Semiconductor Corporation                            --
16//                                                                        --
17//  Note:     This source code is available for use without license.      --
18//            Dallas Semiconductor is not responsible for the             --
19//            functionality or utility of this product.                   --
20//                                                                        --
21//  REV:      Added BIT_CTL to COMMAND reg - GAG                          --
22//            Added STPEN to COMMAND reg - GAG                            --
23//            Combined CLK_DIV register bits into one block - GAG         --
24//            Added CLK_EN to CLK_DIV reg - GAG                           --
25//            Added CONTROL reg and moved appropriate bits into it - GAG  --
26//            Added EN_FOW and changed dqz to FOW - GAG                   --
27//            Added STP_SPLY - GAG                                        --
28//            Significant changes to improve synthesis - English          --
29//            Ported to Verilog - Sandelin                                --
30//--------------------------------------------------------------------------
31
32module one_wire_interface (
33   ADDRESS, ADS_bar, clear_interrupts, DIN, DQ_IN, EN_bar, FSM_CLK, MR,
34   OneWireIO_eq_Load, pdr, OW_LOW, OW_SHORT, rbf,
35   rcvr_buffer, RD_bar, reset_owr, rsrf, temt, WR_bar, BIT_CTL,
36   CLK_EN, clr_activate_intr, DDIR, div_1, div_2, div_3, DOUT, EN_FOW, EOWL,
37   EOWSH, epd, erbf, ersf, etbe, etmt, FOW, ias,
38   LLM, OD, owr, pd, PPM, pre_0, pre_1, rbf_reset, sr_a, STP_SPLY, STPEN, tbe,
39   xmit_buffer,dq_sel);
40
41   input [2:0]  ADDRESS;
42   input        ADS_bar;
43   input        clear_interrupts;
44   input [7:0]  DIN;
45   input        DQ_IN;
46   input        EN_bar;
47   input        FSM_CLK;
48   input        MR;
49   input        OneWireIO_eq_Load;
50   input        pdr;
51   input        OW_LOW;          // ow bus low interrupt
52   input        OW_SHORT;        // ow bus shorted interrupt
53   input        rbf;             // receive buffer full int
54   input [7:0]  rcvr_buffer;
55   input        RD_bar;
56   input        reset_owr;
57   input        rsrf;            // receive shift reg full int
58   input        temt;
59   input        WR_bar;
60
61   output       BIT_CTL;         // enable signle bit outputs
62   output       CLK_EN;          // clock divider enable
63   output       clr_activate_intr;
64   output       DDIR;
65   output       div_1;           // divider select bit 1
66   output       div_2;           // divider select bit 2
67   output       div_3;           // divider select bit 3
68   output [7:0] DOUT;
69   output       EN_FOW;          // enable force OW functionality
70   output       EOWL;            // enable one wire bus low interrupt
71   output       EOWSH;           // enable one wire short interrupt
72   output       epd;             // enable presence detect interrupt
73   output       erbf;            // enable receive buffer full interrupt
74   output       ersf;            // enable receive shift register full int.
75   output       etbe;            // enable transmit buffer empty interrupt
76   output       etmt;            // enable transmit shift outputister empty int.
77   output       FOW;             // force OW value to opposite value
78   output       ias;             // INTR active state
79   output       LLM;             // long line mode enable
80   output       OD;              // enable overdrive
81   output       owr;
82   output       pd;
83   output       PPM;             // presence pulse masking enable
84   output       pre_0;           // prescaler select bit 0
85   output       pre_1;           // prescaler select bit 1
86   output       rbf_reset;       // clear signal for rbf
87   output       sr_a;
88   output       STP_SPLY;        // enable strong pull up supply mode
89   output       STPEN;           // enable strong pull up output
90   output       tbe;
91   output [7:0] xmit_buffer;
92   output [2:0] dq_sel;
93   reg    [2:0] dq_sel;
94
95
96   wire         read_op;
97   wire         write_op;
98   reg [2:0]    sel_addr;         // selected register address
99
100   // command register
101   reg       sr_a;                // search ROM accelerator command
102   reg       owr;                 // 1W reset command
103   reg       FOW;                 // Force OW value
104   wire [7:0] CMD_REG = {4'b0, DQ_IN, FOW, sr_a, owr};
105
106   reg       set_activate_intr;
107   reg       clr_activate_intr;
108   reg  xmit_buffer_full;
109
110   reg [7:0] xmit_buffer;         // transmit buffer
111
112   // Control register
113   reg       OD;                  // enable overdrive
114   reg       BIT_CTL;             // enable single bit transmitions
115   reg       STP_SPLY;            // Strong Pullup supply mode enable
116   reg       STPEN;               // enable strong pull up output
117   reg       EN_FOW;              // enable force OW functionality
118   reg       PPM;                 // Presence Pulse masking enable
119   reg       LLM;                 // Long Line mode enable (stretch timing)
120   wire [7:0] CONTRL_REG = {1'b0, OD, BIT_CTL, STP_SPLY, STPEN, EN_FOW,
121             PPM, LLM};
122
123   // interrupt register
124   wire      OW_LOW;              // OW low interrupt
125   wire      OW_SHORT;            // OW shorted interrupt
126   reg       pd;                  // presence detect done flag
127   wire      pdr;                 // presence detect result
128   reg       tbe;                 // transmit buffer empty flag
129   wire      rbf;                 // receive buffer full flag
130   wire [7:0] INT_REG = {OW_LOW, OW_SHORT, rsrf, rbf, temt, tbe, pdr, pd};
131
132   // interrupt enable register
133   reg       EOWL;                // enable OW low interrupt
134   reg       EOWSH;               // enable OW shorted interrupt
135   reg       epd;                 // enable presence detect interrupt
136   reg       ias;                 // INTR active state
137   reg       etbe;                // enable transmit buffer empty interrupt
138   reg       etmt;                // enable transmit shift register empty int.
139   reg       erbf;                // enable receive buffer full interrupt
140   reg       ersf;                // enable receive shift register full int.
141   wire [7:0] INTEN_REG = {EOWL, EOWSH, ersf, erbf, etmt, etbe, ias, epd};
142
143   // clock divisor register
144   reg       pre_0;               // prescaler select bit 0
145   reg       pre_1;               // prescaler select bit 1
146   reg       div_1;               // divider select bit 1
147   reg       div_2;               // divider select bit 2
148   reg       div_3;               // divider select bit 3
149   reg       CLK_EN;              // clock divider enable
150   wire [7:0] CLKDV_REG = {CLK_EN, 2'b0, div_3, div_2, div_1, pre_1, pre_0};
151
152
153
154  //--------------------------------------------------------------------------
155  //  read/write process
156  //--------------------------------------------------------------------------
157
158  assign read_op = ~EN_bar && ~MR && ~RD_bar && WR_bar;
159  wire      read_op_n=~read_op;
160
161  assign write_op = ~EN_bar && ~MR && ~WR_bar && RD_bar;
162  wire      write_op_n = ~write_op;
163
164  always @(posedge MR or posedge WR_bar)
165    if(MR)            // removed reset interrupt reg when chip not enabled
166      begin
167        EOWL = 1'b0;
168        EOWSH = 1'b0;
169        ersf = 1'b0;
170        erbf = 1'b0;
171        etmt = 1'b0;
172        etbe = 1'b0;
173        ias = 1'b0;
174        epd = 1'b0;
175        xmit_buffer=0;
176      end
177    else
178      if(!EN_bar && RD_bar)
179        case(sel_addr)
180          3'b001:
181            xmit_buffer = DIN;
182          3'b011:             //removed ias to hard wire active low - GAG
183                              //added ias to remove hardwire - SKH
184            begin
185              EOWL = DIN[7];
186              EOWSH = DIN[6];
187              ersf = DIN[5];
188              erbf = DIN[4];
189              etmt = DIN[3];
190              etbe = DIN[2];
191              ias = DIN[1];
192              epd = DIN[0];
193            end
194        endcase
195
196  assign DDIR =  read_op;
197
198  //
199  // Modified DOUT to always drive the current register value out
200  // based on the address value
201  //
202  assign DOUT =
203  (sel_addr == 3'b000)?{1'b0,dq_sel [2:0],DQ_IN,FOW,sr_a,owr}:
204  (sel_addr == 3'b001)?rcvr_buffer:
205  (sel_addr == 3'b010)?{OW_LOW,OW_SHORT,rsrf,rbf,temt,tbe,pdr,pd}:
206  (sel_addr == 3'b011)?{EOWL,EOWSH,ersf,erbf,etmt,etbe,ias,epd}:
207  (sel_addr == 3'b100)?{CLK_EN,2'b00,div_3,div_2,div_1,pre_1,pre_0}:
208  (sel_addr == 3'b101)?{1'b0,OD,BIT_CTL,STP_SPLY,STPEN,EN_FOW,PPM,LLM}:
209  8'h00;
210
211
212  //
213  // Clock divisor register
214  //
215  // synopsys async_set_reset MR
216  always @(posedge MR or posedge WR_bar)
217    if(MR)
218      begin
219        pre_0 = 1'b0;
220        pre_1 = 1'b0;
221        div_1 = 1'b0;
222        div_2 = 1'b0;
223        div_3 = 1'b0;
224        CLK_EN = 1'b0;
225      end
226    else
227    if(!EN_bar && RD_bar)
228      if(sel_addr == 3'b100)
229        begin
230          pre_0 = DIN[0];
231          pre_1 = DIN[1];
232          div_1 = DIN[2];
233          div_2 = DIN[3];
234          div_3 = DIN[4];
235          CLK_EN = DIN[7];
236        end
237
238
239  wire CLR_OWR = MR || reset_owr;
240
241  //
242  // Command reg writes are handled in the next two sections
243  // Bit 0 needs to be separate for the added clearing mechanism
244  //
245  always @(posedge CLR_OWR or posedge WR_bar)
246    if(CLR_OWR)
247      begin
248        owr <= 1'b0;
249      end
250    else
251      begin
252        if(EN_bar == 0 && RD_bar == 1)
253          if(sel_addr == 3'b000)
254            owr <= DIN[0];
255      end
256  //
257  // Bits 1-7's write routine
258  //
259  always @(posedge MR or posedge WR_bar)
260    if(MR)
261      begin
262        FOW          <= 1'b0;
263        sr_a         <= 1'b0;
264        dq_sel [2:0] <= 3'b000;
265      end
266    else
267      begin
268        if(EN_bar == 0 && RD_bar == 1)
269          if(sel_addr == 3'b000)
270            begin
271              sr_a         <= DIN[1];
272              FOW          <= DIN[2];
273              dq_sel [2:0] <= DIN[6:4];
274            end
275      end
276
277  //
278  // The Control reg writes are handled here
279  //
280  always @(posedge MR or posedge WR_bar)
281    if(MR)
282      begin
283        OD      <= 1'b0;
284        BIT_CTL <= 1'b0;
285        STP_SPLY<= 1'b0;
286        STPEN   <= 1'b0;
287        EN_FOW  <= 1'b0;
288        PPM     <= 1'b0;
289        LLM     <= 1'b0;
290      end
291    else
292      begin
293        if(EN_bar == 0 && RD_bar == 1)
294          if(sel_addr == 3'b101)
295            begin
296              OD      <= DIN[6];
297              BIT_CTL <= DIN[5];
298              STP_SPLY<= DIN[4];
299              STPEN   <= DIN[3];
300              EN_FOW  <= DIN[2];
301              PPM     <= DIN[1];
302              LLM     <= DIN[0];
303            end
304      end
305
306
307  //--------------------------------------------------------------------------
308  //  Transparent address latch
309  //--------------------------------------------------------------------------
310
311  always @(ADS_bar or ADDRESS or EN_bar)
312    if(!ADS_bar && !EN_bar)
313      sel_addr = ADDRESS;
314
315  //--------------------------------------------------------------------------
316  // Interrupt flag register clearing (What is not handled in onewiremaster.v)
317  //--------------------------------------------------------------------------
318
319  wire acint_reset = MR || (clear_interrupts); // synchronized
320                                               // set_activate_intr - SDS
321
322  always @(posedge acint_reset or posedge RD_bar)
323    if(acint_reset)
324      clr_activate_intr <= 1'b0;
325    else
326      if(EN_bar == 0 && WR_bar == 1)
327        if(sel_addr == 3'b010)
328          clr_activate_intr <= 1'b1;
329
330  wire rbf_reset = (read_op && (sel_addr == 3'b001));
331
332  always @(posedge MR or posedge FSM_CLK)
333    if (MR)
334      pd <= 1'b0;
335    else if (reset_owr)
336      pd <= 1'b1;
337    else if (clr_activate_intr)  // This causes pd to wait for a clk to clear
338      pd <= 1'b0;
339    else
340      pd <= pd;
341
342  //
343  // The following two blocks handle tbe
344  // The lower is the psuedo asynch portion which is synched up
345  //  in the upper section.
346  //
347  always @(posedge FSM_CLK or posedge MR)
348    if (MR)
349      tbe <= 1'b1;
350    else
351      tbe <= ~xmit_buffer_full;
352
353  always @(posedge MR or posedge WR_bar or posedge OneWireIO_eq_Load)
354    if(MR)
355      xmit_buffer_full <= 1'b0;
356    else if (OneWireIO_eq_Load)
357      xmit_buffer_full <= 1'b0;
358    else
359      if(EN_bar == 0 && RD_bar == 1)
360        if(sel_addr == 3'b001)
361          xmit_buffer_full <= 1'b1;
362
363endmodule // one_wire_interface
364
Note: See TracBrowser for help on using the repository browser.