PAJ7620U2手势识别——配置寄存器组(5)


前言

  上一章教程,小编带领各位读者完成了对0x00寄存器内数据的读取,读取出来的数据显示是正确的。本章教程开始进行寄存器组的配置,总共需要配置51个寄存器。具体的配置步骤请继续往下浏览。

一、为什么要配置寄存器组?

  在之前所有的章节的教程中呢,都是对“唤醒操作”进行配置和验证,直到上一章教程,我们读取出来了0x20这个数据,才代表唤醒操作结束,现在我们可以使用这个模块了。所以,我们需要参考官方数据手册,配置寄存器组,配置完成后才能进行数据的读取。

二、配置步骤

1.单个写操作步骤图

在这里插入图片描述
  细心的读者可以发现,单个写操作步骤图与前面激活bank0教程的步骤图是相同的。在这里呢,我们对51个寄存器写入数据,不能进行连续写操作,所以只能进行对寄存器数据单次写入,总共写入51次。将这51个寄存器配置好后,即可进行数据的读取了。

2.模块状态转移图绘制

在这里插入图片描述
  从IDLE状态到START状态,我们需要略微做一下修改,状态跳转条件修改为接收到一个开始信号。这个开始信号是从另外一个对51个寄存器寄存器配置的模块传入的,i2c控制模块结束信号就作为寄存器配置模块的开始信号,同时,寄存器配置模块的结束信号也作为i2c控制模块的开始信号。在这里光是文字描述会有些许拗口,各位读者可借助波形图和参考代码,辅助对本章教程的理解。

3.模块波形图绘制

在这里插入图片描述
  上述波形图是寄存器配置模块的波形图。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
  上述三张波形图是i2c控制模块波形图,为了便于各位读者观看,小编在这里采用分段绘制。根据绘制好的波形图,即可对代码进行修改,加以验证。

4.上板验证

  上板抓取信号波形,设置skip_en_4上升沿和寄存器计数器reg_num为1时触发:
在这里插入图片描述
抓取到的信号波形如下:
在这里插入图片描述
  可以发现,寄存器计数器从1开始计数,因为要配置51个计数器,所以最大值要计数到51,我们切换触发条件,设置skip_en_4上升沿和reg_num为51时触发,抓取到的波形如下所示:
在这里插入图片描述
  在末尾,mode信号由4变为5,表示配置寄存器组结束,该进行下一个模式的配置了。至此,我们验证成功。

5.参考代码(全)

//子模块:i2c控制模块
module  i2c_ctrl
(
	input	wire			sys_clk		,
	input	wire			sys_rst_n	,
	input	wire	[23:0]	cfg_data	,
	input	wire			i2c_start	,
	input	wire	[5:0]	reg_num		,
	
	output	wire			scl			,
	output	reg				cfg_start	,
	output	reg				i2c_clk		,
	output	reg		[2:0]	mode		,
	
	inout	wire			sda
);

localparam	CNT_CLK_MAX		=	5'd25	;
localparam	CNT_WAIT_MAX	=	10'd1000;
localparam	CNT_DELAY_MAX	=	10'd1000;
localparam	SLAVE_ID		=	7'h73	;
localparam	SENSOR_ADDR		=	8'hEF	;
localparam	IDLE		=	4'd0	,
			START		=	4'd1	,
			SLAVE_ADDR	=	4'd2	,
			WAIT		=	4'd3	,
			STOP		=	4'd4	,
			ACK_1		=	4'd5	,
			DEVICE_ADDR	=	4'd6	,
			ACK_2		=	4'd7	,
			DATA		=	4'd8	,
			ACK_3		=	4'd9	,
			NACK		=	4'd10	;

