主要内容

设计DDR5 IBIS-AMI模型以支持后台链接训练

此示例显示了如何通过添加到SerDes Toolbox™中的库块,使用与IBIS 7.0规范中定义的方法类似的方法创建支持链路训练通信(反向信道)的发射机和接收机AMI模型。本例使用DDR5写传输(控制器到SDRAM)来演示设置。

介绍

IBIS 7.0通过在GetWave操作期间为Tx和Rx AMI可执行模型提供通信机制,引入了模型执行链接训练或自动协商的能力。链路训练算法可以模拟硅正在做的事情,也可以使用信道分析方法来确定最佳的Tx和Rx均衡设置,然后锁定这些设置以进行剩余的模拟。

Tx和Rx可执行模型之间的通信是Tx和R可执行模型都能理解的消息,EDA工具不需要理解。这些商定的消息称为Back-Channel Interface Protocol。IBIS规范没有描述反向通道接口协议的细节,只是描述了一种使通信工作的方法DDRx_写入.

目前,SerDes Toolbox™不直接支持IBIS-AMI后台接口保留参数。相反,它支持特定于模型的参数,这些参数具有_ST公司附加在其名称后,执行类似功能。由于这些特定于模型的参数与IBIS规范中的保留参数使用的名称不同,因此必须将它们用作匹配集或与SerDes Toolbox开发的支持相同协议的其他反向通道模型一起使用。这些模型应该在任何行业标准的AMI模型模拟器中都能很好地工作。

SerDes Designer应用程序中的DDR5 Tx/Rx IBIS-AMI型号设置

本示例的第一部分从DDR5控制器发射机模型开始DDR5控制器发射机/接收机IBIS-AMI型号 SDRAM接收机AMI模型DDR5 SDRAM发射机/接收机IBIS-AMI型号。此示例使用几个附加的直通块来支持反向信道通信。您可以将模型导出到Simulink®以进行进一步自定义。

打开模型DDR5_写入_txrx_ami在MATLAB®命令窗口中键入以下命令:

>>serdesDesigner('DDR5_Write_txrx_ami')

对于写入事务,发射机(Tx)是一个使用3抽头前馈均衡(FFE)的DDR5控制器,而接收机(Rx)使用具有7个预定义设置的可变增益放大器(VGA)和具有内置时钟数据恢复的4抽头判决反馈均衡器(DFE)。为了支持此配置,SerDes系统的设置如下:

配置设置

  • 符号时间设置为208.3ps,因为目标操作速率为4.8DDR5-4800为Gbps。

  • 目标误码率设置为100e-18号.

  • 信号 设置为单引擎.

  • 每个符号的采样数 调制 保持默认值,即16自然资源保护区(不归零)。

变送器型号设置

  • Pass-Through块Tx_BCI是用于支持此反向通道实现的块。该块的操作将在本例后面描述。

  • Tx FFE块设置为一个预抽头、一个主抽头和一个抽头后,包括三个抽头重量。这是通过数组[0 1 0]完成的,其中主抽头由数组中的最大值指定。稍后将在将模型导出到Simulink时在示例中添加抽头范围。

  • 设置Tx模拟输出模型,以便电压1.1V中,上升时间 100聚苯乙烯,R(右)(输出电阻)为50度hms,和C(电容)为0.65pF。最终模型中使用的实际模拟模型将在本例稍后生成。

通道模型设置

  • 信道损耗设置为5dB,这是DDR信道的典型值。

  • 单端阻抗设置为40欧姆。

  • 目标频率设置为2.4GHz,这是4.8 GHz的奈奎斯特频率

接收器型号设置

  • 设置Rx AnalogIn模型,以便R(右)(输入电阻)为40欧姆和C(电容)为0.65微法拉。最终模型中使用的实际模拟模型将在本例稍后生成。

  • 直通模块Rx_BCI_读取是用于支持此反向通道实现的块。该块的操作将在本例后面描述。

  • VGA块设置为增益第页,共1页模式设置为。在将模型导出到Simulink后,将在此示例中稍后添加特定的VGA预设。

  • DFECDR块设置为四个DFE抽头,包括四个初始抽头重量 设置为0。这个最小抽头值设置为[-0.2 -0.075 -0.06 -0.045]五、 和最大抽头值设置为[0.05 0.075 0.06 0.045]V.DFE已配置为使用2倍抽头重量,以便与JEDEC DFE抽头定义一致。

  • 通过区块Rx_BCI_写入是用于支持此反向通道实现的块。该块的操作将在本例后面描述。

将SerDes系统导出到Simulink

单击导出按钮将配置导出到Simulink,以便进一步定制和生成AMI模型可执行文件。

Simulink中的DDR5 Tx/Rx IBIS-AMI模型设置

本部分示例采用SerDes Designer应用程序导出的SerDes系统,并根据Simulink中DDR5反向通道操作的需要对其进行自定义。

查看Simulink模型设置

导入Simulink的SerDes系统由配置、刺激、发送、模拟通道和接收模块组成。SerDes Designer应用程序中的所有设置都会传输到Simulink模型。保存模型并查看每个块设置。

  • 在Tx子系统中,双击FFE块以打开FFE块参数对话框。展开IBIS-AMI参数并取消选择模式参数,有效地硬编码模式在最终AMI模型中固定的.

  • 在Rx子系统中,双击VGA块以打开VGA块参数对话框。这个模式增益设置从SerDes Designer应用程序进行。

  • 在Rx子系统中,双击DFECDR块以打开“DFECDR模块参数”对话框。这个初始抽头重量,最小DFE抽头值, 最大抽头值RMS(有效值) 设置从SerDes Designer应用程序进行。这个自适应增益自适应步长设置为2006年3月1-06年分别是基于DDR5 SDRAM期望的合理值。展开IBIS-AMI参数并取消选择相位偏移量参考偏移量参数,有效地将这些参数硬编码为其当前值。

更新变送器(Tx)AMI参数

打开急性心肌梗死-Tx(发送)选项卡。首先列出保留参数,然后是遵循典型AMI文件格式的特定于模型的参数。

  • 设置预加重点击:编辑攻丝配重-1和设置格式范围,类型0,分钟-0.2、和马克斯0.2.

  • 设置主点击:编辑攻丝重量0和设置格式范围,类型1,分钟0.6、和马克斯1.

  • 设置强调后点击:编辑攻丝配重1和设置格式范围,类型0,分钟-0.2、和马克斯0.2.

创建新的Tx反向通道AMI参数

为了支持反向通道操作,需要额外的控制参数。AMI公司-Tx(发送)选项卡,突出显示Tx_BCI公司并添加以下6个新参数:

  • FFE_点击1:此参数创建一个数据存储,用于在训练期间在Tx块之间传递FFE预抽头值。单击添加参数…按钮。设置参数名称FFE_作业1,当前值0,用法输入输出,类型浮子、和格式价值.设置描述作为:Tx FFE Tap-1用于反向通道培训。单击好 啊以保存更改,并注意这会自动在Tx_BCI PassThrough块中创建数据存储。

  • FFE_Tap0(FFE_点击0):此参数创建一个数据存储,用于在训练期间在Tx块之间传递FFE主抽头值。单击添加参数…按钮。设置参数名称FFE_点击0,当前值0,用法输入输出,类型浮子、和格式价值.设置描述作为:Tx FFE Tap 0进行背对背训练。保存更改。

  • FFE_点击1:此参数创建一个数据存储,用于在训练期间在Tx块之间传递FFE分接后值。单击添加参数…按钮。设置参数名称FFE_点击1,当前值0,用法输入输出,类型浮子、和格式价值.设置描述作为:Tx FFE Tap 1进行背靠背训练。保存更改。

  • BCI_协议_ST:此参数仅用于生成名为BCI_协议_ST部分符合IBIS-ami规范。此模型未使用此参数。单击添加参数…按钮。设置参数名称BCI_协议_ST,当前值至“DDRx_Write“(带引号),用法信息,类型字符串、和格式价值.设置描述作为:此模型支持DDRx_Write Example back-channel协议。注意:此模型当前不支持保留参数BCI_Protocol作为模型的输入。保存更改。

  • BCI_ID_ST:此参数仅用于生成名为BCI_ID_ST公司部分符合IBIS-ami规范。此模型不使用此参数。单击添加参数…按钮。设置参数名称BCI_ID_ST公司,当前值“bci_comm”(带引号),用法信息,类型字符串、和格式价值.设置描述作为:此模型创建名称以“bci_comm”开头的文件,用于反向通道通信。注意:此模型当前不支持AMI保留参数BCI_ID作为模型的输入。保存更改。

  • 脑机接口状态:此参数创建一个数据存储,用于传达反向通道训练的状态:1=关闭,2=训练,3=聚合,4=失败,5=错误。单击添加参数…按钮。设置参数名称BCI_状态_ST,用法输入输出,类型整数、和格式列表.设置描述作为:后台训练状态。注意:此模型当前不支持AMI保留参数BCI_State作为模型的输入。设置违约2,列出值[1 2 3 4 5]、和List_Tip值[“关闭”“培训”“融合”“失败”“错误”],然后设置当前值“培训”。保存更改。

