• RTL乒乓运算设计


    本模块设计来自于实际工作中的问题,简化了不必要的功能。

    基于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

    整个乒乓运算模块的工作流程如下:

    1. 上电后对各变量复位
    2. 先对各寄存器进行配置
    3. 寄存器配置完毕后,根据工作模式判断是正常工作产生加权平均数据包ADF,还是搬运修订数据
    4. 如果是产生ADF模式,那么就需要通过乒乓的方式将ODF输入两个运算模块,分别计算平均值并打包成ADF输出。计算ADF时,ODF透传变量可在ADF输出之前保持不变,也可通过打拍延迟的方式实现完全流水

    ODF解析后,由于透传变量要保持直到ADF打包输出完毕,所以获取一个ODF之后要在ADF产生完毕之前屏蔽其他的ODF输入。当然也可以将透传变量也打拍延迟,这样后续的ODF就不用被屏蔽,但这样消耗资源很多。

    1. 如果是搬运修订数据模式,就需要从外界搬运修订数据至RAM中
    2. 如果是单模块计算ADF,就只用一个模块实现平均。
    3. 搬运修订数据完毕,或者乒乓运算在某个时刻,返回重新读取寄存器的值,以更新模块工作状态。

    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 Lengthunsigned int-数据包长度,应为(7+2a)
    [31:16]Reserved--备用
    3[15:0]Frame Counterunsigned int1数据帧计数
    [31:16]Reserved--备用
    4[31:0]Arrive timeunsigned int150MHZ时钟周期到达时间
    5[15:0]alphaunsigned int1透传变量α
    [31:16]betaunsigned int1透传变量β
    6[15:0]gammaunsigned int1透传变量γ
    [31:16]lambdaunsigned int1透传变量λ
    7[7:0]Sample_A_Fixed Typeunsigned int1变量A修订数据类型
    [15:8]Sample_B_Fixed Typeunsigned int1变量B修订数据类型
    [23:16]Sample_C_Fixed Typeunsigned int1变量C修订数据类型
    [31:24]Sample_D_Fixed Typeunsigned int1变量D修订数据类型
    8~(8+a-1)[15:0]sample_Aunsigned int1待平均变量A,共有a(0<a≤10)个
    [31:16]sample_Bunsigned int1待平均变量B,共有a(0<a≤10)个
    (8+a)~(8+2a-1)[15:0]sample_Cunsigned int1待平均变量C,共有a(0<a≤10)个
    [31:16]sample_Dunsigned int1待平均变量D,共有a(0<a≤10)个
    (8+2a)[31:0]Reserved--备用
    (9+2a)[31:0]Reserved--备用
    (10+2a)[31:0]Check Sumunsigned 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 Lengthunsigned int-数据包长度,应为16'd9
    [31:16]Reserved--备用
    3[15:0]Frame Counterunsigned int1数据帧计数
    [31:16]Reserved--备用
    4[31:0]Arrive timeunsigned int150MHZ时钟周期到达时间
    5[15:0]alphaunsigned int1透传变量α
    [31:16]betaunsigned int1透传变量β
    6[15:0]gammaunsigned int1透传变量γ
    [31:16]lambdaunsigned int1透传变量λ
    7[7:0]Sample_A_Fixed Typeunsigned int1变量A修订数据类型
    [15:8]Sample_B_Fixed Typeunsigned int1变量B修订数据类型
    [23:16]Sample_C_Fixed Typeunsigned int1变量C修订数据类型
    [31:24]Sample_D_Fixed Typeunsigned int1变量D修订数据类型
    8[31:0]sample_A_aveunsigned int1变量A加权平均结果
    9[31:0]sample_B_aveunsigned int1变量B加权平均结果
    10[31:0]sample_C_aveunsigned int1变量C加权平均结果
    11[31:0]sample_D_aveunsigned int1变量D加权平均结果
    12[31:0]Reserved--备用
    13[31:0]Reserved--备用
    14[31:0]Check Sumunsigned 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 异步低复位
    pclkinput1时钟,为36MHZ
    paddrinput32APB地址,用于对pingpong_ave_reg内寄存器片选
    pselinput1APB选通,用于对pingpong_ave_reg选通
    penableinput1
    pwriteinput1高写低读
    pwdatainput32写入数据
    prdataoutput32读出数据
    preadyoutput1
    pslverroutput1传输是否错误
    ODF input aclkinput1AXIS时钟
    arstninput1AXIS低电平异步复位
    tdata_ODFinput32AXIS数据
    tvalid_ODFinput 1tdata有效
    tlast_ODFinput 1指示最后一个tdata
    tready_ODFoutput 1tvalid握手信号
    ADF input tdata_ADFoutput32AXIS数据
    tvalid_ADFoutput 1tdata有效
    tlast_ADFoutput 1指示最后一个tdata
    tready_ODFinput 1tvalid握手信号

    之后是需要配置的参数描述

    Parameter Units Description
    MUL_OUTPUT_STAGES_NUMpingpong_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
    0x00PA_ENABLE[0]RWENALBE1'b0Control whether pingpong_ave is enabled
    [2:1]RWWORK_MODE2'd02'b00: Stop Operation Mode;2'b01:Carrying Fixed Data Mode;2'b10:Solo Operation Mode
    [31:3]Reserved
    0x04PA_WEIGHT_K1_K2[15:0]RWWEIGHT_K116‘d0weight value for average calculation
    [31:16]RWWEIGHT_K216‘d0weight value for average calculation
    0x08PA_WEIGHT_K3_K4[15:0]RWWEIGHT_K316‘d0weight value for average calculation
    [31:16]RWWEIGHT_K416‘d0weight value for average calculation
    0x0CPA_WEIGHT_K5_K6[15:0]RWWEIGHT_K516‘d0weight value for average calculation
    [31:16]RWWEIGHT_K616‘d0weight value for average calculation
    0x10PA_WEIGHT_K7_K8[15:0]RWWEIGHT_K716‘d0weight value for average calculation
    [31:16]RWWEIGHT_K816‘d0weight value for average calculation
    0x14PA_WEIGHT_K9_K10[15:0]RWWEIGHT_K916‘d0weight value for average calculation
    [31:16]RWWEIGHT_K1016‘d0weight value for average calculation
    0x18PA_ODF_MODE[0]RWODF_BLOCK_MODE2‘d0Indicates 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]RODF_RECEIVE_NUM8‘d0Number of ODF already received
    [16:9]RWODF_TIMEOUT8‘d150Clk periods of waiting for ODF coming
    [31:17]reserved
    0x1CPA_ADF_MODE[7:0]RADF_GENERATE_NUM8‘d0Number of ADF already made
    [31:8]reserved
    0x20PA_MUL_STAGES[7:0]RSTAGES_NUM_ONCE_AVE8‘d60Number of periods of clock of calculating average result of one argument of sample A to D
    [31:8]reserved
    0x24~0x120PA_SAMPLE_A_FIX_RAM
    0x124~0x220PA_SAMPLE_B_FIX_RAM
    0x224~0x320PA_SAMPLE_C_FIX_RAM
    0x324~0x420PA_SAMPLE_C_FIX_RAM

    7. Submodule Design

    RTL乒乓运算模块设计 - Submodul Design

    8. RTL Coding

    9. Testbench Coding

    10. Verification

  • 相关阅读:
    Python基础入门(6)----Python控制流:if语句、for循环、while循环、循环控制语句
    springboot基于微信小程序的校园体育运动场地及器材租凭系统设计与实现毕业设计源码131052
    叠氮N3/巯基SH/生物素Biotin修饰CdSe/CdS硒化镉/硫化镉量子点
    Pod详解
    【LeetCode】【剑指offer】【剪绳子(二)】
    汇编:lea 需要注意的一点
    关于Arction的问题(语言-c#)
    Xilinx 7系列 FPGA硬件知识系列(八)——Xilinx FPGA的复位
    scipy.io.matlab._streams.GenericStream.read_into OSError: could not read bytes
    RabbitMQ - 05 - Direct交换机
  • 原文地址:https://blog.csdn.net/Starry__/article/details/126942360