reg		[4:0]	cnt_clk		;	//分频计数器
reg		[9:0]	cnt_wait	;	//开始状态等待1000us计数器
reg				skip_en_0	;	//唤醒状态跳转信号
reg				skip_en_1	;	//激活bank0跳转信号
reg				skip_en_2	;	//配置0x00寄存器状态跳转信号
reg				skip_en_3	;	//读取0x00寄存器状态跳转信号
reg				skip_en_4	;	//配置51个寄存器组
reg				error_en	;	//读取出来的值不是0x20,错误信号
reg		[3:0]	n_state		;	//次态
reg		[3:0]	c_state		;	//现态	
reg		[1:0]	cnt_i2c_clk	;	//对i2c_clk分频时钟个数计数			
reg		[2:0]	cnt_bit		;	//对传输的8bit数据进行计数	
reg				i2c_scl		;	//就是SCL		
reg				i2c_sda		;	//SDA赋值给i2c_sda
reg		[9:0]	cnt_delay	;	//发送完指令后等待1000us计数器			
reg				i2c_end		;	//i2c结束信号	
reg		[7:0]	slave_addr	;	//不同模式下7'h73+1'bx
reg		[7:0]	device_addr	;	//不同模式下寄存器地址变化
reg		[7:0]	wr_data		;	//向地址写入的数据
reg		[7:0]	rec_data	;	//唤醒操作读取0x00寄存器数据寄存
reg				ack			;
wire			sda_in		;
wire			sda_en		;

