Forum Discussion
Altera_Forum
Honored Contributor
14 years ago// ADXL clock= 500,000samples of 50Mhz/100Hz
// ADXL address= 0x1D/11101 (alt address pin grounded) module ADXL_Read(clk_50, I2C_sclk, I2C_sdat, key0, key1, clk_st, data1); input clk_50; output I2C_sclk; output data1; inout I2C_sdat; input key0; //Trigger0 to reset input key1; //Trigger1 to begin output clk_st; reg [30:0] a; reg [30:0] b; reg clk; //Clk for slave reg clk_signaltap; //Clk for signaltap2 reg q; //Register for Trigger reg [10:0] step; reg [6:0] sl_ad = 7'b0011101; // Slave Address reg [7:0] reg_ad = 8'h2D; // Register Address reg [7:0] data1; // Databyte#1 reg sclk; reg sdat; initial begin step = 0; q = 0; end always @(posedge clk_50) begin if(a == 1000000) //Clock for Slave with sample 2a begin clk = ~clk; a = 1; end else a = a + 1; //Signaltap begin if(b == 500000) //Clock for Signaltap2 begin clk_signaltap = ~clk_signaltap; b = 1; end else b = b + 1; end //Signaltap end always @(posedge clk_50) //Trigger Condition case({!key1, !key0}) //Active low 2'b00 : q <= q; 2'b10 : q <= 1; //Set 2'b01 : q <= 0; //Reset endcase always @(posedge clk) begin if (q == 1) begin case(step) //Initial 0: begin sclk = 1; sdat = 1; step = 1; end //1.Start 1: begin sclk = 1; sdat = 0; step = 2; end 2: begin sclk = 0; sdat = 0; step = 3; end //2.Slave add 3: begin sclk = 0; sdat = sl_ad[6]; step = 4; end 4: begin sclk = 1; sdat = sl_ad[6]; step = 5; end 5: begin sclk = 0; sdat = sl_ad[5]; step = 6; end 6: begin sclk = 1; sdat = sl_ad[5]; step = 7; end 7: begin sclk = 0; sdat = sl_ad[4]; step = 8; end 8: begin sclk = 1; sdat = sl_ad[4]; step = 9; end 9: begin sclk = 0; sdat = sl_ad[3]; step = 10; end 10: begin sclk =1; sdat = sl_ad[3]; step = 11; end 11: begin sclk = 0; sdat = sl_ad[2]; step = 12; end 12: begin sclk = 1; sdat = sl_ad[2]; step = 13; end 13: begin sclk = 0; sdat = sl_ad[1]; step = 14; end 14: begin sclk = 1; sdat = sl_ad[1]; step = 15; end 15: begin sclk = 0; sdat = sl_ad[0]; step = 16; end 16: begin sclk = 1; sdat = sl_ad[0]; step = 17; end //3.sdat = 0 17: begin sclk = 0; sdat = 0; step = 18; end 18: begin sclk = 1; sdat = 0; step = 19; end //4.Acknowledge 19: begin sclk = 0; sdat = 1'bz; step = 20; end 20: begin sclk = 1; sdat = 1'bz; if (I2C_sdat == 1) step = 20; else step = 21; end //5.Reg add 21: begin sclk = 0; sdat = reg_ad[7]; step = 22; end //7 22: begin sclk = 1; sdat = reg_ad[7]; step = 23; end 23: begin sclk = 0; sdat = reg_ad[6]; step = 24; end //6 24: begin sclk = 1; sdat = reg_ad[6]; step = 25; end 25: begin sclk = 0; sdat = reg_ad[5]; step = 26; end //5 26: begin sclk = 1; sdat = reg_ad[5]; step = 27; end 27: begin sclk = 0; sdat = reg_ad[4]; step = 28; end //4 28: begin sclk = 1; sdat = reg_ad[4]; step = 29; end 29: begin sclk = 0; sdat = reg_ad[3]; step = 30; end //3 30: begin sclk = 1; sdat = reg_ad[3]; step = 31; end 31: begin sclk = 0; sdat = reg_ad[2]; step = 32; end //2 32: begin sclk = 1; sdat = reg_ad[2]; step = 33; end 33: begin sclk = 0; sdat = reg_ad[1]; step = 34; end //1 34: begin sclk = 1; sdat = reg_ad[1]; step = 35; end 35: begin sclk = 0; sdat = reg_ad[0]; step = 36; end //0 36: begin sclk = 1; sdat = reg_ad[0]; step = 37; end //6.Acknowledge 37: begin sclk = 0; sdat = 1'bz; step = 38; end 38: begin sclk = 1; sdat = 1'bz; if (I2C_sdat == 1) step = 38; else step = 39; end //7.Start 39: begin sclk = 0; sdat = 0; step = 40; end //sclk= 0, sdat= 0 40: begin sclk = 1; sdat = 1; step = 41; end //sclk= 1, sdat= 1 41: begin sclk = 1; sdat = 0; step = 42; end //sclk= 1, sdat= 0 42: begin sclk = 0; sdat = 0; step = 45; end //sclk= 0, sdat= 0 --------------- //8.Slave Add 45: begin sclk = 0; sdat = sl_ad[6]; step = 46; end //6 46: begin sclk = 1; sdat = sl_ad[6]; step = 47; end 47: begin sclk = 0; sdat = sl_ad[5]; step = 48; end //5 48: begin sclk = 1; sdat = sl_ad[5]; step = 49; end 49: begin sclk = 0; sdat = sl_ad[4]; step = 50; end //4 50: begin sclk = 1; sdat = sl_ad[4]; step = 51; end 51: begin sclk = 0; sdat = sl_ad[3]; step = 52; end //3 52: begin sclk = 1; sdat = sl_ad[3]; step = 53; end 53: begin sclk = 0; sdat = sl_ad[2]; step = 54; end //2 54: begin sclk = 1; sdat = sl_ad[2]; step = 55; end 55: begin sclk = 0; sdat = sl_ad[1]; step = 56; end //1 56: begin sclk = 1; sdat = sl_ad[1]; step = 57; end 57: begin sclk = 0; sdat = sl_ad[0]; step = 58; end //0 58: begin sclk = 1; sdat = sl_ad[0]; step = 59; end //9.sdat = 1 59: begin sclk = 0; sdat = 1; step = 60; end 60: begin sclk = 1; sdat = 1; step = 61; end //10.Acknowledge 61: begin sclk = 0; sdat = 1'bz; step = 62; end 62: begin sclk = 1; sdat = 1'bz; if (I2C_sdat == 1) step = 62; else step = 63; end //11.Databyte#1 63: begin sclk = 0; sdat = 1'bz; step = 64; end //Databyte#1 bit 7 64: begin sclk = 1; sdat = 1'bz; data1[7] = I2C_sdat; step = 65; end 65: begin sclk = 0; sdat = 1'bz; step = 66; end //6 66: begin sclk = 1; sdat = 1'bz; data1[6] = I2C_sdat; step = 67; end 67: begin sclk = 0; sdat = 1'bz; step = 68; end //5 68: begin sclk = 1; sdat = 1'bz; data1[5] = I2C_sdat; step = 69; end 69: begin sclk = 0; sdat = 1'bz; step = 70; end //4 70: begin sclk = 1; sdat = 1'bz; data1[4] = I2C_sdat; step = 71; end 71: begin sclk = 0; sdat = 1'bz; step = 72; end //3 72: begin sclk = 1; sdat = 1'bz; data1[3] = I2C_sdat; step = 73; end 73: begin sclk = 0; sdat = 1'bz; step = 74; end //2 74: begin sclk = 1; sdat = 1'bz; data1[2] = I2C_sdat; step = 75; end 75: begin sclk = 0; sdat = 1'bz; step = 76; end //1 76: begin sclk = 1; sdat = 1'bz; data1[1] = I2C_sdat; step = 77; end 77: begin sclk = 0; sdat = 1'bz; step = 78; end //0 78: begin sclk = 1; sdat = 1'bz; data1[0] = I2C_sdat; step = 79; end //12.Acknowledge 79: begin sclk = 0; sdat = 1'bz; step = 80; end 80: begin sclk = 1; sdat = 1'bz; if (I2C_sdat == 1) step = 80; else step = 81; end //13.Stop 81: begin sclk = 1; sdat = 0; step = 82; end //sclk= 1, sdat= 0 82: begin sclk = 1; sdat = 1; step = 83; end //sclk= 1, sdat= 1 83: begin sclk = 1; sdat = 1; end endcase end end assign I2C_sclk = sclk; assign I2C_sdat = sdat; assign clk_st = clk_signaltap; endmodule Now problem's solved. I also do some modification so that I feed each new data at sdat when the sclk is low(instead of when it was high) and I read the needed data when the sclk is high. That way I could be sure although if there is any delay when the data is being transmited by the slave, I could still get the right data. Thank you so much Daixiwen. Without your help, I may still stuck in this problem now.