Advertisement
Guest User

Untitled

a guest
Oct 17th, 2016
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. `include "macros.vh"
  3.  
  4. module i2s_slave #(parameter SampleSize=16)
  5. (
  6.    
  7.     input iClk,
  8.     input iRst_n,
  9.     input iLrcIn,
  10.     input iLrcOut,
  11.     input iBclk,
  12.     input iDin,
  13.  
  14.     input [SampleSize-1:0] iLeftOutData,
  15.     input [SampleSize-1:0] iRightOutData,
  16.    
  17.  
  18.     output oDout,
  19.     output  [SampleSize-1:0] oLeftInData,
  20.     output  [SampleSize-1:0] oRightInData,
  21.     output  reg oLeftInReady,
  22.     output  reg oLeftOutStart,
  23.     output  reg oRightInReady,
  24.     output  reg oRightOutStart
  25. );
  26.  
  27.     reg [SampleSize-1 : 0] rLeftInDataSR;
  28.     reg [SampleSize-1 : 0] rLeftOutDataSR;
  29.     reg [SampleSize-1 : 0] rRightInDataSR;
  30.     reg [SampleSize-1 : 0] rRightOutDataSR;
  31.  
  32.     wire [SampleSize-1 : 0] wLeftInDataSrShifted;
  33.     wire [SampleSize-1 : 0] wLeftOutDataSrShifted;
  34.     wire [SampleSize-1 : 0] wRightInDataSrShifted;
  35.     wire [SampleSize-1 : 0] wRightOutDataSrShifted;
  36.  
  37.     reg rLastBclk;
  38.     reg rLastLrcIn;
  39.     reg rLastLrcOut;
  40.  
  41.     wire wBclkPosEdge;
  42.     wire wBclkNegEdge;
  43.  
  44.     localparam CounterSize = `CEIL_LOG2(SampleSize+1);
  45.     reg [CounterSize-1:0] rCntIn;
  46.  
  47.     assign wBclkPosEdge = !rLastBclk & iBclk;
  48.     assign wBclkNegEdge = rLastBclk & !iBclk;
  49.  
  50.     assign wLrcInEdge       = rLastLrcIn != iLrcIn;
  51.     assign wLrcOutEdge      = rLastLrcOut != iLrcOut;
  52.  
  53.     assign oLeftInData = rLeftInDataSR & {SampleSize{oLeftInReady}};
  54.     assign oRightInData = rRightInDataSR & {SampleSize{oRightInReady}};
  55.  
  56.     assign wLeftInDataSrShifted     = {rLeftInDataSR[SampleSize-2:0], iDin};
  57.     assign wLeftOutDataSrShifted    = {rLeftOutDataSR[SampleSize-2:0], 1'b0};
  58.     assign wRightInDataSrShifted    = {rRightInDataSR[SampleSize-2:0], iDin};
  59.     assign wRightOutDataSrShifted   = {rRightOutDataSR[SampleSize-2:0], 1'b0};
  60.  
  61.     assign oDout = iLrcOut ? rRightOutDataSR[SampleSize-1] : rLeftOutDataSR[SampleSize-1];
  62.  
  63.     always @(posedge iClk) begin
  64.         rLastBclk <= iBclk;
  65.         if (!iRst_n) begin
  66.             rCntIn          <= {CounterSize{1'b0}};
  67.  
  68.             oLeftOutStart   <= 1'b0;
  69.             oRightOutStart  <= 1'b0;
  70.  
  71.             rLeftInDataSR   <= {SampleSize{1'd0}};
  72.             rLeftOutDataSR  <= {SampleSize{1'd0}};
  73.             rRightInDataSR  <= {SampleSize{1'd0}};
  74.             rRightOutDataSR <= {SampleSize{1'd0}};
  75.  
  76.             oLeftInReady    <= 1'b0;
  77.             oRightInReady   <= 1'b0;
  78.             rLastLrcIn      <= 1'b0;
  79.             rLastLrcOut     <= 1'b0;
  80.         end
  81.         else begin
  82.             if (wBclkPosEdge) begin
  83.                 rLastLrcIn  <= iLrcIn;
  84.                 rLastLrcOut <= iLrcOut;
  85.                 oRightOutStart  <= wLrcOutEdge & iLrcOut;
  86.                 oLeftOutStart   <= wLrcOutEdge & !iLrcOut;
  87.  
  88.                 if (wLrcInEdge) begin
  89.                     rCntIn <= 0;
  90.                     if (iLrcIn)
  91.                         rRightInDataSR  <= {SampleSize{1'd0}};
  92.                     else
  93.                         rLeftInDataSR   <= {SampleSize{1'd0}};
  94.                 end
  95.                 else begin
  96.                     if (rCntIn < SampleSize) begin
  97.                         rCntIn <= rCntIn+1;
  98.  
  99.                         if (iLrcIn)     // Right Channel
  100.                             rRightInDataSR  <= wRightInDataSrShifted;
  101.                         else            // Left Channel
  102.                             rLeftInDataSR   <= wLeftInDataSrShifted;
  103.                     end
  104.                     else begin
  105.                         oRightInReady   <= iLrcIn;
  106.                         oLeftInReady    <= !iLrcIn;
  107.                     end
  108.                 end
  109.  
  110.             end
  111.  
  112.             else if (wBclkNegEdge) begin
  113.  
  114.                
  115.                 if (wLrcOutEdge) begin
  116.                     rLeftOutDataSR  <= {SampleSize-1{1'b0}};
  117.                     rRightOutDataSR <= {SampleSize-1{1'b0}};
  118.                 end
  119.                 else begin
  120.                     if (iLrcOut)    // Right Channel
  121.                         rRightOutDataSR     <=  (oRightOutStart) ?  iRightOutData   : wRightOutDataSrShifted;
  122.                     else            // Left channel
  123.                         rLeftOutDataSR      <=  (oLeftOutStart) ?   iLeftOutData    : wLeftOutDataSrShifted;
  124.                 end
  125.             end
  126.         end
  127.     end
  128. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement