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

Subversion Repositories i2c

[/] [i2c/] [trunk/] [rtl/] [verilog/] [i2c_master_top.v] - Diff between revs 27 and 29

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

Rev 27 Rev 29
Line 35... Line 35...
////                                                             ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
 
 
//  CVS Log
//  CVS Log
//
//
//  $Id: i2c_master_top.v,v 1.6 2002-11-30 22:24:40 rherveille Exp $
//  $Id: i2c_master_top.v,v 1.7 2002-12-26 15:02:32 rherveille Exp $
//
//
//  $Date: 2002-11-30 22:24:40 $
//  $Date: 2002-12-26 15:02:32 $
//  $Revision: 1.6 $
//  $Revision: 1.7 $
//  $Author: rherveille $
//  $Author: rherveille $
//  $Locker:  $
//  $Locker:  $
//  $State: Exp $
//  $State: Exp $
//
//
// Change History:
// Change History:
//               $Log: not supported by cvs2svn $
//               $Log: not supported by cvs2svn $
 
//               Revision 1.6  2002/11/30 22:24:40  rherveille
 
//               Cleaned up code
 
//
//               Revision 1.5  2001/11/10 10:52:55  rherveille
//               Revision 1.5  2001/11/10 10:52:55  rherveille
//               Changed PRER reset value from 0x0000 to 0xffff, conform specs.
//               Changed PRER reset value from 0x0000 to 0xffff, conform specs.
//
//
 
 
// synopsys translate_off
// synopsys translate_off
Line 121... Line 124...
        wire irxack;
        wire irxack;
        reg  rxack;       // received aknowledge from slave
        reg  rxack;       // received aknowledge from slave
        reg  tip;         // transfer in progress
        reg  tip;         // transfer in progress
        reg  irq_flag;    // interrupt pending flag
        reg  irq_flag;    // interrupt pending flag
        wire i2c_busy;    // bus busy (start signal detected)
        wire i2c_busy;    // bus busy (start signal detected)
 
        wire i2c_al;      // i2c bus arbitration lost
 
        reg  al;          // status register arbitration lost bit
 
 
        //
        //
        // module body
        // module body
        //
        //
 
 
        // generate internal reset
        // generate internal reset
        wire rst_i = arst_i ^ ARST_LVL;
        wire rst_i = arst_i ^ ARST_LVL;
 
 
 
        // generate wishbone signals
 
        wire wb_wacc = wb_cyc_i & wb_stb_i & wb_we_i;
 
 
        // generate acknowledge output signal
        // generate acknowledge output signal
        always @(posedge wb_clk_i)
        always @(posedge wb_clk_i)
          wb_ack_o <= #1 wb_cyc_i & wb_stb_i & ~wb_ack_o; // because timing is always honored
          wb_ack_o <= #1 wb_cyc_i & wb_stb_i & ~wb_ack_o; // because timing is always honored
 
 
        // assign DAT_O
        // assign DAT_O
Line 148... Line 156...
            3'b110: wb_dat_o = cr;
            3'b110: wb_dat_o = cr;
            3'b111: wb_dat_o = 0;   // reserved
            3'b111: wb_dat_o = 0;   // reserved
          endcase
          endcase
        end
        end
 
 
 
 
        // generate registers
        // generate registers
        always @(posedge wb_clk_i or negedge rst_i)
        always @(posedge wb_clk_i or negedge rst_i)
          if (!rst_i)
          if (!rst_i)
            begin
            begin
                prer <= #1 16'hffff;
                prer <= #1 16'hffff;