assign	scl		=	i2c_scl		;
assign	sda_in	=	sda			;	//从设备发送到主机的数据
assign	sda_en	=	((c_state == ACK_1)||(c_state == ACK_2)||(c_state == ACK_3)||((c_state == DATA)&&(mode == 3'd3))) ? 1'b0 : 1'b1		;	//主机控制sda有效
assign	sda		=	(sda_en == 1'b1) ? i2c_sda : 1'bz  ;

always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		cfg_start  <=  1'b0  ;
	else
		cfg_start  <=  i2c_end  ;

always@(*)
	case(mode)
		3'd0	:slave_addr	=	{SLAVE_ID,1'b0}  ;
		3'd1	:begin
					slave_addr  =	{SLAVE_ID,1'b0}  ;
					device_addr	=	SENSOR_ADDR  ;
					wr_data		=	8'h00  ;
				 end
		3'd2	:begin
					slave_addr  =	{SLAVE_ID,1'b0}  ;
					device_addr	=	8'h00  ;		
				 end
		3'd3	:slave_addr  = 	{SLAVE_ID,1'b1}  ;
		3'd4	:	begin
						slave_addr	<=  cfg_data[23:16]  ;
						device_addr	<=  cfg_data[15:8]   ;
						wr_data	    <=  cfg_data[7:0]	 ;
					end
    endcase

//
//分频计数器进行计数
always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		cnt_clk  <=  5'd0  ;
	else  if(cnt_clk == CNT_CLK_MAX - 1'b1)  
		cnt_clk  <=  5'd0  ;
	else
		cnt_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  ;
	else  if(cnt_clk == CNT_CLK_MAX - 1'b1)
		i2c_clk  <=  ~i2c_clk  ;
	else
		i2c_clk  <=  i2c_clk  ;
//

//状态机第一段
always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		c_state  <=  IDLE  ;
	else
		c_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))
							n_state  =  START  ;
						else
							n_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))
							n_state  =  SLAVE_ADDR  ;
						else
							n_state  =  START  ;
		SLAVE_ADDR	:	if(skip_en_0 == 1'b1)
							n_state  =  WAIT  ;
						else  if((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_3 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  ACK_1  ;
						else
							n_state  =  SLAVE_ADDR  ;
		ACK_1		:	if((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  DEVICE_ADDR  ;
						else  if(skip_en_3 == 1'b1)
							n_state  =  DATA  ;
						else
							n_state  =  ACK_1  ;
		DEVICE_ADDR	:	if((skip_en_1 == 1'b1)||(skip_en_2 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  ACK_2  ;
						else
							n_state  =  DEVICE_ADDR  ;
		ACK_2		:	if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  DATA  ;
						else  if(skip_en_2 == 1'b1)
							n_state  =  STOP  ;
						else
							n_state  =  ACK_2  ;
		DATA		:	if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  ACK_3  ;
						else  if(skip_en_3 == 1'b1)
							n_state  =  NACK  ;
						else  if(error_en == 1'b1)
							n_state  =  IDLE  ;
						else
							n_state  =  DATA  ;
		ACK_3		:	if((skip_en_1 == 1'b1)||(skip_en_4 == 1'b1))
							n_state  =  STOP  ;
						else
							n_state  =  ACK_3  ;
		WAIT		:	if(skip_en_0 == 1'b1)
							n_state  =  STOP  ;
						else
							n_state  =  WAIT  ;
		NACK		:	if(skip_en_3 == 1'b1)
							n_state  =  STOP  ;
						else
							n_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))
							n_state  =  IDLE  ;
						else
							n_state  =  STOP  ;
		default		:	n_state  =  IDLE  ;
    endcase

//状态机第三段	
always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		begin
			cnt_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	;
			error_en	<=  1'b0	;
			cnt_i2c_clk	<=  2'd0	;
			cnt_bit		<=  3'd0	;
			cnt_delay	<=  10'd0	;
			mode		<=  3'd0	;
			i2c_end		<=  1'b0	;
		end
	else
		case(c_state)
			IDLE		:begin
							cnt_wait  <=  cnt_wait + 1'b1  ;
							if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd0))
								skip_en_0  <=  1'b1  ;
							else
								skip_en_0  <=  1'b0  ;
							if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;	
							if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd2))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;	
							if((cnt_wait == CNT_WAIT_MAX - 2'd2)&&(mode == 3'd3))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;	
							if((i2c_start == 1'b1)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;
						 end
			START		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;			
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd0))
								skip_en_0  <=  1'b1  ;
							else
								skip_en_0  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd2))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd3))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end
			SLAVE_ADDR	:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if(cnt_i2c_clk == 2'd3)
								cnt_bit  <=  cnt_bit + 1'b1  ;
							else
								cnt_bit  <=  cnt_bit  ;			
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd0))
								skip_en_0  <=  1'b1  ;
							else
								skip_en_0  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd2))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd3))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end
			ACK_1		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1)&&(ack == 1'b1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd2)&&(ack == 1'b1))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd3)&&(ack == 1'b1))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd4)&&(ack == 1'b1))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end
			DEVICE_ADDR	:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if(cnt_i2c_clk == 2'd3)
								cnt_bit  <=  cnt_bit + 1'b1  ;
							else
								cnt_bit  <=  cnt_bit  ;								
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd2))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end
			ACK_2		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1)&&(ack == 1'b1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd2)&&(ack == 1'b1))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd4)&&(ack == 1'b1))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end
			DATA		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if(cnt_i2c_clk == 2'd3)
								cnt_bit  <=  cnt_bit + 1'b1  ;
							else
								cnt_bit  <=  cnt_bit  ;				
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd3)&&(rec_data == 8'h20))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
							if((cnt_i2c_clk == 2'd2)&&(cnt_bit == 3'd7)&&(mode == 3'd3)&&(rec_data != 8'h20))
								begin
									error_en  <=  1'b1  ;
									mode	  <=  3'd0  ;
								end
							else
								begin
									error_en  <=  1'b0  ;
									mode	  <=  mode  ;
								end							
						 end
			ACK_3		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1)&&(ack == 1'b1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd4)&&(ack == 1'b1))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
						 end						 
			WAIT		:begin
							if((cnt_delay == CNT_DELAY_MAX - 2'd2)&&(mode == 3'd0))
								skip_en_0  <=  1'b1  ;
							else
								skip_en_0  <=  1'b0  ;
							cnt_delay  <=  cnt_delay + 1'b1  ;
						 end
			NACK		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd3)&&(ack == 1'b1))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;							
						 end
			STOP		:begin
							cnt_i2c_clk  <=  cnt_i2c_clk + 1'b1  ;			
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd0))
								skip_en_0  <=  1'b1  ;
							else
								skip_en_0  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd1))
								skip_en_1  <=  1'b1  ;
							else
								skip_en_1  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd2))
								skip_en_2  <=  1'b1  ;
							else
								skip_en_2  <=  1'b0  ;
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd3))
								skip_en_3  <=  1'b1  ;
							else
								skip_en_3  <=  1'b0  ;	
							if((cnt_i2c_clk == 2'd2)&&(mode == 3'd4))
								skip_en_4  <=  1'b1  ;
							else
								skip_en_4  <=  1'b0  ;								
							if(cnt_i2c_clk == 2'd2)
								i2c_end  <=  1'b1  ;
							else
								i2c_end  <=  1'b0  ;						    
							if((i2c_end == 1'b1)&&(mode <= 3'd3))
								mode  <=  mode + 1'b1  ;
							else  if((mode == 3'd4)&&(i2c_end == 1'b1)&&(reg_num == 6'd51))
								mode  <=  mode + 1'b1  ;
							else
								mode  <=  mode  ;
						 end
			default		:begin
							cnt_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	;
							error_en	<=  1'b0	;
							cnt_i2c_clk	<=  2'd0	;
							cnt_bit		<=  3'd0	;
							cnt_delay	<=  10'd0	;
							mode		<=  mode	;
							i2c_end		<=  1'b0	;
						 end
		endcase
		
always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		rec_data  <=  8'd0  ;
	else
		case(c_state)
			DATA	:	if((mode == 3'd3)&&(cnt_i2c_clk == 2'd1))
							rec_data  <=  {rec_data[6:0],sda_in}  ;
						else
							rec_data  <=  rec_data  ;
			default	:	rec_data  <=  8'd0  ;
		endcase
		
always@(*)
	case(c_state)
		ACK_1,ACK_2,ACK_3  :  ack  =  ~sda_in  ;
		NACK			   :  ack  =  1'b1  ;
		default	:	ack  =  1'b0  ;
	endcase
		
always@(*)
	case(c_state)
		IDLE		:	i2c_scl  =  1'b1  ;
		START		:	if(cnt_i2c_clk == 2'd3)
							i2c_scl  =  1'b0  ;
						else
							i2c_scl  =  1'b1  ;
		SLAVE_ADDR,ACK_1,DEVICE_ADDR,ACK_2,DATA,ACK_3,NACK
					:	if((cnt_i2c_clk == 2'd0)||(cnt_i2c_clk == 2'd3))
							i2c_scl  =  1'b0  ;
						else
							i2c_scl  =  1'b1  ;
		WAIT		:	i2c_scl  =  1'b0  ;
		STOP		:	if(cnt_i2c_clk == 2'd0)
							i2c_scl  =  1'b0  ;
						else
							i2c_scl  =  1'b1  ;
		default		:	i2c_scl  =  1'b1  ;
    endcase
	
always@(*)
	case(c_state)
		IDLE		:	i2c_sda  =  1'b1  ;
		START		:	if(cnt_i2c_clk == 2'd0)
							i2c_sda  =  1'b1  ;
						else
							i2c_sda  =  1'b0  ;
		SLAVE_ADDR	:	i2c_sda  =  slave_addr[7 - cnt_bit]  ;
		ACK_1,ACK_2,ACK_3,NACK
					:	i2c_sda	 =  1'b1  ;
		DEVICE_ADDR	:	i2c_sda  =  device_addr[7 - cnt_bit]  ;
		DATA		:	i2c_sda  =  wr_data[7 - cnt_bit]  ;
		WAIT		:	i2c_sda  =  1'b0  ;
		STOP		:	if((cnt_i2c_clk == 2'd0)||(cnt_i2c_clk == 2'd1))
							i2c_sda  <=  1'b0  ;
						else
							i2c_sda  <=  1'b1  ;
		default		:	i2c_sda  <=  1'b1  ;
    endcase

endmodule
//paj7620寄存器配置模块
module  prj7620_cfg
(
	input	wire			i2c_clk		,
	input	wire			sys_rst_n	,
	input	wire			cfg_start	,
	input	wire	[2:0]	mode		,
	
	output	wire	[23:0]	cfg_data	,
	output	reg				i2c_start	,
	output	reg		[5:0]	reg_num		
);

wire	[23:0]	cfg_data_reg[50:0]	;

always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		reg_num  <=  6'd0  ;
	else  if((cfg_start == 1'b1)&&(mode == 3'd4))
		reg_num  <=  reg_num + 1'b1  ;
	else
		reg_num  <=  reg_num  ;
		
always@(posedge i2c_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		i2c_start  <=  1'b0  ;
	else  if((cfg_start == 1'b1)&&(mode == 3'd4))
		i2c_start  <=  1'b1  ;
	else
		i2c_start  <=  1'b0  ;
		
assign  cfg_data = (mode != 3'd4) ? 24'd0 :cfg_data_reg[reg_num - 1'b1]  ;	
assign  cfg_data_reg[00]	=	{8'b1110_0110,8'hEF,8'h00}  ;
assign  cfg_data_reg[01]	=	{8'b1110_0110,8'h37,8'h07}  ;
assign  cfg_data_reg[02]	=	{8'b1110_0110,8'h38,8'h17}  ;
assign  cfg_data_reg[03]	=	{8'b1110_0110,8'h39,8'h06}  ;
assign  cfg_data_reg[04]	=	{8'b1110_0110,8'h42,8'h01}  ;
assign  cfg_data_reg[05]	=	{8'b1110_0110,8'h46,8'h2D}  ;
assign  cfg_data_reg[06]	=	{8'b1110_0110,8'h47,8'h0F}  ;
assign  cfg_data_reg[07]	=	{8'b1110_0110,8'h48,8'h3C}  ;
assign  cfg_data_reg[08]	=	{8'b1110_0110,8'h49,8'h00}  ;
assign  cfg_data_reg[09]	=	{8'b1110_0110,8'h4A,8'h1E}  ;
assign  cfg_data_reg[10]	=	{8'b1110_0110,8'h4C,8'h20}  ;
assign  cfg_data_reg[11]	=	{8'b1110_0110,8'h51,8'h10}  ;
assign  cfg_data_reg[12]	=	{8'b1110_0110,8'h5E,8'h10}  ;
assign  cfg_data_reg[13]	=	{8'b1110_0110,8'h60,8'h27}  ;
assign  cfg_data_reg[14]	=	{8'b1110_0110,8'h80,8'h42}  ;
assign  cfg_data_reg[15]	=	{8'b1110_0110,8'h81,8'h44}  ;
assign  cfg_data_reg[16]	=	{8'b1110_0110,8'h82,8'h04}  ;
assign  cfg_data_reg[17]	=	{8'b1110_0110,8'h8B,8'h01}  ;
assign  cfg_data_reg[18]	=	{8'b1110_0110,8'h90,8'h06}  ;
assign  cfg_data_reg[19]	=	{8'b1110_0110,8'h95,8'h0A}  ;
assign  cfg_data_reg[20]	=	{8'b1110_0110,8'h96,8'h0C}  ;
assign  cfg_data_reg[21]	=	{8'b1110_0110,8'h97,8'h05}  ;
assign  cfg_data_reg[22]	=	{8'b1110_0110,8'h9A,8'h14}  ;
assign  cfg_data_reg[23]	=	{8'b1110_0110,8'h9C,8'h3F}  ;
assign  cfg_data_reg[24]	=	{8'b1110_0110,8'hA5,8'h19}  ;
assign  cfg_data_reg[25]	=	{8'b1110_0110,8'hCC,8'h19}  ;
assign  cfg_data_reg[26]	=	{8'b1110_0110,8'hCD,8'h0B}  ;
assign  cfg_data_reg[27]	=	{8'b1110_0110,8'hCE,8'h13}  ;
assign  cfg_data_reg[28]	=	{8'b1110_0110,8'hCF,8'h64}  ;
assign  cfg_data_reg[29]	=	{8'b1110_0110,8'hD0,8'h21}  ;
assign  cfg_data_reg[30]	=	{8'b1110_0110,8'hEF,8'h01}  ;
assign  cfg_data_reg[31]	=	{8'b1110_0110,8'h02,8'h0F}  ;	
assign  cfg_data_reg[32]	=	{8'b1110_0110,8'h03,8'h10}  ;
assign  cfg_data_reg[33]	=	{8'b1110_0110,8'h04,8'h02}  ;
assign  cfg_data_reg[34]	=	{8'b1110_0110,8'h25,8'h01}  ;
assign  cfg_data_reg[35]	=	{8'b1110_0110,8'h27,8'h39}  ;
assign  cfg_data_reg[36]	=	{8'b1110_0110,8'h28,8'h7F}  ;
assign  cfg_data_reg[37]	=	{8'b1110_0110,8'h29,8'h08}  ;
assign  cfg_data_reg[38]	=	{8'b1110_0110,8'h3E,8'hFF}  ;
assign  cfg_data_reg[39]	=	{8'b1110_0110,8'h5E,8'h3D}  ;
assign  cfg_data_reg[40]	=	{8'b1110_0110,8'h65,8'h96}  ;
assign  cfg_data_reg[41]	=	{8'b1110_0110,8'h67,8'h97}  ;
assign  cfg_data_reg[42]	=	{8'b1110_0110,8'h69,8'hCD}  ;
assign  cfg_data_reg[43]	=	{8'b1110_0110,8'h6A,8'h01}  ;
assign  cfg_data_reg[44]	=	{8'b1110_0110,8'h6D,8'h2C}  ;
assign  cfg_data_reg[45]	=	{8'b1110_0110,8'h6E,8'h01}  ;
assign  cfg_data_reg[46]	=	{8'b1110_0110,8'h72,8'h01}  ;
assign  cfg_data_reg[47]	=	{8'b1110_0110,8'h73,8'h35}  ;
assign  cfg_data_reg[48]	=	{8'b1110_0110,8'h74,8'h00}  ;
assign  cfg_data_reg[49]	=	{8'b1110_0110,8'h77,8'h01}  ;
assign  cfg_data_reg[50]	=	{8'b1110_0110,8'hEF,8'h00}  ;

endmodule
//顶层模块
module  paj7620_top
(
	input	wire			sys_clk		,
	input	wire			sys_rst_n	,
	
	output	wire			scl			,
	
	inout	wire			sda	
);

wire	[23:0]	cfg_data	;
wire			i2c_start	;
wire	[5:0]	reg_num		;
wire			cfg_start	;
wire	[2:0]	mode		;
wire			i2c_clk		;

i2c_ctrl  i2c_ctrl_inst
(
	.sys_clk	(sys_clk		),
	.sys_rst_n	(sys_rst_n		),
	.cfg_data	(cfg_data		),
	.i2c_start	(i2c_start		),
	.reg_num	(reg_num		),
	.scl		(scl			),
	.cfg_start	(cfg_start		),
	.i2c_clk	(i2c_clk		),
	.mode		(mode			),
	.sda        (sda         	)
);

prj7620_cfg  prj7620_cfg_inst
(
	.i2c_clk	(i2c_clk	),
	.sys_rst_n	(sys_rst_n	),
	.cfg_start	(cfg_start	),
	.mode		(mode		),
	.cfg_data	(cfg_data	),
	.i2c_start	(i2c_start	),
	.reg_num	(reg_num	)	
);

endmodule

总结

  至此,我们已经完成了对手势识别模块80%功能的配置,马上就可以进行数据读取了。感谢各位读者的支持,若本教程能对您有所帮助,则是小编莫大的快乐,若各位读者有疑问,也可在评论区留言讨论。下一章的教程是:PAJ7620U2手势识别——配置手势数据寄存器(6),敬请期待。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值