更新接收器(Rx)AMI参数

AMI-Rx公司在SerDes IBIS-AMI Manager对话框的选项卡中,首先列出保留参数,然后是遵循典型AMI文件格式的特定于模型的参数。

  • 设置VGA增益:编辑增益.设置描述作为:接收放大器增益.确保格式设置为列表和设置默认为1.设置列出值作为 [0.5 0.631 0.794 1 1.259 1.585 2]List_Tip值作为[“-6 dB”“-4 dB”“-2 dB”“0 dB”“2 dB”“4 dB”“6 dB”],然后设置当前值0分贝。单击好 啊保存更改。

  • 设置第一个DFE攻丝重量:编辑攻丝配重1.确保格式设置为范围和设置类型=0,分钟=-0.2、和马克斯=0.05。保存更改。

  • 设置第二个DFE攻丝重量:编辑攻丝配重2.确保格式设置为范围和设置类型=0,分钟=-0.075、和马克斯=0.075。保存更改。

  • 设置第三个DFE攻丝重量:编辑丝锥重量3.确保格式设置为范围和设置类型=0,分钟=-0.06、和马克斯=0.06。保存更改。

  • 设置第四个DFE攻丝重量:编辑攻丝配重4.确保格式设置为范围和设置类型=0,分钟=-0.045、和马克斯=0.045。保存更改。

创建新的Rx后通道AMI参数

为了支持反向通道操作,需要额外的控制参数。AMI公司-接收选项卡,突出显示Rx_BCI_写入并添加以下新参数(注:Rx_BCI_读取不需要任何其他参数):

  • 样本电压:此参数创建一个数据存储,用于在训练期间将CDR采样电压传递给其他Rx块。单击添加参数…按钮。设置参数名称样本电压,当前值0,用法输入输出,类型浮子、和格式价值.设置描述作为:用于反向通道训练的采样电压。单击好 啊以保存更改,并注意这会自动在Rx_BCI_Write PassThrough块中创建数据存储。

  • BCI_协议_ST:此参数仅生成名为BCI_协议_ST部分符合IBIS-ami规范。此模型未使用此参数。单击添加参数…按钮。设置参数名称BCI_协议_ST,当前值至“DDRx_Write“(带引号),用法信息,类型字符串、和格式价值.设置描述作为:此模型支持DDRx写入示例反向通道协议。注意:此模型当前不支持AMI保留参数BCI_Protocol作为模型的输入。保存更改。

  • BCI_ID_ST:此参数仅生成名为BCI_ID状态部分符合IBIS-ami规范。此模型不使用此参数。单击添加参数…按钮。设置参数名称BCI_ID_ST公司,当前值到“bci_comm”(带引号),用法信息,类型字符串、和格式价值.设置描述作为:T他的模型创建了名称以bcicm开头的文件,用于进行反向通信。注意:此模型当前不支持将保留参数BCI_ID作为模型的输入。保存更改。

  • BCI状态_ST:此参数创建一个数据存储,用于传达反向通道训练的状态:1=关闭,2=训练,3=聚合,4=失败,5=错误。单击添加参数…按钮。设置参数名称BCI_状态_ST,用法输入输出,类型整数、和格式列表.设置描述作为:后台训练状态。注意:此模型当前不支持AMI保留参数BCI_State作为模型的输入。设置违约2,列出值[1 2 3 4 5]、和List_Tip值[“关闭”“训练”“聚合”“失败”“错误”],然后设置当前值“培训”。保存更改。

  • BCI消息间隔时间:此参数仅生成名为BCI消息间隔部分符合IBIS-ami规范。此模型未使用此参数。单击添加参数…按钮。设置参数名称BCI消息间隔时间,当前值64,用法信息,类型整数、和格式价值.设置描述作为:此BCI模型需要每比特1024个采样数才能正常运行。保存更改。

  • BCI_培训_UI_ST:此参数仅生成名为BCI_培训_U_ST部分符合IBIS-ami规范。此模型不使用此参数。单击添加参数…按钮。设置参数名称BCI_培训_UI_ST,当前值100000,用法信息,类型整数、和格式价值.设置描述作为:BCI培训可能需要100000用户界面才能完成。注意:此模型当前不支持AMI保留参数BCI_Training_UI作为模型的输入。保存更改。

运行刷新初始化

要传播所有新的AMI参数,请在Tx和Rx块上运行Refresh Init。

  • 双击Tx块内的Init子系统,然后单击刷新初始化按钮。

  • 双击Rx块内的Init子系统,然后单击刷新初始化按钮。

运行模型

运行模型以模拟SerDes系统,并验证当前安装程序编译和运行时没有错误。生成了两个绘图。第一个是实时时域(GetWave)眼图,在模型运行时更新。第二个绘图包含统计(Init)结果的四个视图,与SerDes Designer应用程序中可用的绘图以及时域(GetWave)结果中的两个视图类似。

注:可以忽略未连接块的任何警告。这是由于自动生成的数据存储块稍后将被处理。

提供的文件

需要三套外部文件来支持反向通道培训。这些文件的生成超出了本示例的范围,因此它们包含在本示例中。

以下9个文件位于打开此Live Script时生成的示例工作目录中。

写回信道通信文件

这三个文件用于将后通道训练参数和眼压计的当前状态写入外部文件,以便在Tx和Rx AMI模型之间进行通信。

  • MATLAB函数文件:写入BCI文件。

  • codegen所需的C++文件:写入酰胺数据.cppwriteamidata公司。小时

读取反向信道通信文件

这三个文件用于从用于Tx和Rx AMI模型之间通信的外部文件中读取后通道训练参数和眼压的当前状态。

  • MATLAB函数文件:readBCI文件。

  • codegen所需的C++文件:readamidata.cpp文件readamidata公司。小时

写入反向通道日志文件

这三个文件用于在每个训练步骤之后将反向通道训练参数和眼动指标的当前状态写入日志文件以进行调试。

  • MATLAB函数文件:写入BCI历史记录。

  • codegen所需的C++文件:writebchist.cpp文件作家。小时

修改Tx FFE以启用抽头值的外部控制

要在启用反向信道训练时从Tx_BCI块控制Tx FFE抽头权重,请更换FFE参数。TapWeights Constant块与Data Store Read块。此数据存储允许FFE抽头值在模拟期间更改,并传入和传出每个数据路径块。

在Tx子系统内,单击FFE块并按Ctrl+U组合键查看FFE块的掩码下。

  1. 删除FFETapWeights Constant块。

  2. 添加标记为的数据存储读取块BCIFFETapWeightsIn.

  3. 双击数据存储读取块并将数据存储名称设置为:Tx_BCI信号.

  4. 在Element Selection(元件选择)选项卡上,展开信号Tx_BCISignal并高亮显示FFE_Tapm1、FFE_Tap0FFE_点击1.

  5. 选择>>按钮选择这3个元素。

  6. 点击好 啊保存更改。

添加一个Mux块并将输入数量设置为3,以将这三个参数多路复用为FFE块的矢量。

将Mux块的输出连接到FFE上的TapWeights输入。

最终FFE块应如下所示:

类型Ctrl-D键编译模型并检查错误。可以忽略未连接块的任何警告。这是由于自动生成的数据存储块稍后将被寻址

修改DFECDR以输出眼睛采样电压

为了确定在反向信道训练期间给定均衡值集的质量,将使用CDR在眼睛中心为每个符号采样的电压。此值由数据存储写入块捕获,以便其值可用于其他BCI控制块。

在Rx子系统中,单击DFECDR块并键入删除到行首查看Rx DFECDR块的掩码下。

双击总线选择器块。在打开的对话框中:

  1. 总线中的元件列表中,选择名为电压样本.

  2. 要将此元素添加到块输出,请单击添加到输出.

  3. 要保存更改,请单击好 啊.

