主要内容

设计DDR5 IBIS-AMI模型来支持渠道的联系培训金宝app

这个例子显示了如何创建发射器和接收器AMI模型支持链接培训沟通(渠道)使用类似的方法作为一个宜必思7.0规范中定义的通过添加到图书馆块并行转换器工具金宝app箱™。这个例子使用一个DDR5写转让(SDRAM控制器)来演示设置。

介绍

宜必思7.0引入模型进行链接的能力训练,或自动协商,通过提供一种机制来Tx和Rx AMI可执行模型GetWave操作期间进行沟通。链接训练算法可以模拟硅在做什么,或它可以使用通道分析方法确定最优Tx和Rx均衡设置,然后锁定这些设置剩余的模拟。

Tx和Rx可执行的模型之间的通信消息Tx和Rx可执行模型的理解,和EDA工具不需要理解。这些约定的信息称为一个渠道的接口协议。宜必思规范并没有描述渠道的接口协议的细节,但只有一个方法来做沟通工作。在这个示例中,我们将生成一个名为DDRx_Write的新协议。

目前,并行转换器工具箱不支持IBIS-AMI保留参数直接渠道的接口。金宝app相反,它支持模型具体参数金宝app,“_ST”附加到他们的名字,执行类似的功能。由于这些模型具体参数不使用相同的名称作为保留参数宜必思规范,必须使用他们作为“匹配”或与其他渠道的模型开发的并行转换器的工具箱支持相同的协议。金宝app这些模型应该适用于任何行业标准AMI模型模拟器。

DDR5 Tx / Rx IBIS-AMI模型在并行转换器设计应用程序设置

这个例子的第一部分从DDR5控制器发射机模型DDR5控制器发射机/接收机IBIS-AMI模型和SDRAM接收机AMI模型DDR5 SDRAM发射机/接收机IBIS-AMI模型。直通块我们添加了一些额外的支持渠道的沟通和您将模型导出到仿真软件®进行进一步定制。金宝app金宝app

打开模型DDR5_Write_txrx_ami通过输入以下命令在MATLAB®命令窗口:

> >serdesDesigner (“DDR5_Write_txrx_ami”)

写事务,发射机(Tx)是一个DDR5控制器使用3-tap前馈均衡(FFE),而接收者(Rx)是使用一个可变增益放大器(VGA) 7预定义的设置和4-tap判决反馈均衡器(DFE)内置时钟数据恢复。支持这金宝app个配置并行转换器系统设置如下:

配置设置

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

  • 系统被设置为100年e-18

  • 信号被设置为单端

  • 每个符号样本调制保存在默认值,这是什么16NRZ分别(不归零)。

发射机模型设置

  • 直通块Tx_BCI一块用来支持这个渠道实现。金宝app这个块的操作将在稍后描述的例子。

  • Tx FFE块pre-tap,设置一个main-tap,一个post-tap包括三利用权重。这是用数组(0 0 1),其中主要利用数组中指定的最大价值。利用范围将被添加在当模型的例子是出口到仿真软件。金宝app

  • Tx AnalogOut模型是这样设置的电压1.1V,上升时间One hundred.ps,R(输出电阻)50 o号,C(电容)0.65pF。实际的模拟模型用于最终的模型将生成后在这个例子。

通道模型设置

  • 频道损失被设置为5dB,这是典型的DDR频道。

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

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

接收器模型设置

  • Rx AnalogIn模型是这样设置的R(输入电阻)40欧姆,C(电容)0.65 pf。实际的模拟模型用于最终的模型将生成后在这个例子。

  • 直通块Rx_BCI_Read一块用来支持这个渠道实现。金宝app这个块的操作将在稍后描述的例子。

  • 设置了一个VGA的块获得1,模式设置为上。添加特定的VGA预设后在这个例子中导出的模型仿真软件。金宝app

  • DFECDR块设置四DFE水龙头,包括四个首次利用权重设置为0。的最低限度的利用价值被设置为(-0.2 - -0.075 -0.06 - -0.045)V,最大的利用价值被设置为(0.05 - 0.075 0.06 - 0.045)诉DFE已经配置为使用2 x利用权重为了与电平DFE利用定义一致。

  • 直通块Rx_BCI_Write一块用来支持这个渠道实现。金宝app这个块的操作将在稍后描述的例子。

出口并行转换器系统仿真软件金宝app

点击出口按钮,导出配置模型进行进一步定制和代AMI模型的可执行文件。金宝app

DDR5 Tx / Rx IBIS-AMI模型在仿真软件设置金宝app

这部分的示例需要并行转换器系统导出的并行转换器设计师应用并定制所需DDR5幕后操作的仿真软件。金宝app

回顾仿真软件模金宝app型设置

并行转换器系统导入仿真软件的配置,刺激,Tx,模拟通道和Rx块。金宝app所有设置并行转换器设计应用程序转移到仿真软件模型。金宝app保存模型和检查每一块设置。

  • Tx子系统内部,双击FFE块打开FFE块参数对话框。扩大IBIS-AMI参数并取消选择模式参数,有效地将当前值硬编码模式在最后的AMI模型固定

  • 在Rx子系统,双击VGA块打开VGA块参数对话框。的模式获得设置从并行转换器的设计应用。

  • 在Rx子系统,双击DFECDR块打开DFECDR块参数对话框。的首次利用权重,最低DFE利用价值,最大的利用价值RMS设置从并行转换器的设计师应用。自适应增益自适应步长3 e-061 e-06分别基于DDR5 SDRAM的期望是合理的值。扩大IBIS-AMI参数和取消选择相抵消引用偏移量参数,有效地硬编码这些参数的当前值。

更新发射机(Tx) AMI参数

打开AMI -Tx选项卡中并行转换器IBIS-AMI管理器对话框。保留参数首先列出紧随其后的模型相关参数坚持典型的AMI的格式文件。

  • 设置预加重挖掘:编辑TapWeights 1并设置格式范围,Typ0,最小值-0.2,马克斯0.2

  • 设置主要利用:编辑TapWeights 0并设置格式范围,Typ1,最小值0.6,马克斯1

  • 设置post-emphasis挖掘:编辑TapWeights 1并设置格式范围,Typ0,最小值-0.2,马克斯0.2

创建新的Tx幕后AMI参数

支持渠金宝app道的操作,还需要额外的控制参数。在AMI -Tx选项卡中并行转换器IBIS-AMI管理器对话框中,突出显示Tx_BCI并添加以下6个新的参数:

  • FFE_Tapm1:此参数创建一个数据存储,用于通过固定资产前利用培训期间Tx块之间的值。单击添加参数…按钮。集参数名称FFE_Tapm1,当前值0,使用InOut,类型浮动,格式价值。设置描述为:Tx FFE水龙头1渠道的培训。保存更改并注意这Tx_BCI透传的自动创建数据存储块。

  • FFE_Tap0:此参数创建一个数据存储,用来传递企业主要利用培训期间Tx块之间的值。单击添加参数…按钮。集参数名称FFE_Tap0,当前值0,使用InOut,类型浮动,格式价值。设置描述为:Tx FFE利用0渠道的培训。保存更改。

  • FFE_Tap1:此参数创建一个数据存储,用来传递FFE邮报利用培训期间Tx块之间的值。单击添加参数…按钮。集参数名称FFE_Tap1,当前值0,使用InOut,类型浮动,格式价值。设置描述为:Tx FFE水龙头1渠道的培训。保存更改。

  • BCI_Protocol_ST:这个参数只能用于生成一个参数命名为“BCI_Protocol_ST”.ami申请部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_Protocol_ST,当前值DDRx_Write”,使用信息,类型字符串,格式价值。设置描述为:该模型支持DDRx写例金宝app子幕后协议。注意:这个模型目前不支持保留参数BCI_Protocol作为输入到模型中金宝app。保存更改。

  • BCI_ID_ST:这个参数只能用于生成一个参数命名为“BCI_ID_ST”.ami申请部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_ID_ST,当前值“bci_comm”,使用信息,类型字符串,格式价值。设置描述为:这个模型创建的文件名称从“bci_comm”渠道的沟通。注意:这个模型目前不支持AMI BCI_ID保留参数作为输入到模型中。金宝app保存更改。

  • BCI_State_ST:此参数创建一个数据存储,用于沟通渠道的培训的状态:1 =,2 =培训,3 =聚集,4 =失败,5 =错误。单击添加参数…按钮。集参数名称BCI_State_ST,使用InOut,类型整数,格式列表。设置描述为:回发通道训练状态。注意:这个模型目前不支持AMI BCI_State保留参数作为输入到模型金宝app中。设置默认的2,列表值(1 2 3 4 5),而List_Tip值(“关闭”“培训”“趋同”“失败”“错误”),然后设置当前值“培训”。保存更改。

