上一章教程,小编带领各位读者完成了对0x00寄存器内数据的读取,读取出来的数据显示是正确的。本章教程开始进行寄存器组的配置,总共需要配置51个寄存器。具体的配置步骤请继续往下浏览。
在之前所有的章节的教程中呢,都是对“唤醒操作”进行配置和验证,直到上一章教程,我们读取出来了0x20这个数据,才代表唤醒操作结束,现在我们可以使用这个模块了。所以,我们需要参考官方数据手册,配置寄存器组,配置完成后才能进行数据的读取。
细心的读者可以发现,单个写操作步骤图与前面激活bank0教程的步骤图是相同的。在这里呢,我们对51个寄存器写入数据,不能进行连续写操作,所以只能进行对寄存器数据单次写入,总共写入51次。将这51个寄存器配置好后,即可进行数据的读取了。
从IDLE状态到START状态,我们需要略微做一下修改,状态跳转条件修改为接收到一个开始信号。这个开始信号是从另外一个对51个寄存器寄存器配置的模块传入的,i2c控制模块结束信号就作为寄存器配置模块的开始信号,同时,寄存器配置模块的结束信号也作为i2c控制模块的开始信号。在这里光是文字描述会有些许拗口,各位读者可借助波形图和参考代码,辅助对本章教程的理解。
上述波形图是寄存器配置模块的波形图。
上述三张波形图是i2c控制模块波形图,为了便于各位读者观看,小编在这里采用分段绘制。根据绘制好的波形图,即可对代码进行修改,加以验证。
上板抓取信号波形,设置skip_en_4上升沿和寄存器计数器reg_num为1时触发:
抓取到的信号波形如下:
可以发现,寄存器计数器从1开始计数,因为要配置51个计数器,所以最大值要计数到51,我们切换触发条件,设置skip_en_4上升沿和reg_num为51时触发,抓取到的波形如下所示:
在末尾,mode信号由4变为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),敬请期待。