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

Subversion Repositories sockit_owm

[/] [sockit_owm/] [trunk/] [hdl/] [onewire_slave_model.v] - Diff between revs 2 and 3

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 3
Line 1... Line 1...
 
//////////////////////////////////////////////////////////////////////////////
 
//                                                                          //
 
//  1-wire (owr) slave model                                                //
 
//                                                                          //
 
//  Copyright (C) 2010  Iztok Jeras                                         //
 
//                                                                          //
 
//////////////////////////////////////////////////////////////////////////////
 
//                                                                          //
 
//  This RTL is free hardware: you can redistribute it and/or modify        //
 
//  it under the terms of the GNU Lesser General Public License             //
 
//  as published by the Free Software Foundation, either                    //
 
//  version 3 of the License, or (at your option) any later version.        //
 
//                                                                          //
 
//  This RTL is distributed in the hope that it will be useful,             //
 
//  but WITHOUT ANY WARRANTY; without even the implied warranty of          //
 
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           //
 
//  GNU General Public License for more details.                            //
 
//                                                                          //
 
//  You should have received a copy of the GNU General Public License       //
 
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.   //
 
//                                                                          //
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
`timescale 1us / 1ns
 
 
 
module onewire_slave_model #(
 
  // time slot (min=15.0, typ=30.0, max=60.0)
 
  parameter TS = 30.0
 
)(
 
  // configuration
 
  input  wire ena,    // response enable
 
  input  wire ovd,    // overdrive mode select
 
  input  wire dat_r,  // read data
 
  output wire dat_w,  // write data
 
  // 1-wire
 
  inout wire owr
 
);
 
 
 
// IO
 
reg pul;
 
reg dat;
 
 
 
// events
 
event sample_dat;
 
event sample_rst;
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
// IO
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
// onewire open collector signal
 
assign owr = pul & ena ? 1'b0 : 1'bz;
 
 
 
// read data output
 
assign dat_w = ena ? dat : 1'bz;
 
 
 
//////////////////////////////////////////////////////////////////////////////
 
// events inside a cycle
 
//////////////////////////////////////////////////////////////////////////////
 
 
 
// power up state
 
initial pul  <= 1'b0;
 
 
 
always @ (negedge owr)  if (ena)  transfer (ovd, dat_r, dat);
 
 
 
task automatic transfer (
 
  input  ovd,
 
  input  dat_r,
 
  output dat_w
 
); begin
 
  // provide read data response
 
  pul = ~dat_r;
 
  // wait 1 time slot
 
  if (ovd)  #(1*TS/8);
 
  else      #(1*TS);
 
  // write data is sampled here
 
  -> sample_dat;
 
  dat_w = owr;
 
  // release the wire
 
  pul = 1'b0;
 
  // fork into data or reset cycle
 
  fork
 
    // transfer data
 
    begin : transfer_dat
 
      // if cycle ends before reset is detected
 
      if (~owr) @ (posedge owr);
 
      // disable reset path
 
      disable transfer_rst;
 
    end
 
    // transfer reset
 
    begin : transfer_rst
 
      // wait 7 time slots
 
      if (ovd)  #(7*TS/8);
 
      else      #(7*TS);
 
      // reset is sampled here
 
      -> sample_rst;
 
      // if reset is detected disable data path
 
      if (~owr) disable transfer_dat;
 
      // wait for reset low to end
 
      @ (posedge owr)
 
      // wait 1 time slot
 
      if (ovd)  #(1*TS/8);
 
      else      #(1*TS);
 
      // provide presence pulse
 
      pul = 1'b1;
 
      // wait 4 time slot
 
      if (ovd)  #(4*TS/8);
 
      else      #(4*TS);
 
      // release the wire
 
      pul = 1'b0;
 
    end
 
  join
 
end endtask
 
 
 
endmodule
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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