更新接收机(Rx) AMI参数

AMI-Rx选项卡中并行转换器IBIS-AMI经理对话框,列出了保留参数首先其次是坚持一个典型的格式AMI模型相关参数文件。

  • 设置VGA获得:编辑获得。集描述为:Rx放大器增益。确保格式被设置为列表并设置默认为1。集列表值作为(1 0.5 0.631 0.794 1.259 1.585 - 2)List_Tip值作为[" 6 dB”“4 dB”“2 dB”“0分贝”“2 dB”“4 dB”“6 dB”),然后设置当前值0分贝。保存更改。

  • 设置第一个教育部利用重量:编辑TapWeights 1。确保格式被设置为范围并设置Typ=0,最小值=-0.2,马克斯=0.05。保存更改。

  • 设置第二个教育部利用重量:编辑TapWeights 2。确保格式被设置为范围并设置Typ=0,最小值=-0.075,马克斯=0.075。保存更改。

  • 设置第三DFE利用重量:编辑TapWeights 3。确保格式被设置为范围并设置Typ=0,最小值=-0.06,马克斯=0.06。保存更改。

  • 设置第四DFE利用重量:编辑TapWeights 4。确保格式被设置为范围并设置Typ=0,最小值=-0.045,马克斯=0.045。保存更改。

创建新的Rx幕后AMI参数

支持渠金宝app道的操作,还需要额外的控制参数。在AMI -处方选项卡中并行转换器IBIS-AMI管理器对话框中,突出显示Rx_BCI_Write并添加以下新的参数(注:Rx_BCI_Read不需要任何额外的参数):

  • sampleVoltage:此参数创建一个数据存储,将用于通过CDR样本电压Rx块在训练。单击添加参数…按钮。集参数名称sampleVoltage,当前值0,使用InOut,类型浮动,格式价值。设置描述为:样本电压对渠道的培训。保存更改并注意这Rx_BCI_Write透传的自动创建数据存储块。

  • BCI_Protocol_ST:这个参数只生成一个参数命名为“BCI_Protocol_ST”.ami文件中的部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_Protocol_ST,当前值DDRx_Write”,使用信息,类型字符串,格式价值。设置描述为:该模型支持DDRx写例金宝app子幕后协议。注意:这个模型目前不支持AMI BCI_Protocol保留参数作为输入金宝app到模型中。保存更改。

  • BCI_ID_ST:这个参数只生成一个参数命名为“BCI_ID_ST”.ami文件中的部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_ID_ST,当前值“bci_comm”,使用信息,类型字符串,格式价值。设置描述T:他的模型创建的文件名称从“bci_comm”渠道的沟通。注意:这个模型目前不支持保留参数BCI_ID作为输入到模型中金宝app。保存更改。

  • BCI_State_ST:此参数创建一个数据存储,用于沟通渠道的培训的状态:1 =,2 =培训,3 =聚集,4 =失败,5 =错误。单击添加参数…按钮。集参数名称BCI_State_ST,使用InOut,类型整数,格式列表。设置描述为:回发通道训练状态。注意:这个模型目前不支持AMI BCI_State保留参数作为输入到模型金宝app中。设置默认的2,列表值(1 2 3 4 5),而List_Tip值(“关闭”“培训”“趋同”“失败”“错误”),然后设置当前值“培训”。保存更改。

  • BCI_Message_Interval_UI_ST:这个参数只生成一个参数命名为“BCI_Message_Interval_UI”.ami文件中的部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_Message_Interval_UI_ST,当前值64年,使用信息,类型整数,格式价值。设置描述:这BCI模型需要1024样本/设备的正常运行。保存更改。

  • BCI_Training_UI_ST:这个参数只生成一个参数命名为“BCI_Training_U_STI”.ami文件中的部分合规IBIS-AMI规范。这个参数不是用这个模型。单击添加参数…按钮。集参数名称BCI_Training_UI_ST,当前值100000年,使用信息,类型整数,格式价值。设置描述为:BCI培训可能需要100000界面完成。注意:这个模型目前不支持AMI BCI_Training_UI保留参数作金宝app为输入到模型中。保存更改。

运行Init刷新

传播所有的新AMI参数,运行刷新Init Tx和Rx块。

  • 双击Tx块内的Init子系统和点击刷新Init按钮。

  • 双击Rx块内的Init子系统和点击刷新Init按钮。

运行模型

运行模型来模拟并行转换器系统,并验证当前设置编译和运行没有错误或警告。生成两个情节。第一个是生活时域(GetWave)眼图模型运行时更新。第二个情节包含四个视图的统计(Init)结果,像块中可用并行转换器设计应用程序从时域(GetWave) +两个视图的结果。

注意:您可以忽略无关的任何警告的街区。这些都是由于自动生成数据存储块,后面我们将对此进行讨论。

提供的文件

三套外部文件必须支持渠道的培训。金宝app这些文件的一代已经超出了这个例子的范围,因此他们都包含在这个例子。以下9个文件下载到模型目录(仿真软件的位置.slx文件)在运行完整的并行转换器系统之前或生成AMI模型可执行文件。金宝app

写信给渠道的沟通文件

这三个文件是用来写幕后训练参数的当前状态和眼睛的度量(s)到外部文件Tx和Rx AMI模型之间的沟通。

  • MATLAB函数文件:writeBCIfile.m

  • c++ codegen所需文件:writeamidata.cppwriteamidata.h

从渠道的沟通文件读取

这三个文件是用于读取当前状态的幕后训练参数和眼睛的度量(s)从外部文件Tx和Rx AMI模型之间的沟通。

  • MATLAB函数文件:readBCIfile.m

  • c++ codegen所需文件:readamidata.cppreadamidata.h

写信给渠道的日志文件

这三个文件是用来写幕后训练参数的当前状态和眼睛度量每一步训练后(s)为调试日志文件。

  • MATLAB函数文件:writeBCIhistory.m

  • c++ codegen所需文件:writebcihist.cppwritebcihist.h

修改Tx FFE启用外部控制的利用价值

控制的Tx FFE利用权重Tx_BCI块启用渠道的培训时,取代FFEParameter。TapWeights常数DataStoreRead块的块。这个数据存储允许企业利用值改变时,通过仿真和每个datapath公司的街区。

Tx子系统内,点击FFE块和类型Ctrl-U面具下的FFE块。

  1. 删除FFETapWeights常数。

  2. 添加一个DataStoreRead块标记BCIFFETapWeightsIn

  3. 双击DataStoreRead块和数据存储名称设置为:Tx_BCISignal

  4. 在元素选择选项卡上,扩大信号Tx_BCISignal和突出FFE_Tapm1, FFE_Tap0FFE_Tap1

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

  6. 保存更改。

添加一个Mux块和设置的数量输入3 -多路这三个参数为一个向量FFE块。

Mux块的输出连接到TapWeights输入固定资产。

最后FFE块应该类似于下面的:

类型ctrl - d来编译模型和检查错误。你可以忽略无关的任何警告的街区。这些都是由于自动生成数据存储块,后面我们将对此进行讨论

修改DFECDR输出样本电压

以确定一个给定的质量组均衡值渠道的培训期间,电压采样的CDR的中心将使用每个符号的眼睛。这个值是被DataStoreWrite块,这样一来,它的值是可用其他BCI控制块。

Rx子系统内,点击DFECDR块和类型Ctrl-U看面具下的Rx DFECDR块。

打开BusSelector对象

  1. 突出voltageSample从列表中元素的公共汽车。

  2. 打击选择> >将它移动到选定元素的列表。

  3. 保存更改。

添加一个DataStoreWrite块标记:CDR样本电压

  1. 双击DataStoreWrite块和数据存储名称设置为:Rx_BCI_WriteSignal在参数选项卡。

  2. 在元素赋值选项卡上,扩大信号Rx_BCI_WriteSignal和突出sampleVoltage

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

  4. 保存更改。

voltageSample BusSelector的输出连接到新的DataStoreWrite块的输入。

这部分DFECDR块应该类似于下面的:

类型ctrl - d来编译模型和检查错误。你可以忽略无关的任何警告的街区。这些都是由于自动生成数据存储块,后面我们将对此进行讨论

修改DFECDR覆盖模式启用训练时

在渠道的培训、固定资产和教育部模式需要被设置为“固定”。FFE模式被硬编码的“固定”。使用一个简单的MATLAB函数允许你设置DFE模式当培训未启用。

Rx子系统内,点击DFECDR块和类型Ctrl-U看面具下的Rx DFECDR块。

删除DFECDRMode块和DFECDR之间的联系。

添加一个新的MATLAB功能块并设置标签DFEModeSelect。这个功能块读取的值BCI_State_ST和教育部。模式和forces the DFE Mode to 1 (Fixed) when training is enabled or completed. Copy/Paste the following code into the DFEModeSelect MATLAB function block, replacing the default contents.

功能模式= DFEModeSelect (DFEModeIn BCI_State_In)如果BCI_State_In = = = DFEModeIn 1%培训模式;其他模式= 1;%力DFE模式为所有其他固定培训状态结束

添加一个DataStoreRead块标记Rx_BCI_Write_BCI_State_In的值,所以BCI_State_ST可以输入MATLAB函数块。

  1. 双击DataStoreRead块和数据存储名称设置为:Rx_BCI_WriteSignal

  2. 在元素选择选项卡上,扩大信号Rx_BCI_WriteSignal和突出BCI_State_ST

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

  4. 保存更改。

这些新的连接块如图所示。最后DFECDR块应该类似于下面的:

类型ctrl - d来编译模型和检查错误。你可以忽略无关的任何警告的街区。这些都是由于自动生成数据存储块,后面我们将对此进行讨论

设置Tx Init定制代码

Tx初始化函数用于设置的Tx AMI模型运行在GetWave分析渠道的培训。这创造了渠道的沟通和日志文件,设置各种参数和覆盖任何用户定义的固定资产利用价值。

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

初始化函数是一个自动生成的函数提供并行转换器系统的脉冲响应处理块(宜必思AMI-Init)。的% %开始:%结束:行表示可以输入自定义的用户代码的部分。数据在本节并不书写过度运行Init刷新时:

% %开始:自定义用户代码区域(“刷新Init”按钮被按下时保留)Tx_BCIBCI_State_ST = Tx_BCIParameter.BCI_State_ST;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1;%的用户添加AMI参数从并行转换器IBIS-AMI经理%结束:自定义用户代码区域(“刷新Init”按钮被按下时保留)

使用这个自定义用户代码区域初始化之前的参数,编写中的第一项“BCI_comm渠道的沟通文件。csv BCI_comm_log.csv“日志文件并创建渠道。添加自定义渠道的控制代码,向下滚动到自定义用户代码区域和复制/粘贴以下代码:

Tx_BCIBCI_State_ST = Tx_BCIParameter.BCI_State_ST;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1;%的用户添加AMI参数从并行转换器IBIS-AMI经理Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1;%用户添加AMI参数从并行转换器IBIS-AMI经理% %设置GetWave幕后操作如果Tx_BCIBCI_State_ST = = 2%培训使bciWrFile =“BCI_comm.csv”;= % % Tx / Rx渠道的沟通文件协议(“DDR5”0);% %空终止字符串保持流在c++中快乐状态=[‘培训’0];% %空终止字符串保持在c++序列流快乐= 1;% %初始化序列计数器EyeHeight = 0.0;% %初始化培训指标%发布Tx功能numFFEtaps = 3; FFEtaps = [0.0, 1.0, 0.0]; FFEInit.TapWeights = [0.0, 1.0, 0.0]; % Initialize Rx capabilities (actual values set by Rx) numDFEtaps = 1; DFEtaps = 0.0000; % Create new file for back-channel communication writeBCIfile(bciWrFile, 'w', Protocol, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, State, EyeHeight) % Create new BCI_ID_log.csv file (for back-channel history) logFileName = 'BCI_comm_log.csv'; writeBCIhistory(logFileName, 'Tx', 'Init', 0, Tx_BCIBCI_State_ST, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight) end

测试,新用户代码工作正常,保存并运行模型,然后验证新渠道的沟通(BCI_comm.csv)和日志(BCI_comm_log.csv)文件创建了模型中的目录和文件中的值匹配上面设置的值。

建立了Rx Init定制代码

Rx初始化函数用于设置的Rx AMI模型运行在GetWave分析渠道的培训。这个渠道的沟通文件中读取,然后更新文件的Rx配置信息(数量的DFE龙头和教育部利用值)。它还更新了日志文件。

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

初始化函数是一个自动生成的函数提供并行转换器系统的脉冲响应处理块(宜必思AMI-Init)。的% %开始:%结束:行表示可以输入自定义的用户代码的部分。数据在本节并不书写过度运行Init刷新时:

% %开始:自定义用户代码区域(“刷新Init”按钮被按下时保留)Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage;%的用户添加AMI参数从并行转换器IBIS-AMI经理Rx_BCI_WriteBCI_State_ST = Rx_BCI_WriteParameter.BCI_State_ST;%的用户添加AMI参数从并行转换器IBIS-AMI经理%结束:自定义用户代码区域(“刷新Init”按钮被按下时保留)

使用这个自定义用户代码区域从Tx,读取配置初始化所需的其他渠道参数Rx,写的下一个条目BCI_comm渠道的沟通文件”。csv”,添加渠道的日志文件”BCI_comm_log.csv”。添加自定义渠道的控制代码,向下滚动自定义用户代码区域和复制/粘贴以下代码:

Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage;%的用户添加AMI参数从并行转换器IBIS-AMI经理Rx_BCI_WriteBCI_State_ST = Rx_BCI_WriteParameter.BCI_State_ST;%用户添加AMI参数从并行转换器IBIS-AMI经理% %设置GetWave幕后操作如果Rx_BCI_WriteBCI_State_ST = = 2%培训使% %从渠道的沟通文件读取从Tx bciRdFile设置=“BCI_comm.csv”;[numFFEtaps协议,~,~,FFEtaps序列,状态,EyeHeight] = readBCIfile (bciRdFile);% %写Rx设置渠道的沟通文件。bciWrFile =“BCI_comm.csv”;序列= + 1序列;% %初始化序列计数器%发布Rx功能numDFEtaps = 4;DFEtaps = (0.0000, 0.0000, 0.0000, 0.0000);writeBCIfile (bciWrFile、“w”、协议、numDFEtaps numFFEtaps, DFEtaps, FFEtaps,序列,状态,EyeHeight) %写入日志文件logFileName =“BCI_comm_log.csv”; writeBCIhistory(logFileName, 'Rx', 'Init', 0, Rx_BCI_WriteBCI_State_ST, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight) % Force DFE Mode to Fixed when training is enabled. DFECDRInit.Mode = 1; end

测试,新用户代码工作正常,保存并运行模型,然后验证该渠道的沟通(BCI_comm.csv)和日志(BCI_comm_log.csv)创建了文件,文件中的值匹配上面设定的值。BCI_comm_log。csv文件你应该先看到RX调用添加到日志文件(序列# 2)。

设置Tx Tx_BCI直通块

Tx_BCI块是用来控制整个渠道的培训过程。第一次通过它初始化所有的Tx和Rx参数优化在训练。后每一个渠道的培训周期这一块会读取当前眼Rx提供的指标,存储这个值,然后更新Tx和Rx参数传递。当完成培训这一块将信号完成培训,设置所有Tx和Rx参数最佳值,然后返回模型常规操作。

第一步是设置Tx_BCI块为渠道的操作。MATLAB控制的操作功能块Tx_BCI块写在这个例子。

看着面具下的Tx_BCI块。您应该看到8自动生成数据存储读/写模块。

删除直通系统对象,因为它没有使用。一定要连接尺寸输出港。

添加一个Mux块的数量和设置输入3。这将是用于多路三tapWeightsIn DataStoreRead信号到一个向量。

添加一个多路分配器块和输出的数量设置为3。这将是用于tapWeightsOut矢量信号分离成三个独立的DataStoreWrite信号。

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

函数[sampCount uiCount] =计数器(SymbolTime SampleInterval) %计算样本每一点sampBit =圆(SymbolTime / SampleInterval);%建立持久持久变量x y如果isempty (x) x = int32 (1);y = int32 (1);其他x = x + 1;结束% UI如果国防部开始计数(x, sampBit) = = 0 = y + 1;结束%输出结果sampCount = x;uiCount = y;

这个函数的值的两个输入,SymbolTimeSampleInterval,是继承了从模型空间,因此不需要显示为节点的MATLAB函数块。把这些节点从MATLAB功能块:

  1. 保存MATLAB函数。

  2. 在MATLAB函数签名突出参数SymbolTime

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

  4. 改变的数据范围信号参数

  5. 重复这个过程SampleInterval

  6. 当您保存MATLAB函数应该会看到这两个输入参数了仿真软件的功能块画布。金宝app

这个函数的输出数据类型,sampCountuiCount默认情况下,将继承。因为这个功能块是创建这两个参数的值需要显式定义的数据类型而不是基于启发式的决定。显式地定义为这两个参数的数据类型:

  1. 模型浏览器打开仿真金宝app软件并导航到Tx - > Tx_BCI - >计数器。

  2. 突出显示的参数sampCount

  3. 更新的类型继承int32并点击应用

  4. 重复这个过程uiCount

添加另一个新MATLAB函数块并设置标签txBackChannel。这个MATLAB函数块用于控制渠道的培训过程。这个函数的内容将在后面介绍这个例子。然而,完成Tx_BCI块连接必须显示所有正确的节点。启用:

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

  2. 删除所有的默认内容。

  3. 插入以下函数签名:

函数[tapWeightsOut BCIStateOut] = txBCtraining (tapWeightsIn、BCIStateIn sampleCounter, uiCounter, SymbolTime, SampleInterval)

这个函数的值的两个输入,SymbolTimeSampleInterval,是继承了从模型空间,因此不需要显示为节点的MATLAB函数块。把这些节点从MATLAB功能块:

  1. 保存MATLAB函数。

  2. 在MATLAB函数签名突出参数SymbolTime

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

  4. 改变的数据范围信号参数

  5. 重复这个过程SampleInterval

  6. 当您保存MATLAB函数应该会看到这两个输入参数了仿真软件的功能块画布。金宝app

连接在一起,如下所示:

建立了Rx Rx_BCI_Read块

Rx_BCI_Read块是用于读取Rx Tx_BCI块请求参数值,为下一个渠道的培训周期设置这些值。如果Tx_BCI块信号训练完成,这块集最后的值被用于仿真的其余部分。

第一步是设置Rx_BCI_Read块为渠道的操作。MATLAB控制操作的功能块Rx_BCI_Read块的写在后面的例子。

看着面具下的Rx_BCI_Read块。

删除直通系统对象,因为它不会被使用。一定要连接尺寸输出港。

添加一个DataStoreRead块标记DFECDRTapWeightsIn

  1. 双击DataStoreRead块和数据存储名称设置为:DFECDRSignal

  2. 在元素选择选项卡上,扩大信号DFECDRSignal和突出TapWeights [1,4]

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

  4. 保存更改。

添加一个DataStoreRead块标记RxBCIStateIn

  1. 双击DataStoreRead块和数据存储名称设置为:Rx_BCI_WriteSignal

  2. 在元素选择选项卡上,扩大信号Rx_BCI_WriteSignal和突出BCI_State_ST

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

  4. 保存更改。

添加一个DataStoreWrite块标记RxBCIStateOut

  1. 双击DataStoreWrite块和数据存储名称设置为:Rx_BCI_WriteSignal

  2. 在元素赋值选项卡上,扩大信号Rx_BCI_WriteSignal和突出BCI_State_ST

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

  4. 保存更改。

添加一个DataStoreWrite块标记DFECDRTapWeightsOut

  1. 双击DataStoreWrite块和数据存储名称设置为:DFECDRSignal

  2. 在元素赋值选项卡上,扩大信号DFECDRSignal和突出TapWeights [1,4]

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

  4. 保存更改。

复制计数器MATLAB函数块从Tx Tx_BCI块到这一块。

添加一个新的MATLAB函数块并设置标签rxBackChannelRead。这个MATLAB函数块用于控制渠道的培训过程。这个函数的内容将在后面介绍这个例子。然而,完成Rx_BCI_Read块连接必须显示所有正确的节点。启用:

  1. 双击rxBackChannelRead MATLAB函数块在MATLAB中打开编辑器。

  2. 删除所有的默认内容。

  3. 插入以下函数签名:

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

这个函数的值的两个输入,SymbolTimeSampleInterval,是继承了从模型空间,因此不需要显示为节点的MATLAB函数块。把这些节点从MATLAB功能块:

  1. 保存MATLAB函数。

  2. 在MATLAB函数签名突出参数SymbolTime

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

  4. 改变的数据范围信号参数

  5. 重复这个过程SampleInterval

  6. 当您保存MATLAB函数应该会看到这两个输入参数了仿真软件的功能块画布。金宝app

连接在一起,如下所示:

建立了Rx Rx_BCI_Write块

Rx_BCI_Write块用于每个渠道的培训周期来计算当前眼这些度量指标和报告回Tx_BCI块进行分析。

第一步是设置Rx_BCI_Write块为渠道的操作。MATLAB控制操作的功能块Rx_BCI_Write块的写在后面的例子。

看着面具下的Rx_BCI_Write块。你应该4自动生成数据存储读/写模块。

删除直通系统对象,因为它没有使用。一定要连接尺寸输出港。

删除DataStoreWrite块标记sampleVoltage写。它不会被使用。

添加一个DataStoreRead块标记DFECDRTapWeightsIn

  1. 双击DataStoreRead块并设置数据存储名称DFECDRSignal

  2. 在元素选择选项卡上,扩大信号DFECDRSignal和突出TapWeights(1、4)

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

  4. 保存更改。

复制计数器MATLAB函数块从Tx Tx_BCI块到这一块。

添加一个新的MATLAB函数块并设置标签rxBackChannelWrite。这个MATLAB函数块用于控制渠道的培训过程。这个函数的内容将在后面介绍这个例子。然而,完成Rx_BCI_Write块连接必须显示所有正确的节点。启用:

  1. 双击rxBackChannelWrite MATLAB函数块在MATLAB中打开编辑器。

  2. 删除所有的默认内容。

  3. 插入以下函数签名:

函数BCIStateOut = rxBCtrainingWrite (sampleV、tapWeightsIn BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

这个函数的值的两个输入,SymbolTimeSampleInterval,是继承了从模型空间,因此不需要显示为节点的MATLAB函数块。把这些节点从MATLAB功能块:

  1. 保存MATLAB函数。

  2. 在MATLAB函数签名突出参数SymbolTime

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

  4. 改变的数据范围信号参数

  5. 重复这个过程SampleInterval

  6. 当您保存MATLAB函数应该会看到这两个输入参数了仿真软件的功能块画布。金宝app

连接在一起,如下所示:

编辑txBCtraining MATLAB功能块

Tx_BCI块是用来控制整个渠道的培训过程。第一次通过它初始化所有的Tx和Rx参数优化在训练。每个渠道的培训周期后,该块读取当前眼指标提供的处方,存储这个值,然后更新Tx和Rx参数传递。当训练是完成这个块信号完成培训,集所有Tx和Rx参数的最优值,然后返回模型常规操作。

Tx_BCI块早些时候为渠道的操作设置在这个例子。现在您将创建MATLAB功能块的核心Tx_BCI块。这个MATLAB函数块,这是标记txBackChannel,控制整个渠道的培训过程。这一过程所涉及的步骤如下:

  1. 定义的函数签名

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

  3. 定义的参数被及其范围

  4. 在第一GetWave电话,设置初始参数值开始Tx和Rx

  5. 每个渠道的培训周期读眼睛指标计算Rx和决定下一步要做什么。培训完成完成信号时,输出最优Tx和Rx参数值在使用模拟和写这些最终值到日志文件。

  6. 设置适当的培训状态和输出FFE参数

以下部分介绍txBackChannel MATLAB函数中使用的代码块。Tx块,点击Tx_BCI直通块和类型Ctrl-U推到Tx_BCI直通块设置。双击txBackChannelMATLAB功能块,然后复制/粘贴代码在以下小节中描述。

定义的函数签名

的函数签名txBCtraining块6输入和两个输出。输入:

  • tapWeightsIn:企业利用权重数组定义FFE面具。

  • BCIStateIn:渠道从TxBCIStateIn数据存储状态的价值。

  • sampleCounter:样本总数计数。

  • uiCounter:统计总数的UI。

  • SymbolTime:UI(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,前面数据范围设置为“参数”。

  • SampleInterval:仿真步长(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,前面数据范围设置为“参数”。

有两个输出:

  • tapWeightsOut:固定资产利用权重数组输出BCIFFETapWeightsOut数据存储。

  • BCIStateOut:渠道的状态值输出到TxBCIStateOut数据存储。

添加函数签名是早些时候当最初创建MATLAB功能块已经存在。

初始化参数和变量

本节设置所需的三个常数计算渠道的培训周期的大小:

  • sampBit在每个UI:样本的数量。

  • messageInterval:每个渠道的长度(UI)训练周期。目前这个值设置为~ 2 PRBS7迭代。

  • BCIwait:延迟时间(UI)开始前联络渠道的培训。目前这个值设置为~ 4 PRBS7迭代。

除了常量值,本节设置11持久变量使用这个函数。持久变量每次调用MATLAB函数之间保持它们的值。11持久的变量:

  • 协议这种渠道模式:所使用的协议。

  • numDFEtaps:教育部水龙头的数量被包含在这个渠道的训练算法。

  • numFFEtaps:企业龙头被包含在本渠道的训练算法。

  • DFEtaps:当前教育部利用价值。

  • FFEtaps:当前固定资产利用价值。

  • 序列:一个整数计数器用于记录序列的培训活动。

  • 状态:当前渠道的培训状态。

  • EyeHeight:当前眼睛高度(伏特)被Rx报道。

  • 一步:当前运行训练序列的一步。

  • indx:索引变量控制循环。

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

初始化这些参数和变量,复制/粘贴以下代码到txBackChannel MATLAB功能块:

% %设置sampBit =圆(SymbolTime / SampleInterval);% %计算样本每一点messageInterval = 256;% % (UI)渠道的培训周期的迭代长度(~ 2 PRBS7迭代)BCIwait = 512;% %延迟时间(UI)开始前培训(~ 4 PRBS7迭代)% % %读取BCI文件来确定培训的值提供变量之间的时间步长持久协议numDFEtaps numFFEtaps DFEtaps FFEtaps序列状态EyeHeight一步indx指标%初始化变量初始条件如果isempty(协议)协议=“违约”;如果isempty (numDFEtaps) numDFEtaps = 4;如果isempty (numFFEtaps) numFFEtaps = 3;如果isempty (DFEtaps) DFEtaps = (0.000, 0.000, 0.000, 0.000);如果isempty (FFEtaps) FFEtaps = (0.000, 1.000, 0.000);如果isempty(序列)序列= 1;如果isempty(状态)状态=“测试”; end if isempty(EyeHeight) EyeHeight = 0.000; end if isempty(step) step = 1; end if isempty(indx) indx = 1; end if isempty(metric) metric = zeros(50,1); end

定义了参数

训练算法实现在这个例子中扫描前后企业利用价值和教育部的所有4单独水龙头,然后选择最优值为每一个水龙头。八个参数用于定义范围为每个水龙头和培训期间使用的步长:

  • ffeTapStep:步长席卷FFE水龙头时使用。这个值是负的自FFE水龙头总是值< = 0。

  • dfeTapStep:步长席卷DFE水龙头时使用。

  • regFFEtapm1:最小/最大范围的值在席卷FFE pre-tap时使用。

  • regFFEtap1:最小/最大范围的值在席卷FFE post-tap时使用。

  • regDFEtap1:最小/最大范围的值时使用全面第一DFE水龙头。

  • regDFEtap2:最小/最大范围的值时使用第二DFE丝锥。

  • regDFEtap3:最小/最大范围的值时使用席卷第三DFE水龙头。

  • regDFEtap4:最小/最大范围的值时使用席卷第四DFE水龙头。

定义所有的参数被训练期间,复制/粘贴以下代码到txBackChannel 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调用,复制/粘贴以下代码到txBackChannel MATLAB功能块:

% %第一Tx GetWave调用(如果sampleCounter序列= 3)= = 1 & & BCIStateIn = = 2%培训使%渠道的沟通文件读取当前设置bciRdFile =“BCI_comm.csv”;[~,numDFEtaps numFFEtaps, ~, ~,序列,~,EyeHeight] = readBCIfile (bciRdFile);%首先决定如何做% Tx Params FFEtaps = (0.000, 1.000, 0.000);% Rx Params DFEtaps = (0.0000, 0.0000, 0.0000, 0.0000);%写联络渠道的沟通文件,首先通过设置Rx bciWrFile =“BCI_comm.csv”;协议= [' DDR5 ' 0];% %空终止字符串保持流在c++中快乐状态=[‘培训’0];% %空终止字符串保持在c++序列流快乐=序列+ 1;writeBCIfile (bciWrFile ' w '、协议元素个数(DFEtaps),元素个数(FFEtaps) DFEtaps, FFEtaps,序列,状态,EyeHeight) %写入日志文件logFileName =“BCI_comm_log.csv”;writeBCIhistory (logFileName Tx, GetW, sampleCounter, BCIStateIn,元素个数(DFEtaps),元素个数(FFEtaps) DFEtaps, FFEtaps,序列,EyeHeight)结束

渠道的训练算法

启用训练时,在等待的UI定义的常数BCIwait渠道的训练算法,称为每个训练块定义的messageInterval常数。首先报告度量当前Rx是阅读,那么这些日志文件写入到渠道的沟通结果。训练算法采用以下步骤:

  1. 扫描所有值FFE pre-tap并确定该值的结果最大的人大开眼界。

  2. 扫描所有值FFE post-tap并确定该值的结果最大的人大开眼界。

  3. 扫描所有值价值挖掘1,确定哪些价值最大的人大开眼界。

  4. 扫描所有值价值挖掘2,确定哪些价值最大的人大开眼界。

  5. 扫描所有值价值挖掘3,确定哪些价值最大的人大开眼界。

  6. 扫描所有值价值挖掘4,确定哪些价值最大的人大开眼界。

  7. 当完成训练,状态更改为“趋同”和写最后值私下交流日志文件。

实现渠道的训练算法,复制/粘贴以下代码到txBackChannel MATLAB功能块:

% %每个后续BCI块(序列= 5,7,9,11…)如果uiCounter > BCIwait + 2 & &国防部(sampleCounter - 1 (messageInterval * sampBit)) = = 0 & & BCIStateIn = = 2%培训使%阅读设置用于从渠道的沟通文件前16 GetWaveblocks bciRdFile =“BCI_comm.csv”;[~,~,~,~,~,序列,~,EyeHeight] = readBCIfile (bciRdFile);% =当前结果写入日志文件序列序列+ 1;logFileName =“BCI_comm_log.csv”;writeBCIhistory (logFileName Tx, GetW, sampleCounter, BCIStateIn,元素个数(DFEtaps),元素个数(FFEtaps) DFEtaps, FFEtaps,序列,EyeHeight)如果indx ~ = 1%存储当前度量指标(indx - 1) = EyeHeight;转换步骤结束%决定下一步要做什么情况下1%步骤1:确定最佳值固定资产利用1状态=[‘培训’0];% %空终止字符串保持流在c++中快乐如果indx < =下一个迭代的长度(regFFEtapm1) %设置值FFEtaps (1) = regFFEtapm1 (indx);FFEtaps (3) = 0.0;FFEtaps (2) = 1 - abs (FFEtaps (1)), abs (FFEtaps (3));indx = indx + 1; elseif indx == length(regFFEtapm1) + 1 % Set best metric [~, jj] = max(metric); FFEtaps(1) = regFFEtapm1(jj); FFEtaps(3) = 0.0; FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3)); % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 2 % Step 2: Determine best value for FFE tap 1 State = ['Training' 0]; if indx <= length(regFFEtap1) % Set values for next iteration %FFEtaps(1) = 0.0; %% Use value from step 1 FFEtaps(3) = regFFEtap1(indx); FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3)); indx = indx + 1; elseif indx == length(regFFEtap1) + 1 % Set best metric [~, jj] = max(metric); FFEtaps(3) = regFFEtap1(jj); FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3)); % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 3 % Step 3: Determine best value for DFE tap 1 State = ['Training' 0]; if indx <= length(regDFEtap1) % Set values for next iteration DFEtaps = [regDFEtap1(indx), 0.0000, 0.0000, 0.0000]; indx = indx + 1; elseif indx == length(regDFEtap1) + 1 % Set best metric [~, jj] = max(metric); DFEtaps = [regDFEtap1(jj), 0.0000, 0.0000, 0.0000]; % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 4 % Step 4: Determine best value for DFE tap 2 State = ['Training' 0]; if indx <= length(regDFEtap2) % Set values for next iteration DFEtaps(2:4) = [regDFEtap2(indx), 0.0000, 0.0000]; indx = indx + 1; elseif indx == length(regDFEtap2) + 1 % Set best metric [~, jj] = max(metric); DFEtaps(2:4) = [regDFEtap2(jj), 0.0000, 0.0000]; % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 5 % Step 5: Determine best value for DFE tap 3 State = ['Training' 0]; if indx <= length(regDFEtap3) % Set values for next iteration DFEtaps(3:4) = [regDFEtap3(indx), 0.0000]; indx = indx + 1; elseif indx == length(regDFEtap3) + 1 % Set best metric [~, jj] = max(metric); DFEtaps(3:4) = [regDFEtap3(jj), 0.0000]; % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 6 % Step 6: Determine best value for DFE tap 4 State = ['Training' 0]; if indx <= length(regDFEtap4) % Set values for next iteration DFEtaps(4) = regDFEtap4(indx); indx = indx + 1; elseif indx == length(regDFEtap4) + 1 % Set best metric [~, jj] = max(metric); DFEtaps(4) = regDFEtap4(jj); % Done. Set up for next step metric = zeros(50,1); step = step + 1; indx = 1; end case 7 % Step 7: Training is complete State = ['Converged' 0]; % Write final entry in log file logFileName = 'BCI_comm_log.csv'; Sequence = Sequence + 1; writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, 3, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight) otherwise State = ['Error' 0]; end % Write to back-channel communication file with next pass settings for Rx bciWrFile = 'BCI_comm.csv'; Protocol = ['DDR5' 0]; %% Null terminate string to keep fprintf happy in C++ writeBCIfile(bciWrFile, 'w', Protocol, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, State, EyeHeight) end

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

