I2C for a sound program on DE2

Discussion in 'Embedded Systems and Microcontrollers' started by desichokra, Dec 6, 2010.

  1. desichokra

    Thread Starter New Member

    Dec 6, 2010
    1
    0
    I have no clue about verilog, can anyone help me turn this into VHDL?

    Code ( (Unknown Language)):
    1.  
    2. module i2c (
    3.     CLOCK,
    4.     I2C_SCLK,//I2C CLOCK
    5.      I2C_SDAT,//I2C DATA
    6.     I2C_DATA,//DATA:[SLAVE_ADDR,SUB_ADDR,DATA]
    7.     GO,      //GO transfor
    8.     END,     //END transfor
    9.     W_R,     //W_R
    10.     ACK,      //ACK
    11.     RESET,
    12.     //TEST
    13.     SD_COUNTER,
    14.     SDO
    15. );
    16.     input  CLOCK;
    17.     input  [23:0]I2C_DATA;    
    18.     input  GO;
    19.     input  RESET;    
    20.     input  W_R;
    21.      inout  I2C_SDAT;    
    22.     output I2C_SCLK;
    23.     output END;    
    24.     output ACK;
    25.  
    26. //TEST
    27.     output [5:0] SD_COUNTER;
    28.     output SDO;
    29.  
    30.  
    31. reg SDO;
    32. reg SCLK;
    33. reg END;
    34. reg [23:0]SD;
    35. reg [5:0]SD_COUNTER;
    36.  
    37. wire I2C_SCLK=SCLK | ( ((SD_COUNTER >= 4) & (SD_COUNTER <=30))? ~CLOCK :0 );
    38. wire I2C_SDAT=SDO?1'bz:0 ;
    39.  
    40. reg ACK1,ACK2,ACK3;
    41. wire ACK=ACK1 | ACK2 |ACK3;
    42.  
    43. //--I2C COUNTER
    44. always @(negedge RESET or posedge CLOCK ) begin
    45. if (!RESET) SD_COUNTER=6'b111111;
    46. else begin
    47. if (GO==0)
    48.     SD_COUNTER=0;
    49.     else
    50.     if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+1;    
    51. end
    52. end
    53. //----
    54.  
    55. always @(negedge RESET or  posedge CLOCK ) begin
    56. if (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; end
    57. else
    58. case (SD_COUNTER)
    59.     6'd0  : begin ACK1=0 ;ACK2=0 ;ACK3=0 ; END=0; SDO=1; SCLK=1;end
    60.     //start
    61.     6'd1  : begin SD=I2C_DATA;SDO=0;end
    62.     6'd2  : SCLK=0;
    63.     //SLAVE ADDR
    64.     6'd3  : SDO=SD[23];
    65.     6'd4  : SDO=SD[22];
    66.     6'd5  : SDO=SD[21];
    67.     6'd6  : SDO=SD[20];
    68.     6'd7  : SDO=SD[19];
    69.     6'd8  : SDO=SD[18];
    70.     6'd9  : SDO=SD[17];
    71.     6'd10 : SDO=SD[16];    
    72.     6'd11 : SDO=1'b1;//ACK
    73.  
    74.     //SUB ADDR
    75.     6'd12  : begin SDO=SD[15]; ACK1=I2C_SDAT; end
    76.     6'd13  : SDO=SD[14];
    77.     6'd14  : SDO=SD[13];
    78.     6'd15  : SDO=SD[12];
    79.     6'd16  : SDO=SD[11];
    80.     6'd17  : SDO=SD[10];
    81.     6'd18  : SDO=SD[9];
    82.     6'd19  : SDO=SD[8];    
    83.     6'd20  : SDO=1'b1;//ACK
    84.  
    85.     //DATA
    86.     6'd21  : begin SDO=SD[7]; ACK2=I2C_SDAT; end
    87.     6'd22  : SDO=SD[6];
    88.     6'd23  : SDO=SD[5];
    89.     6'd24  : SDO=SD[4];
    90.     6'd25  : SDO=SD[3];
    91.     6'd26  : SDO=SD[2];
    92.     6'd27  : SDO=SD[1];
    93.     6'd28  : SDO=SD[0];    
    94.     6'd29  : SDO=1'b1;//ACK
    95.  
    96.    
    97.     //stop
    98.     6'd30 : begin SDO=1'b0;    SCLK=1'b0; ACK3=I2C_SDAT; end    
    99.     6'd31 : SCLK=1'b1;
    100.     6'd32 : begin SDO=1'b1; END=1; end
    101.  
    102. endcase
    103. end
    104.  
    105.  
    106.  
    107. endmodule
    108.  
    109.  
     
    Last edited by a moderator: Dec 7, 2010
Loading...