6 PAJ7620U2手势识别——配置手势数据寄存器( 二 )

<=1'b0;elsecfg_start<=i2c_end;always@(*)case(mode)3'd0 :slave_addr = {SLAVE_ID,1'b0};3'd1 :beginslave_addr= {SLAVE_ID,1'b0};device_addr = SENSOR_ADDR;wr_data= 8'h00;end3'd2 :beginslave_addr= {SLAVE_ID,1'b0};device_addr = 8'h00;end3'd3 :slave_addr={SLAVE_ID,1'b1};3'd4 : beginslave_addr <=cfg_data[23:16];device_addr <=cfg_data[15:8];wr_data<=cfg_data[7:0];end3'd5 : begin slave_addr<={SLAVE_ID,1'b0};device_addr <=DATA_ADDR;endendcase////分频计数器进行计数always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_clk<=5'd0;elseif(cnt_clk == CNT_CLK_MAX - 1'b1)cnt_clk<=5'd0;elsecnt_clk<=cnt_clk + 1'b1;//产生i2c驱动时钟 always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)i2c_clk<=1'b0;elseif(cnt_clk == CNT_CLK_MAX - 1'b1)i2c_clk<=~i2c_clk;elsei2c_clk<=i2c_clk;////状态机第一段always@(posedge i2c_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)c_state<=IDLE;elsec_state<=n_state;//状态机第二段always@(*)case(c_state)IDLE: if((skip_en_0 == 1'b1)||(skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_3 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=START;elsen_state=IDLE;START: if((skip_en_0 == 1'b1)||(skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_3 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=SLAVE_ADDR;elsen_state=START;SLAVE_ADDR : if(skip_en_0 == 1'b1)n_state=WAIT;elseif((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_3 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=ACK_1;elsen_state=SLAVE_ADDR;ACK_1: if((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=DEVICE_ADDR;elseif(skip_en_3 == 1'b1)n_state=DATA;elsen_state=ACK_1;DEVICE_ADDR : if((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=ACK_2;elsen_state=DEVICE_ADDR;ACK_2: if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))n_state=DATA;elseif((skip_en_2 == 1'b1)||(skip_en_5 == 1'b1))n_state=STOP;elsen_state=ACK_2;DATA: if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))n_state=ACK_3;elseif(skip_en_3 == 1'b1)n_state=NACK;elseif(error_en == 1'b1)n_state=IDLE;elsen_state=DATA;ACK_3: if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))n_state=STOP;elsen_state=ACK_3;WAIT: if(skip_en_0 == 1'b1)n_state=STOP;elsen_state=WAIT;NACK: if(skip_en_3 == 1'b1)n_state=STOP;elsen_state=NACK;STOP: if((skip_en_0 == 1'b1)||(skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_3 == 1'b1)||(skip_en_4 == 1'b1)||(skip_en_5 == 1'b1))n_state=IDLE;elsen_state=STOP;default: n_state=IDLE;endcase//状态机第三段 always@(posedge i2c_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)begincnt_wait <=10'd0 ;skip_en_0 <=1'b0 ;skip_en_1 <=1'b0 ;skip_en_2<=1'b0 ;skip_en_3<=1'b0;skip_en_4<=1'b0 ;skip_en_5<=1'b0 ;error_en <=1'b0 ;cnt_i2c_clk <=2'd0 ;cnt_bit<=3'd0 ;cnt_delay <=10'd0 ;mode<=3'd0 ;i2c_end<=1'b0 ;endelsecase(c_state)IDLE:begincnt_wait<=cnt_wait + 1'b1;if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd0))skip_en_0<=1'b1;elseskip_en_0<=1'b0;if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd1))skip_en_1<=1'b1;elseskip_en_1<=1'b0; if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd2))skip_en_2<=1'b1;elseskip_en_2<=1'b0; if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd3))skip_en_3<=1'b1;elseskip_en_3<=1'b0; if((i2c_start == 1'b1)&&(mode == 3'd4))skip_en_4<=1'b1;elseskip_en_4<=1'b0; if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd5))skip_en_5<=1'b1;elseskip_en_5<=1'b0;endSTART:begincnt_i2c_clk<=cnt_i2c_clk + 1'b1;if((cnt_i2c_clk == 2'd2)&&(mode == 3'd0))skip_en_0<=1'b1;elseskip_en_0<=1'b0;if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1))skip_en_1<=1'b1;elseskip_en_1<=1'b0;if((cnt_i2c_clk == 2'd2)&&(mode == 3'd2))skip_en_2