文档

comm.HDLCRCGenerator

生成CRC码位并附加到输入数据

描述

这个经过hdl优化的循环冗余码(CRC)生成器System object™生成循环冗余码(CRC)位。代替帧处理,HDLCRCGenerator系统对象处理流数据。对象具有用于输入和输出数据流的帧同步控制信号。

生成循环冗余码位:

  1. 创建comm.HDLCRCGenerator对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?(MATLAB)。

创建

描述

例子

CRCGen= comm.HDLCRCGenerator创建一个hdl优化的CRC生成器系统对象,CRCGen.该对象根据指定的生成器多项式生成CRC位,并将其附加到输入数据中。

CRCGen= comm.HDLCRCGenerator (名称,值使用一个或多个名称-值对设置属性。将每个属性名用单引号括起来。例如,

CRCGen = comm.HDLCRCGenerator('多项式',[1 0 0 0 1 0 0],…'FinalXORValue',[1 1 0 0 0 0]);
指定一个CRC8多项式和一个8位值与最终校验和的异或。

CRCGen= comm.HDLCRCGenerator (名称,值设置多项式财产,并将其他指定的属性名转换为指定的值。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计(MATLAB)。

生成器多项式,指定为二元向量,系数按幂次降序排列。向量长度必须等于多项式的次数加1。

指定为二进制、双精度或单精度标量或向量的移位寄存器的初始条件。如果你指定这个属性为一个矢量,矢量长度就是你在多项式财产。如果将此属性指定为标量,则该对象将该值展开为长度等于生成器多项式的次数的向量。

计算校验和的方法,指定为逻辑标量。当这个属性真正的,对象使用直接算法进行CRC校验和计算。

要了解直接和非直接算法,请参见循环冗余校验码

输入字节顺序,指定为逻辑标量。当这个属性真正的,对象在进入移位寄存器之前按字节翻转输入数据。

校验和字节顺序,指定为逻辑标量。当这个属性真正的时,对象将输出的CRC校验和围绕其中心翻转。

校验和掩码,指定为二进制、双精度或单精度数据类型标量或向量。在将校验和附加到输入数据之前,对象用这个值XORs校验和。如果你指定这个属性为一个矢量,矢量长度就是你在多项式财产。如果将此属性指定为标量,则该对象将该值展开为长度等于生成器多项式的次数的向量。

使用

描述

YstartOutendOutvalidOut) = CRCn (XstartInendInvalidIn为输入消息生成CRC校验和X根据控制信号,并将校验和附加到X

输入参数

全部展开

输入消息,指定为表示几个位的二进制向量或标量整数。例如,向量输入(0, 0, 0, 1, 0, 0, 1, 1)相当于uint8输入19

如果输入是vector,则数据类型可以是double或逻辑类型。如果输入是标量,则数据类型可以是无符号整数或0位小数位数的无符号定点(fi ([] 0 N, 0)).

X可以是要编码的部分或全部消息。

的长度X必须小于或等于CRC长度,且CRC长度必须能被X

CRC长度是多项式的阶数多项式财产。

数据类型:|uint8|uint16|uint32|逻辑|无符号fi

输入消息的开始,指定为逻辑标量。

输入消息的末尾,指定为逻辑标量。

输入数据的有效性,指定为逻辑标量。当validIn是1 (真正的),对象计算输入的CRC校验和X

输出参数

全部展开

输出消息,由X带有附加的校验和,返回为具有与输入相同宽度和数据类型的标量整数或二进制列向量X

输入消息的开始,作为逻辑标量返回。

输入消息的末尾,作为逻辑标量返回。

输入数据的有效性,作为逻辑标量返回。当validOut是1 (真正的),输出数据Y是有效的。

对象的功能

要使用对象函数,请指定System对象作为第一个输入参数。例如,释放名为system的对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

一步 运行系统对象算法
释放 释放资源并允许更改System对象属性值和输入特征
重置 重置System对象的内部状态

例子

全部展开

使用hdl优化的CRC生成器和检测器系统对象对信号进行编码和解码。这个例子展示了如何在一个函数中包含每个对象来生成HDL代码。

在两个16位列中创建要编码的32位消息。

MSG = randi([0 1],16,2);

运行12个步骤以适应两个对象的延迟。为所有步骤分配控制信号。前两个示例是有效数据,其余的是处理延迟。

numSteps = 12;start =逻辑([1 0 0 0 0 0 0 0 0]);endIn =逻辑([0 1 0 0 0 0 0 0 0]);validIn =逻辑([1 1 0 0 0 0 0 0]);

将随机输入传递给HDLCRCGenerator系统对象™时,它正在处理输入消息。随机数据没有被编码,因为输入的有效信号是0对于步骤3到10。

randIn = randi([0,1],16,numSteps-2);dataIn = [msg randIn];

编写一个函数来创建和调用每个System对象™。您可以从这些函数生成HDL。生成器和检测器对象的CRC长度都是16,并使用默认的多项式。

注意:该对象语法仅在R2016b或更高版本中运行。如果您正在使用较早的版本,请将对象的每个调用替换为等价的一步语法。例如,替换myObject (x)步骤(myObject x)

函数[dataOut, startOut endOut validOut] = HDLCRC16Gen (dataIn、startIn endIn, validIn)% HDLCRC16Gen使用comm.HDLCRCGenerator系统对象(TM)生成CRC校验和% dataIn是一个二进制列向量。% startIn、endIn和validIn是逻辑标量值。你可以从这个函数生成HDL代码。持续的crcg16;如果isempty(crcg16) crcg16 = comm.HDLCRCGenerator()结束[dataOut, startOut endOut validOut] = crcg16 (dataIn, startIn, endIn validIn);结束
函数[dataOut, startOut endOut validOut,犯错]= HDLCRC16Det (dataIn、startIn endIn, validIn)% HDLCRC16Det%使用comm.HDLCRCDetector System对象(TM)检查CRC校验和% dataIn是一个二进制列向量。% startIn、endIn和validIn是逻辑标量值。你可以从这个函数生成HDL代码。持续的crcd16;如果isempty(crcd16) crcd16 = comm.HDLCRCDetector()结束[dataOut, startOut endOut validOut,犯错]= crcd16 (dataIn, startIn, endIn validIn);结束

调用CRC生成器函数。编码消息是原始消息加上一个16位校验和。

i = 1:numSteps [dataOutGen(:,i),startOutGen(i),endOutGen(i),validOutGen(i)] =...HDLCRC16Gen(逻辑(dataIn(:,我)),startIn(我),endIn(我),validIn(我));结束
crcg16 = comm.HDLCRCGenerator with properties:多项式:[1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1]InitialState: 0 DirectMethod: false reflecttinput: false ReflectCRCChecksum: false FinalXORValue: 0

通过在信息中翻转一点来增加噪音。

dataOutNoise = dataOutGen;dataOutNoise(2、4)= ~ dataOutNoise(2、4);

调用CRC检测器功能。检测器的输出是删除校验和的输入消息。如果输入校验和不正确,则犯错标志用输出的最后一个单词设置。

i = 1:numSteps [dataOut(:,i),startOut(i),endOut(i),validOut(i),err(i)] =...HDLCRC16Det(逻辑(dataOutNoise(:,我)),startOutGen(我),endOutGen(我),validOutGen(我));结束
crcd16 = comm.HDLCRCDetector with properties:多项式:[1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1]InitialState: 0 DirectMethod: false reflecttinput: false ReflectCRCChecksum: false FinalXORValue: 0

使用逻辑分析仪查看输入和输出信号。

渠道= {“validIn”' startIn '“endIn”...“dataIn”“基数”十六进制的},...“validOutGen”“startOutGen”“endOutGen”...“dataOutGen”“基数”十六进制的},...“dataOutNoise”“基数”十六进制的},...“validOut”“startOut”“endOut”“呃”...“dataOut”“基数”十六进制的}};la = dsp。LogicAnalyzer (“名字”“CRC编码与解码”“NumInputPorts”、长度(渠道),...“写成BackgroundColor”“黑”“DisplayChannelHeight”8);2 = 1:长度(渠道)如果iscell({2})频道%以十六进制整数形式显示数据信号c ={2}渠道;modifyDisplayChannel(洛杉矶,二世,“名字”c, c {1}, {2}, {3})%将二进制列向量转换为整数dat2 = uint16 (bi2de (eval (c {1})));chanData{2} =挤压(dat2);其他的modifyDisplayChannel(洛杉矶,二世,“名字”chanData{ii} = squeeze(eval(channels{ii})');结束结束洛杉矶(chanData {}):

算法

全部展开

扩展功能

介绍了R2012a