目录
本模块设计来自于实际工作中的问题,简化了不必要的功能。
基于APB与I2C的多主多从架构设计
《 I2C-bus specification and user manual UM10204—4 April 2014》
《DesignWare DW_apb_i2c Databook - Synopsys》
1. Function Description
1.1. Overview
所设计的乒乓运算模块可实现将原始数据包通过乒乓的方式输入至两个相同的运算模块,运算模块可实现平均数求取,再加上修正数据 b b b得到 x ^ \hat{x} x^,最后按照加权平均数据包协议输出。如下公式
x ^ = k 1 x 1 + k 2 x 2 + k 3 x 3 + k 4 x 4 + . . . k n x n + b \hat{x}=k_1x_1+k_2x_2+k_3x_3+k_4x_4+...k_nx_n+b x^=k1x1+k2x2+k3x3+k4x4+...knxn+b
原始数据中不仅包含要求平均的数值,还包括部分直接透传的数据。
修正数据需要根据寄存器的值随时从外部搬移至RAM中。
1.2. Pingpong schedule Operation
整个乒乓运算模块的工作流程如下:
- 上电后对各变量复位
- 先对各寄存器进行配置
- 寄存器配置完毕后,根据工作模式判断是正常工作产生加权平均数据包ADF,还是搬运修订数据
- 如果是产生ADF模式,那么就需要通过乒乓的方式将ODF输入两个运算模块,分别计算平均值并打包成ADF输出。计算ADF时,ODF透传变量可在ADF输出之前保持不变,也可通过打拍延迟的方式实现完全流水
ODF解析后,由于透传变量要保持直到ADF打包输出完毕,所以获取一个ODF之后要在ADF产生完毕之前屏蔽其他的ODF输入。当然也可以将透传变量也打拍延迟,这样后续的ODF就不用被屏蔽,但这样消耗资源很多。
- 如果是搬运修订数据模式,就需要从外界搬运修订数据至RAM中
- 如果是单模块计算ADF,就只用一个模块实现平均。
- 搬运修订数据完毕,或者乒乓运算在某个时刻,返回重新读取寄存器的值,以更新模块工作状态。
1.3. Original Data Frame(ODF)
输入的原始数据包是按照如下协议,注意每包ODF待平均变量的个数可能不同
原始数据协议帧格式 | |||||
---|---|---|---|---|---|
Index | Bits | Name | Data Type | Unit | Description |
1 | [31:0] | Frame Head | - | - | 帧头,应为32'hABCD_1234 |
2 | [15:0] | Frame Length | unsigned int | - | 数据包长度,应为(7+2a) |
[31:16] | Reserved | - | - | 备用 | |
3 | [15:0] | Frame Counter | unsigned int | 1 | 数据帧计数 |
[31:16] | Reserved | - | - | 备用 | |
4 | [31:0] | Arrive time | unsigned int | 150MHZ时钟周期 | 到达时间 |
5 | [15:0] | alpha | unsigned int | 1 | 透传变量α |
[31:16] | beta | unsigned int | 1 | 透传变量β | |
6 | [15:0] | gamma | unsigned int | 1 | 透传变量γ |
[31:16] | lambda | unsigned int | 1 | 透传变量λ | |
7 | [7:0] | Sample_A_Fixed Type | unsigned int | 1 | 变量A修订数据类型 |
[15:8] | Sample_B_Fixed Type | unsigned int | 1 | 变量B修订数据类型 | |
[23:16] | Sample_C_Fixed Type | unsigned int | 1 | 变量C修订数据类型 | |
[31:24] | Sample_D_Fixed Type | unsigned int | 1 | 变量D修订数据类型 | |
8~(8+a-1) | [15:0] | sample_A | unsigned int | 1 | 待平均变量A,共有a(0<a≤10)个 |
[31:16] | sample_B | unsigned int | 1 | 待平均变量B,共有a(0<a≤10)个 | |
(8+a)~(8+2a-1) | [15:0] | sample_C | unsigned int | 1 | 待平均变量C,共有a(0<a≤10)个 |
[31:16] | sample_D | unsigned int | 1 | 待平均变量D,共有a(0<a≤10)个 | |
(8+2a) | [31:0] | Reserved | - | - | 备用 |
(9+2a) | [31:0] | Reserved | - | - | 备用 |
(10+2a) | [31:0] | Check Sum | unsigned int | - | 2~(9+2a)按Byte累加校验和 |
1.4. Average Data Frame(ADF)
对原始数据包中的3、4、5、6、7项直接透传,根据第7项选择变量ABCD的修订数据类型,从RAM中取出修订数据。再根据配置的寄存器对变量ABCD进行加权平均,该过程可通过流水线实现。最后加上修订数据,构成如下平均数据协议帧格式
但要注意由于我们是乒乓实现,而且协议中标注了帧计数,所以ODF的输入顺序要与ADF输出顺序对应起来。
平均数据协议帧格式 | |||||
---|---|---|---|---|---|
Index | Bits | Name | Data Type | Unit | Description |
1 | [31:0] | Frame Head | - | - | 帧头,应为32'hA5A5_B6B6 |
2 | [15:0] | Frame Length | unsigned int | - | 数据包长度,应为16'd9 |
[31:16] | Reserved | - | - | 备用 | |
3 | [15:0] | Frame Counter | unsigned int | 1 | 数据帧计数 |
[31:16] | Reserved | - | - | 备用 | |
4 | [31:0] | Arrive time | unsigned int | 150MHZ时钟周期 | 到达时间 |
5 | [15:0] | alpha | unsigned int | 1 | 透传变量α |
[31:16] | beta | unsigned int | 1 | 透传变量β | |
6 | [15:0] | gamma | unsigned int | 1 | 透传变量γ |
[31:16] | lambda | unsigned int | 1 | 透传变量λ | |
7 | [7:0] | Sample_A_Fixed Type | unsigned int | 1 | 变量A修订数据类型 |
[15:8] | Sample_B_Fixed Type | unsigned int | 1 | 变量B修订数据类型 | |
[23:16] | Sample_C_Fixed Type | unsigned int | 1 | 变量C修订数据类型 | |
[31:24] | Sample_D_Fixed Type | unsigned int | 1 | 变量D修订数据类型 | |
8 | [31:0] | sample_A_ave | unsigned int | 1 | 变量A加权平均结果 |
9 | [31:0] | sample_B_ave | unsigned int | 1 | 变量B加权平均结果 |
10 | [31:0] | sample_C_ave | unsigned int | 1 | 变量C加权平均结果 |
11 | [31:0] | sample_D_ave | unsigned int | 1 | 变量D加权平均结果 |
12 | [31:0] | Reserved | - | - | 备用 |
13 | [31:0] | Reserved | - | - | 备用 |
14 | [31:0] | Check Sum | unsigned int | - | 2~11按Byte累加校验和 |
1.5. Fixed Data Transfer
变量ABCD作加权平均时的修订数据需要根据在ODF中修订数据类型号,从内部RAM读取相应的修订数据参与加权运算。四个变量对应着四个RAM,每个RAM存储着128个修订数据可供使用。
当寄存器要求模块改变RAM中的修订数据时,就需要模块从外部搬运新的修订数据至这四个RAM中。
1.6. AXI4-Stream 与 APB 5.0
使用AXI4-Stream协议实现ODF和ADF的接受和发送,见高级可拓展接口 4.0 - 流传输(Advanced eXtensible Interface 4 - Stream, AXI4-Stream)
使用APB协议实现寄存器部分的配置,见高级外围总线 5.0(Advanced Peripheral Bus, APB)
2. Feature List
要实现的feature如下
● 实现两个模块乒乓作加权平均和数据补正功能。权重数据位宽16bit由寄存器控制。
● 实现补正数据动态更改功能
● 使用AXI4-Stream实现ODF和ADF的打包和发送,ACLK频率为150MHZ
● 使用APB5.0实现寄存器配置功能,PCLK频率为36MHZ
3. Block Diagram
模块框架图如下所示,ODF_analysis实现ODF的解析,两个multiplier实现加权、平均和补正,修订数据位于寄存器模块pingpong_ave_reg内
4. Interface Description
整个子系统的接口描述如下
Group | Signal | Direction | Width(bits) | Description |
---|---|---|---|---|
Register Configuration | prstn | input | 1 | 异步低复位 |
pclk | input | 1 | 时钟,为36MHZ | |
paddr | input | 32 | APB地址,用于对pingpong_ave_reg内寄存器片选 | |
psel | input | 1 | APB选通,用于对pingpong_ave_reg选通 | |
penable | input | 1 | ||
pwrite | input | 1 | 高写低读 | |
pwdata | input | 32 | 写入数据 | |
prdata | output | 32 | 读出数据 | |
pready | output | 1 | ||
pslverr | output | 1 | 传输是否错误 | |
ODF input | aclk | input | 1 | AXIS时钟 |
arstn | input | 1 | AXIS低电平异步复位 | |
tdata_ODF | input | 32 | AXIS数据 | |
tvalid_ODF | input | 1 | tdata有效 | |
tlast_ODF | input | 1 | 指示最后一个tdata | |
tready_ODF | output | 1 | tvalid握手信号 | |
ADF input | tdata_ADF | output | 32 | AXIS数据 |
tvalid_ADF | output | 1 | tdata有效 | |
tlast_ADF | output | 1 | 指示最后一个tdata | |
tready_ODF | input | 1 | tvalid握手信号 |
之后是需要配置的参数描述
Parameter | Units | Description |
---|---|---|
MUL_OUTPUT_STAGES_NUM | 个 | pingpong_ave_mul模块每次与权重乘完后延迟的拍数 |
5. Finite State Machine Description
整个状态机如下图,包含了用于寄存器配置的Disable Mode模式、搬移补正数据的Carrying Fixed Data Mode模式、单模块运算的Solo Operation Mode模式和乒乓运算的Pingpong Operation Mode模式。
对各状态作解释
● IDLE: 初始状态,在该状态下可对寄存器进行改写、根据寄存器切换工作模式
● FIX_CARRY: 在Carrying Fixed Data Mode模式下,对4个补偿数据RAM写入新的修订数据,写完毕后根据Carrying Fixed Data Done条件返回IDLE
● ODF_REC与ADF_GEN: 当进入Solo Operation Mode模式时表示单模块运算,该状态表示等待ODF。当等待ODF超时后,会返回IDLE状态。获取一个ODF后则进入ADF_GEN状态,等待产生ADF,产生ADF后进入IDLE状态,以检查寄存器判断停止运算或是否要切换到其他状态。
● CHECK_STOP与PING:ODF_REC PONG:ADF_GEN: 当进入Pingpong Operation Mode模式时表示乒乓模块运算,CHECK_STOP为中转状态。
首先检查PING ADF FIFO是否为空,如果是则说明PONG ADF FIFO中可能存在上一次运算遗留的ADF未读出,所以此时要PING 写ODF、PONG读ADF,进入PING:ODF_REC PONG:ADF_GEN状态。
在PING:ODF_REC PONG:ADF_GEN状态下,如果PING获得了ODF且PONG算出了ADF,那么就返回CHECK_STOP以检查寄存器是否停止。如果PING等待ODF超时或者PONG ADF FIFO本来就空,则也进入CHECK_STOP状态
● CHECK_STOP与PING:ADF_GEN PONG:ODF_REC: 如果PING ADF FIFO非空,则说明PONG ADF FIFO是空的,就可以进入PING:ADF_GEN PONG:ODF_REC状态
在PING:ADF_GEN PONG:ODF_REC状态下,产生了ADF,并且收到了ODF或等待ODF超时,就返回CHECK_STOP状态
6. Register Description
Offset Address | Register Name | Field(bits) | Access | Field Name | Default Value | Description |
---|---|---|---|---|---|---|
0x00 | PA_ENABLE | [0] | RW | ENALBE | 1'b0 | Control whether pingpong_ave is enabled |
[2:1] | RW | WORK_MODE | 2'd0 | 2'b00: Stop Operation Mode;2'b01:Carrying Fixed Data Mode;2'b10:Solo Operation Mode | ||
[31:3] | Reserved | |||||
0x04 | PA_WEIGHT_K1_K2 | [15:0] | RW | WEIGHT_K1 | 16‘d0 | weight value for average calculation |
[31:16] | RW | WEIGHT_K2 | 16‘d0 | weight value for average calculation | ||
0x08 | PA_WEIGHT_K3_K4 | [15:0] | RW | WEIGHT_K3 | 16‘d0 | weight value for average calculation |
[31:16] | RW | WEIGHT_K4 | 16‘d0 | weight value for average calculation | ||
0x0C | PA_WEIGHT_K5_K6 | [15:0] | RW | WEIGHT_K5 | 16‘d0 | weight value for average calculation |
[31:16] | RW | WEIGHT_K6 | 16‘d0 | weight value for average calculation | ||
0x10 | PA_WEIGHT_K7_K8 | [15:0] | RW | WEIGHT_K7 | 16‘d0 | weight value for average calculation |
[31:16] | RW | WEIGHT_K8 | 16‘d0 | weight value for average calculation | ||
0x14 | PA_WEIGHT_K9_K10 | [15:0] | RW | WEIGHT_K9 | 16‘d0 | weight value for average calculation |
[31:16] | RW | WEIGHT_K10 | 16‘d0 | weight value for average calculation | ||
0x18 | PA_ODF_MODE | [0] | RW | ODF_BLOCK_MODE | 2‘d0 | Indicates the masking mode of the ODF. 2'd0 indicates that an ODF is acquired and then masking begins until a packet of ADF is output. 2'd1 indicates that ODF is never blocked. In this case, staging of the transparent transmission variable is required, which will take more resources. |
[8:1] | R | ODF_RECEIVE_NUM | 8‘d0 | Number of ODF already received | ||
[16:9] | RW | ODF_TIMEOUT | 8‘d150 | Clk periods of waiting for ODF coming | ||
[31:17] | reserved | |||||
0x1C | PA_ADF_MODE | [7:0] | R | ADF_GENERATE_NUM | 8‘d0 | Number of ADF already made |
[31:8] | reserved | |||||
0x20 | PA_MUL_STAGES | [7:0] | R | STAGES_NUM_ONCE_AVE | 8‘d60 | Number of periods of clock of calculating average result of one argument of sample A to D |
[31:8] | reserved | |||||
0x24~0x120 | PA_SAMPLE_A_FIX_RAM | |||||
0x124~0x220 | PA_SAMPLE_B_FIX_RAM | |||||
0x224~0x320 | PA_SAMPLE_C_FIX_RAM | |||||
0x324~0x420 | PA_SAMPLE_C_FIX_RAM |