<=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;end3'd6 :slave_addr={SLAVE_ID,1'b1};default :beginslave_addr <=8'd0 ;device_addr <=8'd0 ;wr_data<=8'd0 ;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)||(skip_en_6 == 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)||(skip_en_6 == 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)||(skip_en_6 == 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)||(skip_en_6 == 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)||(skip_en_6 == 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)||(skip_en_6 == 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)||(skip_en_6 == 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 ;skip_en_6 <=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
- 6 PAJ7620U2手势识别——配置手势数据寄存器
- 狩猎者完整版是什么电影
- 三星完成中国5G第一阶段技术试验,最早2018年商用
- 空心菜是抽筋菜吃完会抽筋吗 空心菜吃多会抽筋说法是真的吗
- mysql存储animoji_iPhone X小技巧Animoji录制完可直接套
- 加州房价预测 [Hands On ML] 2. 一个完整的机器学习项目
- 华为手机分屏手势怎么设置
- 使用定时器编写led闪烁
- 小白看完都学会了!五年Android开发者小米、阿里面经,大厂面经合集
- 【完整详细教程】Ubuntu22