需要做的最后一件事,通过MATLAB函数是更新的状态BCI_State_ST数据存储和更新固定资产利用数组值。

设置培训状态和输出值,复制/粘贴以下代码到txBackChannel MATLAB功能块:

% %设置渠道的国家如果strcmpi(状态,“关闭”)| | strcmpi(状态,[‘Off’0]) BCIStateOut = 1;elseif strcmpi(状态,“培训”)| | strcmpi(状态,[‘培训’0])BCIStateOut = 2;elseif strcmpi(状态,“聚合”)| | strcmpi(状态,[“聚合”0])BCIStateOut = 3;elseif strcmpi(状态,“失败”)| | strcmpi(状态,['失败' 0])BCIStateOut = 4;%的其他错误BCIStateOut = 5;基于培训结束% %设置输出FFE值如果BCIStateOut = = 2 | | BCIStateOut培训启用/聚合tapWeightsOut = = = 3% FFEtaps (:);%的其他培训/失败/错误tapWeightsOut = tapWeightsIn;结束

保存并关闭这个MATLAB函数块。

编辑rxBCtrainingRead MATLAB功能块

Rx_BCI_Read块是用于读取所请求的Rx参数值Tx_BCI块和下一个渠道的培训周期设置它们。如果Tx_BCI块信号,培训完成后,这个街区集使用的最终值Rx剩余的模拟。