Line 166... Line 173...
                ctr  <= #1  8'h0;
                ctr  <= #1  8'h0;
                txr  <= #1  8'h0;
                txr  <= #1  8'h0;
                cr   <= #1  8'h0;
                cr   <= #1  8'h0;
            end
            end
          else
          else
            if (wb_cyc_i && wb_stb_i && wb_we_i)
            if (wb_wacc)
              begin
              case (wb_adr_i) // synopsis full_case parallel_case
                  if (!wb_adr_i[2])
                 3'b000 : prer [ 7:0] <= #1 wb_dat_i;
                    case (wb_adr_i[1:0]) // synopsis full_case parallel_case
                 3'b001 : prer [15:8] <= #1 wb_dat_i;
                      2'b00 : prer [ 7:0] <= #1 wb_dat_i;
                 3'b010 : ctr         <= #1 wb_dat_i;
                      2'b01 : prer [15:8] <= #1 wb_dat_i;
                 3'b011 : txr         <= #1 wb_dat_i;
                      2'b10 : ctr         <= #1 wb_dat_i;
 
                      2'b11 : txr         <= #1 wb_dat_i;
 
                    endcase
                    endcase
                  else
 
                    if (core_en && (wb_adr_i[1:0] == 2'b00) ) // only take new commands when i2c core enabled, pending commands are finished
        // generate command register (special case)
 
        always @(posedge wb_clk_i or negedge rst_i)
 
          if (~rst_i)
 
            cr <= #1 8'h0;
 
          else if (wb_rst_i)
 
            cr <= #1 8'h0;
 
          else if (wb_wacc)
 
            begin
 
                if (core_en & (wb_adr_i == 3'b100) )
                      cr <= #1 wb_dat_i;
                      cr <= #1 wb_dat_i;
              end
              end
            else
            else
              begin
              begin
                  if (done)
                if (done | i2c_al)
                    cr[7:4] <= #1 4'h0; // clear command bits when done
                    cr[7:4] <= #1 4'h0; // clear command bits when done
 
                                                // or when aribitration lost
                  cr[2:1] <= #1 2'b00;  // reserved bits
                cr[2:1] <= #1 2'b0;             // reserved bits
                  cr[0]   <= #1 cr[0] && irq_flag; // clear when irq_flag cleared
                cr[0]   <= #1 cr[0] & irq_flag; // clear when irq_flag is cleared
              end
              end
 
 
 
 
        // decode command register
        // decode command register
        wire sta  = cr[7];
        wire sta  = cr[7];
Line 218... Line 231...
                .din      ( txr          ),
                .din      ( txr          ),
                .cmd_ack  ( done         ),
                .cmd_ack  ( done         ),
                .ack_out  ( irxack       ),
                .ack_out  ( irxack       ),
                .dout     ( rxr          ),
                .dout     ( rxr          ),
                .i2c_busy ( i2c_busy     ),
                .i2c_busy ( i2c_busy     ),
 
                .i2c_al   ( i2c_al       ),
                .scl_i    ( scl_pad_i    ),
                .scl_i    ( scl_pad_i    ),
                .scl_o    ( scl_pad_o    ),
                .scl_o    ( scl_pad_o    ),
                .scl_oen  ( scl_padoen_o ),
                .scl_oen  ( scl_padoen_o ),
                .sda_i    ( sda_pad_i    ),
                .sda_i    ( sda_pad_i    ),
                .sda_o    ( sda_pad_o    ),
                .sda_o    ( sda_pad_o    ),
                .sda_oen  ( sda_padoen_o )
                .sda_oen  ( sda_padoen_o )
        );
        );
 
 
 
 
        // status register block + interrupt request signal
        // status register block + interrupt request signal
        always @(posedge wb_clk_i or negedge rst_i)
        always @(posedge wb_clk_i or negedge rst_i)
          if (!rst_i)
          if (!rst_i)
            begin
            begin
 
                al       <= #1 1'b0;
                rxack    <= #1 1'b0;
                rxack    <= #1 1'b0;
                tip      <= #1 1'b0;
                tip      <= #1 1'b0;
                irq_flag <= #1 1'b0;
                irq_flag <= #1 1'b0;
            end
            end
          else if (wb_rst_i)
          else if (wb_rst_i)
            begin
            begin
 
                al       <= #1 1'b0;
                rxack    <= #1 1'b0;
                rxack    <= #1 1'b0;
                tip      <= #1 1'b0;
                tip      <= #1 1'b0;
                irq_flag <= #1 1'b0;
                irq_flag <= #1 1'b0;
            end
            end
          else
          else
            begin
            begin
 
                al       <= #1 i2c_al | (al & ~sta);
                rxack    <= #1 irxack;
                rxack    <= #1 irxack;
                tip      <= #1 (rd | wr);
                tip      <= #1 (rd | wr);
                irq_flag <= #1 (done | irq_flag) & ~iack; // interrupt request flag is always generated
                irq_flag <= #1 (done | i2c_al | irq_flag) & ~iack; // interrupt request flag is always generated
            end
            end
 
 
        // generate interrupt request signals
        // generate interrupt request signals
        always @(posedge wb_clk_i or negedge rst_i)
        always @(posedge wb_clk_i or negedge rst_i)
          if (!rst_i)
          if (!rst_i)
Line 260... Line 276...
            wb_inta_o <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
            wb_inta_o <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
 
 
        // assign status register bits
        // assign status register bits
        assign sr[7]   = rxack;
        assign sr[7]   = rxack;
        assign sr[6]   = i2c_busy;
        assign sr[6]   = i2c_busy;
        assign sr[5:2] = 4'h0; // reserved
        assign sr[5]   = al;
 
        assign sr[4:2] = 3'h0; // reserved
        assign sr[1]   = tip;
        assign sr[1]   = tip;
        assign sr[0]   = irq_flag;
        assign sr[0]   = irq_flag;
 
 
endmodule
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.