<=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
- 一 语音识别基本概念
- 一文了解通用行为识别ActionRecognition:了解及分类
- 1 我就想让计算机识别一瓶可乐,并把他拿起来
- 【Ubuntu】基于C++实现人脸识别
- 目标识别基础 OpenMV 图片对象
- 高分三号1米分辨率飞机检测识别数据集
- android基于虹软的人脸识别+测温+道闸项目实现
- 华为手机分屏手势怎么设置
- web程序送消息给闸机的串口实现人脸识别自动开闸
- 万无一失的OpenMV识别矩形、圆形、三角形方法