Rx_BCI_Read块早些时候为渠道的操作设置在这个例子。现在创建MATLAB功能块的中心Rx_BCI_Read块。这个MATLAB函数块,这是标记rxBCtrainingRead要使用,集Rx DFE值。这一过程所涉及的步骤如下:

  1. 定义的函数签名。

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

  3. 第一GetWave调用,每个渠道的培训周期的开始,读取Rx DFE丝锥的值作为Tx指定的联络渠道的训练算法。

  4. 设置适当的培训状态和输出DFE参数使用。

以下部分介绍rxBCtrainingRead MATLAB函数中使用的代码块。在Rx块,点击Rx_BCI_Read直通块和类型Ctrl-U推到Rx_BCI_Read直通块设置。双击rxBCtrainingRead MATLAB功能块,然后复制/粘贴代码在以下小节中描述。

定义的函数签名

的函数签名rxBCtrainingRead块6输入和两个输出。输入:

  • tapWeightsIn:DFE利用权重数组中定义的DFECDRTapWeightsIn数据存储。

  • BCIStateIn:渠道从RxBCIStateIn数据存储状态的价值。

  • sampleCounter:样本总数计数。

  • uiCounter:统计总数的UI。

  • SymbolTime:UI(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,数据范围设置为“参数”。

  • SampleInterval:仿真步长(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,数据范围设置为“参数”。

有两个输出:

  • tapWeightsOut:DFECDRTapWeightsOut DFE利用权重数组输出数据存储。

  • BCIStateOut:渠道的状态值输出到RxBCIStateOut数据存储。

函数签名早些时候进入当最初创建MATLAB功能块已经存在。

初始化参数和变量

本节设置所需的三个常数计算渠道的培训周期的大小:

  • sampBit在每个UI:样本的数量。

  • messageInterval:每个渠道的长度(UI)训练周期。目前这个值设置为~ 2 PRBS7迭代。

  • BCIwait:延迟时间(UI)开始前联络渠道的培训。目前这个值设置为~ 4 PRBS7迭代。

除了常量值,本节设置7持久变量使用这个函数。持久变量每次调用MATLAB函数之间保持它们的值。7持久的变量:

  • 协议这种渠道模式:所使用的协议。

  • numDFEtaps:教育部水龙头的数量被包含在这个渠道的训练算法。

  • numFFEtaps:企业龙头被包含在本渠道的训练算法。

  • DFEtaps:当前教育部利用价值。

  • FFEtaps:当前固定资产利用价值。

  • 序列:一个整数计数器用于记录序列的培训活动。

  • 状态:当前渠道的培训状态。

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

% %设置sampBit =圆(SymbolTime / SampleInterval);% %计算样本每一点messageInterval = 256;% % (UI)渠道的培训周期的迭代长度(~ 2 PRBS7迭代)BCIwait = 512;% %延迟时间(UI)开始前培训(~ 4 PRBS7迭代)%变量可用时间步骤之间持久协议numDFEtaps numFFEtaps DFEtaps FFEtaps序列状态;%初始化变量初始条件如果isempty(协议)协议=“违约”;如果isempty (numDFEtaps) numDFEtaps = 4;如果isempty (numFFEtaps) numFFEtaps = 3;如果isempty (DFEtaps) DFEtaps = tapWeightsIn;如果isempty (FFEtaps) FFEtaps = (0, 0, 0);如果isempty(序列)序列= 1; end if isempty(State) if BCIStateIn == 1 % Off State = ['Off' 0]; elseif BCIStateIn == 2 % Training State = ['Training' 0]; elseif BCIStateIn == 3 % Converged State = ['Converged' 0]; elseif BCIStateIn == 4 % Failed State = ['Failed' 0]; else % Error State = ['Error' 0]; end end

用于读取教育部丝锥的值

启用训练时,在第一次调用MATLAB函数和每一个初培训作为定义的块messageInterval常数,渠道的沟通文件读取确定更新DFE利用值用于下一个训练周期。

DFE水龙头设置值,使用复制/粘贴以下代码到rxBCtrainingRead MATLAB功能块:

% %第一GetWave块每个BCI块(序列= 3,5,7,9,11日…)%阅读渠道的沟通文件得到当前设置(sampleCounter = = 1 & & BCIStateIn = = 2) | | ((uiCounter > BCIwait + 2 & &国防部(sampleCounter - 1 (messageInterval * sampBit)) = = 0) & & BCIStateIn = = 2) %培训使bciRdFile =“BCI_comm.csv”;(协议、numDFEtaps numFFEtaps DFEtaps (1:4), FFEtaps,序列,状态,~]= readBCIfile (bciRdFile);结束

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

需要做的最后一件事,通过MATLAB函数块更新的状态BCI_State_ST数据存储和更新DFE利用数组值。

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

% %设置渠道的国家如果strcmpi(状态,“关闭”)| | strcmpi(状态,[‘Off’0]) BCIStateOut = 1;elseif strcmpi(状态,“培训”)| | strcmpi(状态,[‘培训’0])BCIStateOut = 2;elseif strcmpi(状态,“聚合”)| | strcmpi(状态,[“聚合”0])BCIStateOut = 3;elseif strcmpi(状态,“失败”)| | strcmpi(状态,['失败' 0])BCIStateOut = 4;%的其他错误BCIStateOut = 5;结束% %设置输出DFE值基于培训如果BCIStateOut = = 2%启用tapWeightsOut = DFEtaps (1:4);其他tapWeightsOut = tapWeightsIn;结束

保存并关闭这个MATLAB函数块。

编辑rxBCtrainingWrite MATLAB功能块

Rx_BCI_Write块用于每个渠道的培训周期来计算当前眼这些度量指标和报告回Tx_BCI块进行分析。

Rx_BCI_Write块早些时候为渠道的操作设置在这个例子。现在,MATLAB功能块的中心Rx_BCI_Write块将被创建。这个MATLAB功能块,我们标记rxBCtrainingWrite眼睛,将计算的最小高度的最后127位和写这些值私下沟通文件和日志文件。这一过程所涉及的步骤如下:

  1. 定义的函数签名。

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

  3. 存储一个电压矢量在计算最低使用眼睛的高度。

  4. 在每个渠道的培训周期计算的最小眼睛高度和渠道的沟通文件。

  5. 更新培训状态。

以下部分将穿过rxBCtrainingWrite MATLAB函数中使用的代码块。在Rx块,点击Rx_BCI_Write直通块和类型Ctrl-U推到Rx_BCI_Write直通块设置。双击rxBCtrainingWrite MATLAB功能块,然后复制/粘贴代码在以下小节中描述。

定义的函数签名

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

  • sampleV:在CDR样本时的电压。

  • tapWeightsIn:DFE利用权重数组中定义的DFECDRTapWeightsIn数据存储。

  • BCIStateIn:渠道从RxBCIStateIn数据存储状态的价值。

  • sampleCounter:样本总数计数。

  • uiCounter:统计总数的UI。

  • SymbolTime:UI(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,数据范围设置为“参数”。

  • SampleInterval:仿真步长(以秒为单位)。这个值是继承了从模型空间,因此不需要显示为一个节点在MATLAB功能块。删除该节点从MATLAB函数块,数据范围设置为“参数”。

有一个输出:

  • BCIStateOut:渠道的状态值输出到RxBCIStateOut数据存储。

函数签名早些时候进入当最初创建MATLAB功能块已经存在。

初始化参数和变量

本节设置所需的四个常数计算渠道的培训周期的大小:

  • sampBit在每个UI:样本的数量。

  • messageInterval:每个渠道的长度(UI)训练周期。目前这个值设置为~ 2 PRBS7迭代。

  • BCIwait:延迟时间(UI)开始前联络渠道的培训。目前这个值设置为~ 4 PRBS7迭代。

  • windowLength:窗口的长度(UI)用于计算最低高度。目前这个值设置为1 PRBS7迭代。

除了常量值,本节设置5持久变量使用这个函数。持久变量每次调用MATLAB函数之间保持它们的值。5持久的变量:

  • 协议这种渠道模式:所使用的协议。

  • 序列:一个整数计数器用于记录序列的培训活动。

  • 状态:当前渠道的培训状态。

  • EyeHeight:计算内在眼睛高度值(伏)。

  • vSamp:样本电压被报道的CDR块。

初始化所有参数和变量的块,复制/粘贴以下代码到rxBCtrainingWrite MATLAB功能块:

% %设置sampBit =圆(SymbolTime / SampleInterval);% %计算样本每一点messageInterval = 256;% % (UI)渠道的培训周期的迭代长度(~ 2 PRBS7迭代)BCIwait = 512;% %延迟时间(UI)开始前培训(~ 4 PRBS7迭代)windowLength = 127;% %的窗口长度(UI)用于计算最小眼睛高度(1 PRBS7迭代)%之间提供变量时间步长持续性协议序列状态EyeHeight vSamp isempty(国家)如果BCIStateIn = = 1%状态= [‘Off’0];elseif BCIStateIn = = 2%的训练状态=[‘培训’0];elseif BCIStateIn聚合状态= = = 3%(“聚合”0);elseif BCIStateIn = = 4%失败的国家=['失败' 0];%的其他错误状态=['错误' 0];结束结束

存储报告的电压矢量

这部分积累滚动向量最小电压使用的眼睛高度计算。假设这些电压0 v周围是对称的,所以使用绝对值。

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

%积累滚动向量的最小电压眼睛高度计算如果isempty (vSamp) vSamp = 0 (1, windowLength * sampBit);结束vSamp = circshift (vSamp, 1);vSamp (1) = abs (sampleV);%认为对称和只使用积极的价值观

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

启用训练时,在等待的UI定义的常数BCIwait渠道的指标计算每个训练迭代结束时定义的messageInterval常数。首先从渠道的沟通渠道的配置读取文件,然后内心的眼睛高度值计算结果输出渠道的沟通文件和日志文件。

计算眼睛指标和写作沟通文件每个渠道的周期,复制/粘贴以下代码到rxBCtrainingWrite MATLAB功能块:

% %写当前状态和眼睛度量每个BCI块如果年底uiCounter > BCIwait + 2 & &国防部(sampleCounter (messageInterval * sampBit)) = = 0 & & BCIStateIn = = 2%培训启用(序列= 4,6,8,10,12,…)%阅读设置用于从渠道的沟通文件最后16 GetWaveblocks bciRdFile =“BCI_comm.csv”;(协议,~,~,~,FFEtaps序列,状态,~]= readBCIfile (bciRdFile);从采样电压%计算内在眼睛高度:EyeHeight = min (vSamp) * 2;自使用绝对值% 2 x。%编写新的渠道的沟通文件结束BCI-Block指标bciWrFile =“BCI_comm.csv”;序列= + 1序列;writeBCIfile (bciWrFile ' w '、协议元素个数(tapWeightsIn),元素个数(FFEtaps) tapWeightsIn, FFEtaps,序列,状态,EyeHeight) % %写入日志文件:logFileName =“BCI_comm_log.csv”;writeBCIhistory (logFileName“处方”,“GetW”, sampleCounter, BCIStateIn,元素个数(tapWeightsIn),元素个数(FFEtaps) tapWeightsIn, FFEtaps,序列,EyeHeight)结束

设置培训状态

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

设置训练状态,复制/粘贴以下代码到rxBCtrainingRead MATLAB功能块:

% %更新状态如果状态改变如果BCIStateIn = = 3%的聚合状态=(“聚合”0);elseif BCIStateIn = = 4%失败的国家=['失败' 0];如果strcmpi(状态,“关闭”)| | strcmpi(状态,[‘Off’0]) BCIStateOut = 1;elseif strcmpi(状态,“培训”)| | strcmpi(状态,[‘培训’0])BCIStateOut = 2;elseif strcmpi(状态,“聚合”)| | strcmpi(状态,[“聚合”0])BCIStateOut = 3;elseif strcmpi(状态,“失败”)| | strcmpi(状态,['失败' 0])BCIStateOut = 4;%的其他错误BCIStateOut = 5;结束

保存并关闭这个MATLAB函数块。

在仿真金宝app软件中,输入ctrl - d来编译模型和检查错误。解决任何错误在继续之前。

运行模型和验证结果

下一步是运行模型,并验证之前的代码是正确的操作。

设置仿真参数

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

  • 伪随机位序列7所以,PRBS7模式模拟中使用。

  • 设置数量的符号50000年允许多方渠道的训练算法的时间来完成。

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

运行模型。在模型运行时,观察时域波形改变每个水龙头设置是横扫。当模拟完成渠道的沟通文件,BCI_comm。csv,类似于:

协议,DDR5 numDFEtaps 4、numFFEtaps 3 DFEtaps, 0.01000, -0.00500, -0.01000, -0.00500, FFEtaps, 0.00000, 0.85000, -0.15000,序列,176年,状态,聚合,EyeHeight, 0.610993,

打开沟通渠道的日志文件,BCI_comm_log。csv,在电子表格编辑器。日志文件中的每一行显示了序列号,哪种模式文件(Tx或Rx)写道,当前样本统计,BCI_State和眼睛高度计算。最后7列在日志中显示当前固定资产和教育部水龙头值模拟。观察每个值了,眼睛高度变化和参数值,使每次迭代后最大的眼睛高度设置。注意,FFE0的价值总是FFE-1和FFE1值的计算。

生成DDR5 Tx / Rx IBIS-AMI模型

这个例子的最后一部分需要定制的Simulink仿真模型和生成IBIS-AMI兼容DDR5模型可执行文件,金宝app宜必思和AMI文件。

打开并行转换器IBIS-AMI经理。

出口的模型

出口选项卡中并行转换器IBIS-AMI经理对话框:

  • 更新Tx模型名称ddr5_bc_tx

  • 更新Rx模型名称ddr5_bc_rx

  • 请注意,Tx和Rx角落百分比被设置为10。这将扩展角值的最小/最大模拟模型+ / -10%。

  • 验证二元模型被选中为Tx和Rx AMI模型设置。这将创建模型可执行文件,同时支持统计(Init)和时域(GetWave)分析。金宝app

  • 设置Tx模型忽略价值3因为有三个Tx FFE水龙头。

  • 设置Rx模型忽略价值到50000年允许足够的时间完成在时间域模拟培训。

  • 模型出口作为Tx和Rx这样选择的所有文件生成(AMI宜必思文件,文件和DLL文件)。

  • 设置宜必思文件名ddr5_bc_txrx.ibs

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

  • 按下出口按钮来生成模型在目标目录中。

更新AMI文件(如果需要)

Tx和Rx AMI文件生成的并行转换器工具箱是宜必思6.1规范兼容,所以所有渠道的具体参数放在Model_Specific部分的文件。

BCI_State_ST参数有5个州要求完成渠道的训练,然而使这些模型更用户友好的最终用户只需要2个:“关闭”和“培训”。这种变化,更新每个AMI BCI_State_ST参数文件如下:

  • 改变(列表1 2 3 4 5)(列表1 2)

  • 改变(List_Tip“关闭”“培训”“趋同”“失败”“错误”)(List_Tip“关闭”“培训”)

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

测试生成IBIS-AMI模型

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

模型的局限性

当与这些模型模拟一个行业标准AMI模型模拟器,记住以下限制:

  • 这些模型的目的是将作为“匹配”或运行使用并行转换器与其他AMI模型生成工具。

  • 这些模型将不会使用AMI模型生成的并行转换器以外的工具箱。具体地说,任何模型,使用标准宜必思BCI_ *关键字。

  • 不支持BCI_Protocol。金宝app这些模型已经被硬编码到一个名为“DDRx_Write”的协议。

  • 不支持BCI_ID。金宝app这些模型已经硬编码BCI_ID名叫“bci_comm”,这意味着每个仿真必须运行在一个单独的目录,以避免文件名在模拟碰撞。

  • 渠道的培训都必须启用模式被启用。这是通过设置BCI_State_ST参数来“训练”。

  • 这些模型必须运行的1024块大小合适的操作。

  • 这些模型将正确地与任何UI或样品每一点的值。

引用

[1]宜必思7.0规范,https://ibis.org/ver7.0/ver7_0.pdf

[2]电平的网站,https://www.jedec.org/

另请参阅

||||

相关的话题

外部网站