总线选择器块现在应该有三个输出。

添加数据存储写入 块标记为:CDR样本电压

  1. 双击数据存储写入块并将数据存储名称设置为:Rx_BCI_写入信号在“参数”选项卡上。

  2. 在元素分配选项卡上,展开信号Rx_BCI_WriteSignal并高亮显示样本电压.

  3. 选择>>按钮分配此元素。

  4. 保存更改。

将总线选择器的电压采样输出连接到新数据存储写入块的输入。

DFECDR块的这一部分现在应该如下所示:

示例电压_DSR_block.png

类型Ctrl-D键编译模型并检查错误。可以忽略未连接块的任何警告。这是由于自动生成的数据存储块稍后将被处理

启用培训时,将DFECDR修改为覆盖模式

在反向通道训练期间,FFE和DFE模式都需要设置为固定的FFE模式已硬编码为固定的。一个简单的MATLAB函数用于在未启用培训时设置DFE模式。

在Rx子系统中,单击DFECDR块并键入删除到行首查看Rx DFECDR块的掩码下。

删除DFECDRMode常量块和DFECDR之间的连接。

添加一个新的MATLAB功能块,并将标签设置为数据流模型选择。此功能块将读取BCI_State_ST和DFE的值。启用或完成培训时,模式并强制DFE模式为1(固定)。将以下代码复制/粘贴到DFEModeSelect MATLAB功能块中,替换默认内容。

功能模式=DFEModeSelect(DFEModeIn,BCI_State_In)如果BCI_State_In==1%培训关闭模式=DFEModeIn;其他的模式=1;%强制所有其他训练状态的DFE模式为“固定”结束

添加数据存储读取 块已标记Rx_BCI_Write_BCI_状态输入,因此BCI_State_ST的值可以输入MATLAB功能块。

  1. 双击新的数据存储读取块,并将数据存储名称设置为:Rx_BCI_写入信号.

  2. 在元素选择选项卡上,展开信号Rx_BCI_WriteSignal并高亮显示BCI_状态_ST.

  3. 选择>>按钮选择此元素。

  4. 保存更改。

如图所示,连接这些新块。最终的DFECDR块应如下所示:

最终_ DFECDR_block.png

类型Ctrl-D键编译模型并检查错误。可以忽略未连接块的任何警告。这是由于自动生成的数据存储块稍后将被处理

设置Tx初始化自定义代码

Tx初始化功能用于设置Tx AMI模型,以便在GetWave分析期间运行反向通道训练。这将创建反向通道通信和日志文件,设置各种参数并覆盖任何用户定义的FFE抽头值。

在Tx子系统内,双击Init块,然后单击显示初始化打开初始化MATLAB函数。

初始化功能是一个自动生成的功能,提供SerDes系统块(IBIS AMI-Init)的脉冲响应处理。这个%%开始:%结束:行表示可以输入自定义用户代码的部分。运行Refresh Init时,此部分中的数据不会被覆盖:

%%开始:自定义用户代码区(按下“刷新初始化”按钮时保留)Tx_BCIBCI_State_ST=Tx_BCIP参数。BCI_状态_ST;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tap0=Tx_BIP参数。FFE_Tap0;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tap1=Tx_BIP参数。FFE_Tap1;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tapm1=Tx_BIP参数。FFE_Tapm1;%用户从SerDes IBIS-AMI Manager添加的AMI参数%结束:自定义用户代码区(按下“刷新初始化”按钮时保留)

使用此自定义用户代码区域初始化反向通道参数,在反向通道通信文件中写入第一个条目BCI _通信.csv并创建反向通道日志文件BCI _毫米_日志.csv。要添加自定义反向通道控制代码,请向下滚动到自定义用户代码区域并复制/粘贴以下代码,覆盖现有的自定义用户代码:

Tx_BCIBCI_State_ST=Tx_BIP参数。BCI_状态_ST;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tap0=Tx_BIP参数。FFE_Tap0;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tap1=Tx_BIP参数。FFE_Tap1;%用户从SerDes IBIS-AMI Manager添加AMI参数Tx_BCIFFE_Tapm1=Tx_BIP参数。FFE_Tapm1;%用户从SerDes IBIS-AMI Manager添加AMI参数%%设置GetWave反向通道操作如果Tx_BCIBCI_State_ST==2%训练已启用bciWrFile='BCI_comm.csv';%%Tx/Rx回信道通信文件协议=['DDR5'0];%%空终止字符串以使fprintf在C中保持愉快++状态=['Training'0];%%空终止字符串以使fprintf在C中保持愉快++序列=1;%%初始化序列计数器眼睛高度=0.0;%%初始化培训指标%发布发送功能numFFEtaps=3;FFEtaps=[0.0,1.0,0.0];FFE单位。TapWeights=[0.0,1.0,0.0];%初始化Rx功能(Rx设置的实际值)numDFEtaps=1;DFEtaps=0.0000;%为反向信道通信创建新文件writeBCI文件(bciWrFile,'w',协议,numDFEtaps,numFFEtaps%创建新的BCI_ID_log.csv文件(用于反向通道历史记录)logFileName='BCI_comm_log.csv';writeBCIhistory(日志文件名,'Tx','Init',0,Tx_BCIBCI_State_ST,numDFEtaps,numFFEtaps结束

要测试新的用户代码是否正常工作,请保存并运行模型,然后验证新的回通道通信(BCI_comm.csv)和日志(BCI_comm_log.csv)文件是否已在模型目录中创建,文件中的值是否与上面设置的值相匹配。对于未连接的块,可以忽略现有的12个警告。这是由于自动生成的数据存储块稍后将被处理。

设置接收初始化自定义代码

Rx Initialize功能用于建立Rx AMI模型,以便在GetWave分析期间运行反向通道训练。这将读取回通道通信文件,然后使用Rx配置信息(DFE抽头数量和DFE抽吸值)更新该文件。它还更新日志文件。

在Rx子系统内部双击Init块,然后单击显示初始化在MATLAB中打开初始化函数。

初始化功能是一个自动生成的功能,提供SerDes系统块(IBIS AMI-Init)的脉冲响应处理。这个%%开始:%结束:行表示可以输入自定义用户代码的部分。运行Refresh Init时,此部分中的数据不会被重写:

%%开始:自定义用户代码区(按下“刷新初始化”按钮时保留)Rx_BCI_WriteBCI_State_ST=Rx_GCI_Wrie参数。BCI_状态_ST;%用户从SerDes IBIS-AMI Manager添加AMI参数Rx_BCI_WritesampleVoltage=Rx_GCI_WrieParameter.sampleVolta;%用户从SerDes IBIS-AMI Manager添加AMI参数%END:自定义用户代码区域(按下“刷新初始化”按钮时保留)

使用此自定义用户代码区从Tx读取配置,初始化Rx所需的附加反向信道参数,在反向信道通信文件中写入下一项BCI _通信.csv,并附加到back-channel日志文件BCI _毫米_日志.csv。要添加自定义反向通道控制代码,请向下滚动自定义用户代码区域并复制/粘贴以下代码,覆盖现有的自定义用户代码:

Rx_BCI_WritesampleVoltage=Rx_GCI_WrieParameter.sampleVolta;%用户从SerDes IBIS-AMI Manager添加AMI参数Rx_BCI_WriteBCI_State_ST=Rx_GCI_WiteParameter(Rx_BC写入参数)。BCI_状态_ST;%用户从SerDes IBIS-AMI Manager添加AMI参数%%设置GetWave后台通道操作如果Rx_BCI_WriteBCI_State_ST==2%训练已启用%%从回信道通信文件读取以从Tx获取设置bciRdFile='BCI_comm.csv';[协议,~,numFFEtaps,~,FFEtap,序列,状态,眼睛高度]=读BCI文件(bciRdFile);%%将Rx设置写入回信道通信文件。bciWrFile='BCI_comm.csv';序列=序列+1;%%初始化序列计数器%发布接收功能numDFEtaps=4;DFEtaps=[0.0000,0.0000,0.0000,0.0000];writeBCI文件(bciWrFile,'w',协议,numDFEtaps,numFFEtaps%写入日志文件logFileName='BCI_comm_log.csv';writeBCIhistory(日志文件名,“Rx”,“Init”,0,Rx_BCI_WriteBCI_State_ST,numDFEtaps,numFFEtaps、DFEtap、FFEtap,Sequence,EyeHeight)%启用训练时,强制将DFE模式设置为“固定”。DFECD单元。模式=1;结束

要测试新的用户代码是否正常工作,请保存并运行模型,然后验证是否已创建回通道通信(BCI_comm.csv)和日志(BCI_comm_log.csv)文件,以及文件中的值是否与上面设置的值匹配。在BCI_comm_log.csv文件中,您应该看到第一个RX调用已添加到日志文件中(序列#2)。对于未连接的块,可以忽略现有的12个警告。这是由于自动生成的数据存储块稍后将被处理。

设置Tx Tx_BCI直通块

Tx_BCI块用于控制整个信道训练过程。第一次通过它初始化训练期间将优化的所有Tx和Rx参数。在每个反向通道训练循环后,此块将读取Rx提供的当前眼压,存储此值,然后更新下一次传递的Tx和Rx参数。训练完成后,此模块将发出训练完成的信号,将所有Tx和Rx参数设置为它们的最佳值,然后将模型返回到常规操作。

第一步是设置Tx_BCI块以进行反向通道操作。控制Tx_BCI块操作的MATLAB功能块将在本例后面编写。

查看Tx_BCI块中的掩码下面。您应该会看到8个自动生成的数据存储读/写块。

删除Pass-Through系统对象,因为它未被使用。确保将输入端口连接到输出端口。

添加一个Mux块并将输入数量设置为3。这将用于多路传输三个点击重量输入DataStoreRead将信号读入单个向量。

添加一个Demux块,并将输出数量设置为3。这将用于对点击重量输出向量转换为三个独立的DataStoreWrite信号。

添加新的MATLAB功能块并将标签设置为计数器。此MATLAB函数返回模型处理的样本总数以及UI的结果数。打开这个新的MATLAB功能块,然后复制/粘贴以下代码,替换默认内容。

function[sampCount,uiCount]=计数器(SymbolTime,SampleInterval)%计算每比特采样数sampBit=round(符号时间/采样间隔);%设置持久变量持久x y如果为空(x)x=整数32(1);y=整数32(1);其他的x=x+1;结束%按UI开始计数如果mod(x,sampBit)==0y=y+1;结束%输出结果sampCount=x;uiCount=y;

此函数的两个输入值,符号时间采样间隔(SampleInterval)继承自模型工作区,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除这些节点:

  1. 保存模型。

  2. 在MATLAB函数签名中突出显示参数符号时间.

  3. 右键单击参数并选择“SymbolTime”的数据范围从右键单击菜单中选择。

  4. 将数据范围从输入参数.

  5. 对重复此过程采样间隔(SampleInterval).

  6. 现在您应该看到,这两个输入参数已从Simulink画布上的功能块中删除。

此函数输出的数据类型,采样计数ui计数默认情况下,设置为“继承”。由于此功能块正在为这两个参数创建值,因此需要显式定义其数据类型,而不是根据试探法确定。要明确定义这两个参数的数据类型,请执行以下操作:

  1. 打开Simulink模型浏览器并导航至Tx->Tx_BCI->Counter。

  2. 突出显示参数采样计数.

  3. 将类型从Inherit更新为整数32然后单击应用.

  4. 对重复此过程ui计数.

添加另一个新MATLAB函数块并将标签设置为txB培训此MATLAB功能块用于控制反向通道训练过程。本例稍后将介绍此函数的内容。然而,要完成Tx_BCI块连接,必须显示所有正确的节点。要启用此功能,请执行以下操作:

  1. 双击txBCtraining MATLAB功能块,在函数编辑器中打开它。

  2. 删除所有默认内容。

  3. 插入以下函数签名:

function[tapWeightsOut,BCIStateOut]=txBCtraining(点击权重In,BCIS状态In,样本计数器,uiCounter,符号时间,样本间隔)

此函数的两个输入值,符号时间采样间隔(SampleInterval)继承自模型工作区,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除这些节点,请执行以下操作:

  1. 保存模型。

  2. 在MATLAB函数签名中突出显示参数符号时间.

  3. 右键单击参数并选择“SymbolTime”的数据范围.

  4. 将数据范围从输入参数.

  5. 对重复此过程采样间隔(SampleInterval).

  6. 保存模型时,您应该会看到这两个输入参数已从Simulink画布上的功能块中删除。

按如下所示将所有部件连接在一起:

txB培训.png

设置Rx Rx_BCI_Read块

Rx_BCI_Read块用于读取Tx_BCI块请求的Rx参数值,并为下一个信道训练周期设置这些值。如果Tx_BCI块发出训练完成的信号,则该块设置最终值,用于模拟的其余部分。

第一步是设置Rx_BCI_Read块以进行反向通道操作。控制Rx_BCI_Read块操作的MATLAB功能块将在后面的示例中编写。

查看Rx_BCI_Read块中的掩码下面。

删除Pass-Through系统对象,因为它不会被使用。确保将输入端口连接到输出端口。

添加数据存储读取 块已标记DFECDR分接头重量in

  1. 双击数据存储读取块并将数据存储名称设置为:DFECDR信号.

  2. 在Element Selection选项卡上,展开信号DFECDRSignal并高亮显示攻丝重量[1,4].

  3. 选择>>按钮选择此元素。

  4. 保存更改。

添加数据存储读取 块已标记RxBCI状态输入

  1. 双击数据存储读取块并将数据存储名称设置为:Rx_BCI_写入信号.

  2. 在元素选择选项卡上,展开信号Rx_BCI_WriteSignal并高亮显示BCI_状态_ST.

  3. 选择>>按钮选择此元素。

  4. 保存更改。

添加数据存储写入 块已标记RxBCI状态输出

  1. 双击数据存储写入块并将数据存储名称设置为:Rx_BCI_写入信号.

  2. 在元素分配选项卡上,展开信号Rx_BCI_WriteSignal并高亮显示BCI_状态_ST.

  3. 选择>>按钮分配此元素。

  4. 保存更改。

添加数据存储写入 块已标记DFECDRT地图权重输出

  1. 双击数据存储写入块并将数据存储名称设置为:DFECDR信号.

  2. 在Element Assignment选项卡上,展开信号DFECDRSignal并高亮显示攻丝重量[1,4].

  3. 选择>>按钮分配此元素。

  4. 保存更改。

复制计数器MATLAB功能块从Tx Tx_BCI块进入此块。

添加新的MATLAB函数块并将标签设置为rxB培训读取此MATLAB功能块用于控制反向通道训练过程。本例稍后将介绍此函数的内容。但是,要完成Rx_BCI_Read块连接,必须显示所有正确的节点。要启用此功能:

  1. 双击rxBCtrainingRead MATLAB功能块以在编辑器中打开。

  2. 删除所有默认内容。

  3. 插入以下函数签名:

函数[BICStateOut,tapWeightsOut]=rxBCtrainingRead(tapWeightsIn,BCIStateIn,sampleCounter,uiCounter,SymbolTime,SampleInterval)

此函数的两个输入值,符号时间采样间隔(SampleInterval)继承自模型工作区,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除这些节点:

  1. 保存模型。

  2. 在MATLAB函数签名中突出显示参数符号时间.

  3. 右键单击参数并选择“SymbolTime”的数据范围.

  4. 将数据范围从输入参数.

  5. 对重复此过程采样间隔(SampleInterval).

  6. 保存模型时,您应该会看到这两个输入参数已从Simulink画布上的功能块中删除。

按如下所示将所有部件连接在一起:

rxB培训阅读.png

设置Rx Rx_BCI_Write块

Rx_BCI_Write块在每个反向信道训练周期结束时用于计算当前眼睛度量,并将这些度量报告回Tx_BCI块以进行分析。

第一步是设置Rx_BCI_Write块以进行反向通道操作。控制Rx_BCI_Write块操作的MATLAB功能块将在后面的示例中编写。

查看Rx_BCI_Write块中掩码的下面。您可以看到四个自动生成的数据存储读/写块。

删除Pass-Through系统对象,因为它未被使用。确保将输入端口连接到输出端口。

删除标记为的数据存储写入块样本电压写入。它不会被使用。

添加数据存储读取 块已标记DFECDR分接头重量in.

  1. 双击数据存储读取块并将数据存储名称设置为DFECDR信号.

  2. 在Element Selection选项卡上,展开信号DFECDRSignal并高亮显示攻丝配重 [1,4].

  3. 选择>>按钮选择此元素。

  4. 保存更改。

复制计数器MATLAB功能块从Tx Tx_BCI块进入此块。

添加新的MATLAB函数块并将标签设置为rxB培训写入该MATLAB功能块用于控制反向通道训练过程。本例稍后将介绍此函数的内容。但是,要完成Rx_BCI_Write块连接,必须显示所有正确的节点。要启用此功能:

  1. 双击rxBCtrainingWrite MATLAB功能块以在编辑器中打开。

  2. 删除所有默认内容。

  3. 插入以下函数签名:

函数BCIStateOut=rxBCtrainingWrite(示例V,点击WeightsIn,BCIState In,示例计数器,uiCounter,符号时间,采样间隔)

此函数的两个输入值,符号时间采样间隔(SampleInterval),是从模型工作空间继承的,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除这些节点:

  1. 保存模型。

  2. 在MATLAB函数签名中突出显示参数符号时间.

  3. 右键单击参数并选择“SymbolTime”的数据范围.

  4. 将数据范围从输入参数.

  5. 对重复此过程采样间隔(SampleInterval).

  6. 保存模型时,您应该会看到这两个输入参数已从Simulink画布上的功能块中删除。

按如下所示将所有部件连接在一起:

rxB培训写入.png

编辑txBCtraining MATLAB功能块

Tx_BCI块用于控制整个信道训练过程。第一次通过它初始化训练期间将优化的所有Tx和Rx参数。在每个反向通道训练循环后,此块读取Rx提供的当前眼压,存储此值,然后更新下一次传递的Tx和Rx参数。训练完成后,此模块表示训练完成,将所有Tx和Rx参数设置为其最佳值,然后将模型返回到常规操作。

在本例前面,Tx_BCI块是为反向通道操作设置的。现在,您将在Tx_BCI块的核心创建MATLAB功能块。此MATLAB功能块,标记为txB培训,控制整个反向训练过程。该过程涉及的步骤如下:

  1. 定义函数签名。

  2. 初始化参数并设置持久变量。

  3. 定义要扫描的参数及其范围。

  4. 在第一次GetWave调用中,设置Tx和Rx的初始起始参数值。

  5. 每个后频道训练周期都会读取Rx计算的眼动指标,并决定下一步要做什么。当训练完成时,表示训练完成,输出仿真期间要使用的最佳Tx和Rx参数值,并将这些最终值写入日志文件。

  6. 设置适当的训练状态并输出要使用的FFE参数。

以下各节将向您介绍txBCtraining MATLAB功能块中使用的代码。在Tx块中,单击Tx_BCI直通块并键入删除到行首推入先前设置的Tx_BCI直通块。双击txB培训MATLAB功能块,然后复制/粘贴以下章节中描述的代码。

定义函数签名

txBC训练块的功能签名有6个输入和2个输出。输入为:

  • 点击重量输入:FFE tap weights数组,如FFE掩码中所定义。

  • BCI状态in:数据存储中TxBCIStateIn的反向通道状态值。

  • 样本计数器:样本总数计数。

  • ui计数器:UI总数计数。

  • 符号时间:UI(以秒为单位)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。为了从MATLAB功能块中删除此节点,数据范围先前设置为参数.

  • 采样间隔(SampleInterval):模拟步长(秒)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。为了从MATLAB功能块中删除此节点,数据范围先前设置为参数.

有两种输出:

  • 点击重量输出:FFE抽头权重数组输出到BCIFFETapWeightsOut数据存储。

  • BCI声明:输出到TxBCIStateOut数据存储的反向信道状态值。

函数签名是在最初创建MATLAB函数块时添加的,因此已经存在。

初始化参数和变量

本节设置了计算反向通道训练周期大小所需的三个常数:

  • 样本位:每个UI中的样本数。

  • 消息间隔:每个反向通道培训周期的长度(UI)。此值当前设置为~2个PRBS7迭代。

  • BCI等待:开始反向通道训练之前的延迟时间(在UI中)。该值当前设置为~4个PRBS7迭代。

除了常量值之外,本节还设置了此函数使用的11个持久变量。持久变量在每次调用此MATLAB函数之间保留其值。11个持久变量是:

  • 协议:此反向通道模型使用的协议。

  • 数字DFE映射:此反向信道训练算法中包含的DFE抽头的数量。

  • FFE映射数:此反向通道训练算法中包含的FFE抽头数。

  • DFE标签:当前DFE抽头值。

  • FFE标签:当前FFE抽头值。

  • 顺序:用于记录训练事件序列的整数计数器。

  • :当前的反向训练状态。

  • 眼睛高度:Rx报告的当前眼高(单位:伏特)。

  • :当前正在运行的培训序列步骤。

  • indx公司:控制回路的索引变量。

  • 米制的:用于存储每个训练步骤传入的眼睛高度的数组。

要初始化这些参数和变量,请将以下代码复制/粘贴到txBCtraining MATLAB功能块的底部:

%%设置sampBit=round(SymbolTime/SampleInterval);%%计算每比特采样数消息间隔=256;%%后通道训练循环迭代的长度(在UI中)(约2次PRBS7迭代)BCI等待=512;%%开始训练前的延迟时间(UI中)(~4个PRBS7迭代)%%读取BCI文件以确定训练值%在时间步之间提供变量持久协议编号DFEtaps编号FFEtaps DFEtaps-FFEtaps序列状态EyeHeight步长indx度量%初始化变量初始条件if isempty(协议)协议=“默认值”;结束如果为空(numDFEtaps)numDFEtaps=4;结束如果为空(numFFEtaps)numFFEtaps=3;结束如果为空(DFEtaps)DFEtaps=[0.000,0.000,0.000-0.000];结束如果为空(FFEtaps)FFEtaps=[0.000,1.000,0.000];结束if isempty(序列)序列=1;结束如果是空的(州)状态=“测试”;结束如果为空(眼睛高度)眼睛高度=0.000;结束如果为空(步骤)步骤=1;结束如果为空(indx)indx=1;结束如果为空(公制)公制=零(50,1);结束

定义扫描参数

本例中实现的训练算法分别扫描FFE抽头前后的值和所有4个DFE抽头,然后为每个抽头选择最佳值。八个参数用于定义每个抽头的范围和训练期间使用的步长:

  • ffe分接头步骤:清扫FFE水龙头时使用的步长。该值为负值,因为FFE抽头值始终<=0。

  • dfeTapStep:清扫DFE水龙头时使用的步长。

  • regFFE参数1:扫掠FFE预抽头时要使用的最小/最大值范围。

  • 注册FFEtap1:清扫FFE后抽头时使用的最小/最大值范围。

  • 注册DFEtap1:清扫第一个DFE水龙头时要使用的最小/最大值范围。

  • 注册DFEtap2:清扫第二个DFE水龙头时要使用的最小/最大值范围。

  • 规则DFEtap3:清扫第三个DFE水龙头时要使用的最小/最大值范围。

  • 注册DFEtap4:清扫第四个DFE丝锥时要使用的最小/最大值范围。

要定义培训期间要扫描的所有参数,请将以下代码复制/粘贴到txBCtraining MATLAB功能块的底部:

%定义参数步长ffeTapStep=-0.050;dfeTapStep=0.010;%将范围映射到寄存器值regFFEtapm1=(0.000:ffeTapStep:-0.300);regFFEtap1=(0.000:ffeTapStep:-0.300);regDFEtap1=(-0.200:dfeTapStep:0.050);regDFEtap2=(-0.075:dfeTapStep:0.075);regDFEtap3=(-0.060:dfeTapStep:0.060);regDFEtap4=(-0.045:dfeTapStep:0.045);

第一次GetWave呼叫

启用训练后,第一次调用此MATLAB函数时,需要读取Init期间编写的反向通道通信文件,以确定Tx和Rx模型的全部功能。本节还设置用于第一个反向通道训练周期的初始值。最后,所有这些值都会写入回通道通信日志文件。

要实现第一个GetWave调用,请将以下代码复制/粘贴到txBCtraining MATLAB功能块的底部:

%%第一次Tx GetWave调用(序列=3)如果sampleCounter==1&&BCIStateIn==2%培训已启用%读取反向信道通信文件以获取当前设置bciRdFile='BCI_comm.csv';[~,numDFEtap,numFFEtaps,~,~,Sequence,~,EyeHeight]=读BCI文件(bciRdFile);%决定先做什么%Tx参数FFEtaps=[0.000,1.000,0.000];%Rx参数DFEtaps=【0.0000,0.0000,0.0000,0.0000】;%使用Rx的首次通过设置写入反向信道通信文件bciWrFile=“BCI_comm.csv”;协议=['DDR5'0];%%空终止字符串以使fprintf在C中保持愉快++状态=['Training'0];%%空终止字符串以使fprintf在C中保持愉快++序列=序列+1;writeBCI文件(bciWrFile,'w',协议,numel(DFEtaps),numel-(FFEtap),DFEtap,FFEtaps,序列,状态,EyeHeight)%写入日志文件logFileName='BCI_comm_log.csv';writeBCIhistory(logFileName,'Tx','GetW',sampleCounter,BCIStateIn,numel(DFEtaps),numel(FFEtap),DFEtap,FFEtaps,Sequence,EyeHeight)结束

Back-channel训练算法

启用培训后,等待常量定义的UI数BCI等待,后通道训练算法称为消息间隔常数。首先读取Rx报告的当前度量,然后将这些结果写入回通道通信日志文件。训练算法使用以下步骤:

  1. 扫描FFE预抽头的所有值,并确定哪个值导致最大的睁眼。

  2. 扫描FFE后抽头的所有值,并确定哪个值会导致最大的眼睛睁开。

  3. 扫描DFE抽头1的所有值,并确定哪个值导致最大睁眼。

  4. 扫描DFE抽头2的所有值,并确定哪个值导致最大睁眼。

  5. 扫描DFE抽头3的所有值,并确定哪个值导致最大睁眼。

  6. 扫描DFE抽头4的所有值,并确定哪个值导致最大睁眼。

  7. 培训完成后,将状态更改为“聚合”并将最终值写入回通道通信日志文件。

要实现反向通道训练算法,请将以下代码复制/粘贴到txBCtraining MATLAB功能块的底部:

%%每个后续BCI块(序列=5,7,9,11…)如果uiCounter>BCIwait+2&&mod(sampleCounter-1,(messageInterval*sampBit))==0&&BCIStateIn==2%培训已启用%从回通道通信文件读取用于前16个GetWaveblocks的设置bciRdFile='BCI_comm.csv';[~、~、~,~,~、序列、~、EyeHeight]=读取BCI文件(bciRdFile);%将当前结果写入日志文件序列=序列+1;logFileName='BCI_comm_log.csv';writeBCIhistory(logFileName,'Tx','GetW',sampleCounter,BCIStateIn,numel(DFEtaps),numel(FFEtap),DFEtap,FFEtaps,Sequence,EyeHeight)如果indx~=1%存储当前指标metric(indx-1)=眼睛高度;结束%决定下一步做什么开关步进情况1%步骤1:确定FFE接头的最佳值-1状态=['Training'0];%%空终止字符串以使fprintf在C中保持愉快++如果indx<=长度(regFFEtapm1)%为下一次迭代设置值FFEtaps(1)=regFFEtapm1(indx);FFEtaps(3)=0.0;FFEtaps(2)=1-abs(FFEtap(1))-abs;indx=indx+1;elseif indx==长度(regFFEtapm1)+1%设置最佳度量[~,jj]=最大值(公制);FFEtaps(1)=regFFEtapm1(jj);FFEtaps(3)=0.0;FFEtaps(2)=1-abs(FFEtap(1))-abs;%完成。为下一步做准备公制=零(50,1);步骤=步骤+1;indx=1;结束情况2%步骤2:确定FFE抽头1的最佳值状态=['Training'0];如果indx<=长度(regFFEtap1)%设置下一次迭代的值%FFEtaps(1)=0.0;%%使用步骤1中的值FFEtaps(3)=regFFEtap1(indx);FFEtaps(2)=1-abs(FFEtap(1))-abs;indx=indx+1;elseif indx==长度(regFFEtap1)+1%设置最佳度量[~,jj]=最大值(公制);FFE抽头(3)=regFFE抽头1(jj);FFEtaps(2)=1-abs(FFEtap(1))-abs;%完成。为下一步做好准备公制=零(50,1);步骤=步骤+1;indx=1;结束情况3%步骤3:确定DFE抽头1的最佳值状态=['Training'0];如果indx<=长度(regDFEtap1)%为下一次迭代设置值DFEtaps=[regDFEtap1(indx),0.0000,0.0000,00000];indx=indx+1;elseif indx==长度(regDFEtap1)+1%设置最佳度量[~,jj]=最大值(公制);DFEtap=[regDFEtap2(jj),0.0000,0.0000,0.0000];%完成。为下一步做准备公制=零(50,1);步骤=步骤+1;indx=1;结束情况4%步骤4:确定DFE抽头2的最佳值状态=['Training'0];如果indx<=长度(regDFEtap2)%设置下一次迭代的值DFEtaps(2:4)=[regDFEtap2(indx),0.0000,0.0000];indx=indx+1;elseif indx==长度(regDFEtap2)+1%设置最佳度量[~,jj]=最大值(公制);DFEtaps(2:4)=[regDFEtap2(jj),0.0000,0.0000];%完成。为下一步做准备公制=零(50,1);步骤=步骤+1;indx=1;结束情况5%步骤5:确定DFE抽头3的最佳值状态=['Training'0];如果indx<=长度(regDFEtap3)%设置下一次迭代的值DFEtaps(3:4)=【regDFEtaps3(indx),0.0000】;indx=indx+1;elseif indx==长度(regDFEtap3)+1%设置最佳度量[~,jj]=最大值(公制);DFEtaps(3:4)=[regDFEtap3(jj),0.0000];%完成。为下一步做好准备公制=零(50,1);步骤=步骤+1;indx=1;结束情况6%步骤6:确定DFE抽头4的最佳值状态=['Training'0];如果indx<=长度(regDFEtap4)%设置下一次迭代的值DFEtaps(4)=regDFEtap4(indx);indx=indx+1;elseif indx==长度(regDFEtap4)+1%设置最佳度量[~,jj]=最大值(公制);DFEtaps(4)=regDFEtap4(jj);%完成。为下一步做准备公制=零(50,1);步骤=步骤+1;indx=1;结束案例7%步骤7:培训完成状态=['Converged'0];%在日志文件中写入最终条目logFileName='BCI_comm_log.csv';序列=序列+1;writeBCIhistory(logFileName,'Tx','GetW',sampleCounter,3,numel(DFEtaps),numel(FFEtap),DFEtap,FFEtaps,Sequence,EyeHeight)否则状态=['错误'0];结束%使用Rx的下一次通过设置写入回信道通信文件bciWrFile='BCI_comm.csv';协议=['DDR5'0];%%空终止字符串以使fprintf在C中保持愉快++writeBCI文件(bciWrFile,'w',协议,numel(DFEtaps),numel-(FFEtap),DFEtap,FFEtaps,序列,状态,EyeHeight)结束

设置训练状态和输出参数值

此MATLAB函数需要完成的最后一件事是更新BCI_State_ST数据存储的状态,并更新FFE抽头数组值。

要设置训练状态和输出值,请将以下代码复制/粘贴到txBCtraining MATLAB功能块的底部:

%%设置反向通道状态if strcmpi(State,'Off')BCIStateOut=1;elseif strcmpi(State,'Training')BCIStateOut=2;elseif strcmpi(状态,'Converged')BCI状态输出=3;elseif strcmpi(State,'Failed')||strcmpi(状态,['Failed'0])BCI状态输出=4;else%错误BCI状态输出=5;结束%%根据训练设置输出FFE值如果BCIStateOut==2||BCIState Out==3%启用训练/融合tapWeightsOut=FFEtaps(:);else%培训关闭/失败/错误tapWeightsOut=tapWeightsIn;结束

保存并关闭此MATLAB功能块。

编辑rxBCtrainingRead MATLAB功能块

Rx_BCI_Read块用于读取Tx_BCI块请求的Rx参数值,并为下一个信道训练周期设置这些值。如果Tx_BCI块发出训练完成的信号,则该块设置Rx在剩余仿真中使用的最终值。

在本例前面,Rx_BCI_Read块是为反向通道操作设置的。现在在Rx_BCI_Read块的中心创建MATLAB功能块。这个MATLAB功能块rxB培训读取,设置要使用的Rx DFE值。该过程涉及的步骤如下:

  1. 定义函数签名。

  2. 初始化参数并设置持久变量。

  3. 在第一次GetWave调用时,在每个反向通道训练周期的开始,读取要使用的Rx DFE抽头值,如Tx反向通道训练算法所指定。

  4. 设置正确的训练状态并输出要使用的DFE参数。

以下各节将引导您完成rxBCtrainingRead MATLAB功能块中使用的代码。在Rx块中,单击Rx_BCI_Read pass-through块并键入删除到行首推入之前设置的Rx_BCI_Read-pass-through块。双击rxB培训读取MATLAB功能块,然后复制/粘贴以下章节中描述的代码。

定义函数签名

rxBCtrainingRead块的函数签名有6个输入和2个输出。输入包括:

  • 点击重量输入:数据存储中DFECDRTapWeights中定义的DFE抽头权重数组。

  • BCI状态in:数据存储中RxBCIStateIn的反向通道状态值。

  • 采样计数器:样本总数计数。

  • ui计数器:UI总数计数。

  • 符号时间:UI(以秒为单位)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除此节点,数据范围已设置为“参数".

  • 采样间隔(SampleInterval):模拟步长(秒)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除此节点,数据范围已设置为“参数".

有两种输出:

  • 点击重量输出:DFE抽头权重数组输出到DFECDRTapWeightsOut数据存储。

  • BCI状态输出:输出到RxBCIStateOut数据存储的反向信道状态值。

函数签名是在最初创建MATLAB函数块时输入的,因此已经存在。

初始化参数和变量

本节设置了计算反向通道训练周期大小所需的三个常数:

  • 样本位:每个UI中的样本数。

  • 消息间隔:每个反向通道培训周期的长度(UI)。此值当前设置为~2个PRBS7迭代。

  • BCI等待:开始反向通道训练之前的延迟时间(在UI中)。该值当前设置为~4个PRBS7迭代。

除了常量值之外,本节还设置了此函数使用的7个持久变量。持久变量在每次调用此MATLAB函数之间保留其值。这7个持久变量是:

  • 协议:此后台通道模型正在使用的协议。

  • 数字DFE映射:此反向通道训练算法中包含的DFE抽头数。

  • FFE映射数:此反向通道训练算法中包含的FFE抽头数。

  • DFE标签:当前DFE抽头值。

  • FFE抽头:当前FFE抽头值。

  • 顺序:用于记录训练事件序列的整数计数器。

  • :当前的反向训练状态。

要初始化参数和变量,请将以下代码复制/粘贴到rxBCtrainingRead MATLAB功能块的底部:

%%设置sampBit=round(SymbolTime/SampleInterval);%%计算每比特采样数消息间隔=256;%%后通道训练循环迭代的长度(UI)(~2个PRBS7迭代)BCI等待=512;%%开始训练前的延迟时间(在UI中)(~4次PRBS7迭代)%在时间步之间提供变量持久协议numDFEtaps numFFEtaps DFEtaps-FFEtaps序列状态;%初始化变量初始条件if isempty(协议)协议=“默认值”;结束如果为空(numDFEtaps)numDFEtaps=4;结束如果为空(numFFEtaps)numFFEtaps=3;结束如果为空(DFEtaps)DFEtaps=tapWeightsIn;结束如果为空(FFEtaps)FFEtaps=[0,0,0];结束if isempty(序列)序列=1;结束如果是空的(州)如果BCIStateIn==1%关闭状态=['Off'0];elseif BCIStateIn==2%培训状态=[训练'0];elseif BCIStateIn==3%已收敛状态=['Converged'0];elseif BCIStateIn==4%失败状态=['失败'0];else%错误状态=['错误'0];结束结束

读取要使用的DFE抽头值

启用训练后,在第一次调用此MATLAB函数时,以及在由消息间隔常数,则读取反向信道通信文件以确定下一训练周期要使用的更新的DFE抽头值。

要设置要使用的DFE抽头值,请将以下代码复制/粘贴到rxBCtrainingRead MATLAB功能块的底部:

%%每个BCI块的第一个GetWave块(序列=3,5,7,9,11,…)%读取反向信道通信文件以获取当前设置if(sampleCounter==1&&BCIStateIn==2)||((uiCounter>BCIwait+2&&mod(sappleCounter-1,(messageInterval*sampBit))==0)&&BCIStateIn==2)%训练已启用bciRdFile='BCI_comm.csv';[协议,numDFEtaps,numFFEtaps(1,1:4),FFEtap,序列,状态,~]=读BCI文件(bciRdFile);结束

设置训练状态并输出参数值

此MATLAB功能块需要完成的最后一件事是更新BCI_State_ST数据存储的状态,并更新DFE抽头阵列值。

要设置状态和输出值,请将以下代码复制/粘贴到rxBCtrainingRead MATLAB功能块的底部:

%%设置反向通道状态if strcmpi(State,'Off')BCIStateOut=1;elseif strcmpi(State,'Training')BCIStateOut=2;elseif strcmpi(状态,'Converged')BCI状态输出=3;elseif strcmpi(State,'Failed')||strcmpi(状态,['Failed'0])BCI状态输出=4;else%错误BCI状态输出=5;结束%%根据训练设置输出DFE值如果启用BCIStateOut==2%训练tapWeightsOut=DFEtaps(1,1:4);其他的tapWeightsOut=tapWeghtsIn;结束

保存并关闭此MATLAB功能块。

编辑rxBCtrainingWrite MATLAB功能块

Rx_BCI_Write块在每个后通道训练周期结束时使用,以计算当前眼动指标,并将这些指标报告回Tx_BCI块进行分析。

Rx_BCI_Write块是在本例早些时候为反向通道操作而设置的。现在将创建Rx_BCI_Write块中心的MATLAB功能块。我们标记的这个MATLAB功能块rxB培训写入,将计算最后127位的最小眼高,并将这些值写入回通道通信文件和日志文件。该过程涉及的步骤如下:

  1. 定义函数签名。

  2. 初始化参数并设置持久变量。

  3. 存储计算最小眼睛高度时要使用的电压矢量。

  4. 在每个反向通道训练周期结束时,计算最小眼高并将其写入反向通道通信文件。

  5. 更新培训状态。

以下各节将详细介绍rxBCtrainingWrite MATLAB功能块中使用的代码。在Rx块中,单击Rx_BCI_Write pass-through块并键入删除到行首以推入先前设置的Rx_BCI_Write直通块。双击rxB培训写入MATLAB功能块,然后复制/粘贴以下章节中描述的代码。

定义函数签名

rxBCtrainingWrite块的函数签名有7个输入和1个输出。输入为:

  • 样品V:CDR采样时的电压。

  • 点击重量输入:数据存储中DFECDRTapWeights中定义的DFE抽头权重数组。

  • BCI状态in:数据存储中RxBCIStateIn的反向通道状态值。

  • 样本计数器:样本总数计数。

  • ui计数器:UI总数计数。

  • 符号时间:UI(以秒为单位)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除此节点,数据范围已设置为“参数".

  • 采样间隔(SampleInterval):模拟步长(秒)。此值从模型工作区继承,因此不需要在MATLAB功能块上显示为节点。要从MATLAB功能块中删除此节点,数据范围已设置为“参数".

有一个输出:

  • BCI声明:输出到RxBCIStateOut数据存储的反向信道状态值。

函数签名是在最初创建MATLAB函数块时输入的,因此已经存在。

初始化参数和变量

本节设置了计算反向通道训练周期大小所需的四个常数:

  • 样本位:每个UI中的样本数。

  • 消息间隔:每个反向通道培训周期的长度(UI)。此值当前设置为~2个PRBS7迭代。

  • BCI等待:开始反向通道训练之前的延迟时间(在UI中)。该值当前设置为~4个PRBS7迭代。

  • 窗口长度:用于计算最小眼睛高度的窗口长度(在UI中)。该值当前设置为1 PRBS7迭代。

除了常量值之外,本节还设置了此函数使用的5个持久变量。持久变量在每次调用此MATLAB函数之间保留其值。5个持久变量是:

  • 协议:此反向通道模型使用的协议。

  • 顺序:用于记录训练事件序列的整数计数器。

  • :当前的反向训练状态。

  • 眼睛高度:计算的内眼高度值(单位:伏特)。

  • vSamp(虚拟样机):CDR块报告的样本电压。

要初始化此块的所有参数和变量,请将以下代码复制并粘贴到rxBCtrainingWrite MATLAB功能块的底部:

%%设置sampBit=round(SymbolTime/SampleInterval);%%计算每比特采样数消息间隔=256;%%后通道训练循环迭代的长度(UI)(~2个PRBS7迭代)BCI等待=512;%%开始训练前的延迟时间(UI中)(~4个PRBS7迭代)窗口长度=127;%%用于计算最小眼睛高度的窗口长度(UI中)(1个PRBS7迭代)%在时间步之间提供变量持久协议序列状态EyeHeight vSamp如果是空的(州)如果BCIStateIn==1%折扣状态=['Off'0];elseif BCIStateIn==2%培训状态=['Training'0];elseif BCIStateIn==3%已收敛状态=['Converged'0];elseif BCIStateIn==4%失败状态=['失败'0];else%错误状态=['错误'0];结束结束

存储报告电压的矢量

本节累积用于最小眼高计算的电压滚动矢量。我们假设这些电压在0V左右对称,因此使用绝对值。

要存储报告眼睛电压值,请将以下代码复制/粘贴到rxBCtrainingWrite MATLAB功能块的底部:

%累积电压滚动矢量以计算最小眼高如果是空的(vSamp)vSamp=零(1,windowLength*sampBit);结束vSamp=循环移位(vSamp,1);vSamp(1)=abs(样本V);%假设对称且仅使用正值

计算最小眼睛高度并写入文件

启用培训后,等待常量定义的UI数BCI等待根据消息间隔常数。首先从后通道通信文件中读取后通道配置,然后计算内眼高度值,并将结果输出到后通道通信和日志文件。

要计算眼睛指标并在每个反向通道周期写入通信文件,请将以下代码复制/粘贴到rxBCtrainingWrite MATLAB功能块的底部:

%%在每个BCI块的末尾写入当前状态和眼动指标如果uiCounter>BCIwait+2&&mod(sampleCounter,(messageInterval*sampBit))==0&&BCIStateIn==2%启用训练(序列=4,6,8,10,12,…)%从回通道通信文件读取最后16个GetWaveblocks使用的设置bciRdFile='BCI_comm.csv';[协议,~,~,~,FFEtaps,序列,状态,~]=读BCI文件(bciRdFile);%根据采样电压计算内眼高度:眼睛高度=最小值(vSamp)*2;%2倍,因为使用了绝对值。%使用BCI-Block度量的结尾编写新的反向信道通信文件bciWrFile='BCI_comm.csv';序列=序列+1;writeBCI文件(bciWrFile,'w',协议,numel(tapWeightsIn),numel(FFEtaps),tapWeghtsIn,FFEtap,序列,状态,眼睛高度)%%写入日志文件:logFileName='BCI_comm_log.csv';writeBCIhistory(logFileName,'Rx','GetW',sampleCounter,BCIStateIn,numel(tapWeightsIn),numel(FFEtaps),tapWeghtsIn,FFEtap,Sequence,EyeHeight)结束

设置训练状态

在这个MATLAB函数块中需要做的最后一件事是更新BCI_State_ST数据存储的状态。

要设置训练状态,请将以下代码复制/粘贴到rxBCtrainingRead MATLAB功能块的底部:

%%如果状态输入更改,则更新状态输出如果BCIStateIn==3%已收敛状态=['Converged'0];elseif BCIStateIn==4%失败状态=['失败'0];结束if strcmpi(State,'Off')BCIStateOut=1;elseif strcmpi(State,'Training')BCIStateOut=2;elseif strcmpi(状态,'Converged')BCIStateOut=3;elseif strcmpi(State,'Failed')||strcmpi(状态,['Failed'0])BCI状态输出=4;else%错误BCI状态输出=5;结束

保存并关闭此MATLAB功能块。

在Simulink中,键入Ctrl-D键编译模型并检查错误。在继续之前解决所有错误。

注:一个常见错误是错误地将数据存储连接到MATLAB功能块。如果有任何错误,请检查每个直通块中的所有连接。

运行模型并验证结果

下一步是运行模型并验证反向通道代码是否正常运行。

设置仿真参数

在运行完整模型之前,打开刺激块以设置用于测试模型的刺激模式:

  • 设置符号数量50000以使back-channel训练算法有足够的时间来完成。

  • 设置波形创建方法串行PRBS

  • 设置PRBS订单7,从而在模拟期间将使用PRBS7模式。

接下来,打开IBIS-AMI Manager。导出选项卡,设置接收要忽略的位25000在开始保存输出波形之前,为back-channel算法留出时间。

反向通道输入结果.png

测试Tx和Rx型号的正确操作

运行模型。当模型运行时,观察扫描每个抽头设置时时域波形的变化。模拟完成后,回信道通信文件BCI_comm.csv现在包含最终优化的FFE和DFE抽头设置,其外观应类似于:

协议,DDR5,数字DFE映射,4,数字FFE映射,3,DFEtaps,0.00000,-0.00500,-0.00000,-0.0050,FFEtaps,0.00000,0.85000,-0.15000,序列,176,状态、聚合、,眼睛高度,0.543841,

在电子表格编辑器中打开后台通道通信日志文件BCI_comm_log.csv。日志文件中的每一行显示写入文件(Tx或Rx)的模型的序列号、当前采样计数、BCI_State和计算的眼高。日志中的最后7列显示了当前模拟的FFE和DFE抽头值。观察扫掠每个值时“眼睛高度”(Eye Height)的变化,并在每次迭代后设置提供最大眼睛高度的参数值。注意,FFE0的值总是根据FFE-1和FFE1的值计算得出的。

生成DDR5 Tx/Rx IBIS-AMI模型

本例的最后一部分采用定制的Simulink模型,并生成符合IBIS-AMI的DDR5模型可执行文件、IBIS和AMI文件。

打开SerDes IBIS-AMI经理。

导出模型

导出SerDes IBIS-AMI Manager对话框中的选项卡:

  • 更新Tx型号名称地址5_bc_tx.

  • 更新Rx型号名称地址:5_bc_rx.

  • 请注意Tx和Rx转角百分比设置为10。这将按+/-10%缩放最小/最大模拟模型角点值。

  • 确认双模式被选择用于Tx和Rx AMI模型设置。这将创建支持统计(Init)和时域(GetWave)分析的模型可执行文件。

  • 设置Tx模型位忽略值因为Tx FFE中有三个抽头。

  • 设置Rx模型位忽略值至25000以便在时域仿真期间有足够的时间完成培训。

  • 设置要导出的模型作为Tx和Rx以便选择要生成的所有文件(IBIS文件、AMI文件和DLL文件)。

  • 设置IBIS文件名成为地址:5_bc_txrx.ibs

  • 如果需要,可以在AMI-Tx和AMI-Rx选项卡上添加抖动。

  • 导出按钮在Target目录中生成模型。

更新AMI文件(如果需要)

SerDes工具箱生成的Tx和Rx AMI文件符合IBIS 6.1规范,因此所有反向通道特定参数都放在文件的Model_specific部分。

BCI_State_ST参数有5个状态,这5个状态是完整的反向通道训练所必需的,但是为了使这些模型更加用户友好,最终用户实际上只需要2个状态:“关闭”和“训练”。要进行此更改,请按如下方式更新每个AMI文件中的BCI_State_ST参数:

  • 更改(列表1 2 3 4 5)(列表1和2).

  • 更改(List_Tip“Off”“Training”“Converged”“Failed”“Error”)(List_Tip“关闭”“培训”).

  • 请注意,这不会影响模型的操作,只会影响用户可见的参数值。

测试生成的IBIS-AMI模型

DDR5发射机和接收机IBIS-AMI模型现已完成,可以在任何行业标准AMI模型模拟器中进行测试。

模型限制

在行业标准AMI模型模拟器中使用这些模型进行模拟时,请记住以下限制:

  • 这些模型将作为“匹配集”运行,或与使用SerDes工具箱生成的其他反向通道AMI模型一起运行。

  • 这些模型不适用于在SerDes工具箱之外生成的AMI模型。具体来说,任何使用IBIS标准BCI_*关键字的模型。

  • 不支持BCI_Protocol。这些模型已硬编码为名为“DDRx_Write”的协议。

  • 不支持BCI_ID。这些模型已硬编码为名为“BCI_comm”的BCI_ID,这意味着每个模拟必须在单独的目录中运行,以避免在模拟期间发生文件名冲突。

  • 要启用培训,必须在两种模型上启用反向通道培训。这是通过将BCI_State_ST参数设置为“Training”来完成的。

  • 这些模型必须以1024块大小运行才能正常运行。

  • 这些模型将在任何UI或“每位采样数”值下正常工作。

工具书类

[2] JEDEC网站,https://www.jedec.org/.

另请参见

||||

相关主题