主要内容

comm.HDLCRCGenerator

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

描述

系统对象™可生成循环冗余码(CRC)位。而不是帧处理,HDLCRCGenerator系统对象处理流数据。对象对输入和输出数据流都有帧同步控制信号。

生成循环冗余码位:

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

  2. 调用带有参数的对象,就像调用函数一样。

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

创建

描述

例子

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

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

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

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

属性

全部展开

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

如果属性是可调,您可以随时更改其值。

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

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

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

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

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

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

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

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

使用

描述

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

输入参数

全部展开

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

如果输入是向量,则数据类型可以是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对象指定为第一个输入参数。例如,释放名为obj,使用以下语法:

发行版(obj)

全部展开

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

例子

全部折叠

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

创建一个要编码的32位消息,包含两个16位列。

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

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

numSteps = 12;startIn = logical([1 0 0 0 0 0 0 0 0 0 0 0 0]);endIn = logical([0 1 0 0 0 0 0 0 0 0 0 0 0]);validIn = logical([1 1 0 0 0 0 0 0 0 0 0 0 0]);

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

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

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

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

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

i = 1:numSteps [dataOutGen(:,i),startOutGen(i),endOutGen(i),validOutGen(i)] =...HDLCRC16Gen(逻辑(dataIn(:,我)),startIn(我),endIn(我),validIn(我));结束
crcg16 = com . hdlcrcgenerator with properties: Polynomial: [1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] InitialState: 0 DirectMethod: false ReflectInput: 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 = com . hdlcrcdetector with properties: Polynomial: [1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] InitialState: 0 DirectMethod: false ReflectInput: 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);Ii = 1:长度(通道)如果iscell({2})频道将数据信号显示为十六进制整数C = channels{ii};modifyDisplayChannel(洛杉矶,二世,“名字”c, c {1}, {2}, {3})将二进制列向量转换为整数Dat2 = uint16(bi2de(eval(c{1})'));chanData{ii} =挤压(dat2);其他的modifyDisplayChannel(洛杉矶,二世,“名字”,channels{ii}) chanData{ii} =挤压(eval(channels{ii})');结束结束洛杉矶(chanData {}):

算法

全部展开

扩展功能

在R2012a中介绍