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

Subversion Repositories i2s_to_wb

[/] [i2s_to_wb/] [trunk/] [sim/] [models/] [i2s_rx_bfm.v] - Rev 2

Compare with Previous | Blame | View Log

// --------------------------------------------------------------------
//
// --------------------------------------------------------------------
 
`timescale 1ns/10ps
 
 
module
  i2s_rx_bfm
  #(
    parameter DELAY = 3
  ) 
  (
    input   [31:0]  bfm_data_i,
    output  [31:0]  bfm_data_o,
    input   [31:0]  bfm_addr_i,
    input   [3:0]   bfm_sel_i,
    input           bfm_we_i,
    input           bfm_cyc_i,
    input           bfm_stb_i,
    output          bfm_ack_o,
    output          bfm_err_o,
    output          bfm_rty_o,
 
    output          bfm_sck_o, 
    output          bfm_ws_o,
    input           bfm_sck_i, 
    input           bfm_ws_i,
    input           bfm_sd_i,
 
    input           bfm_clk_i, 
    input           bfm_rst_i
  );
 
  //---------------------------------------------------
  //  init regs
  reg enable_r;
 
  initial
    begin
      enable_r <= 1'b0;
    end
 
 
  //---------------------------------------------------
  //  enable
  task enable_bfm;
    begin
 
    enable_r <= 1'b1;
 
    $display( "-#- %15.t | %m: BFM enabled.", $time );
 
    end
  endtask  
 
 
  //---------------------------------------------------
  //  disable
  task disable_bfm;
    begin
 
    enable_r <= 1'b0;
 
    $display( "-#- %15.t | %m: BFM disabled.", $time );
 
    end
  endtask  
 
 
  //---------------------------------------------------
  //  generate ws
  reg [5:0] count;
 
  always @(negedge bfm_clk_i)
    if( bfm_rst_i )
      count <= 0;
    else
      count <= count + 1;
 
  //---------------------------------------------------
  //  
  reg [31:0] i2s_data;
 
  always @(posedge bfm_sck_i)
    i2s_data <= { i2s_data[30:0], bfm_sd_i };
 
  reg [1:0] bfm_ws_i_r;
 
  always @(posedge bfm_sck_i)
    bfm_ws_i_r <= {bfm_ws_i_r[0], bfm_ws_i};
 
  wire bfm_ws_rise_edge;
  wire bfm_ws_fall_edge;
 
  assign bfm_ws_rise_edge = (bfm_ws_i_r[0] ^ bfm_ws_i_r[1]) & bfm_ws_i_r[0];  // right
  assign bfm_ws_fall_edge = (bfm_ws_i_r[0] ^ bfm_ws_i_r[1]) & ~bfm_ws_i_r[0]; // left
 
 
  //---------------------------------------------------
  //  
  always @(posedge bfm_sck_i)
    begin
 
      if(bfm_ws_fall_edge)
        $display( "-#- %15.t | %m: right channel is 0x%8.x.", $time, i2s_data );
 
      if(bfm_ws_rise_edge)
        $display( "-#- %15.t | %m: left  channel is 0x%8.x.", $time, i2s_data );
 
    end  
 
 
  //---------------------------------------------------
  //  assign outputs
  assign #DELAY bfm_ws_o   = enable_r ? count[5]  : 1'bz;
  assign #DELAY bfm_sck_o  = enable_r ? bfm_clk_i : 1'bz;
 
 
endmodule
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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