您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 基于verilog的CMI编码实现
基于verilog的CMI码型变换1、实验目的掌握CMI的编码规则用cpld实现m序列的CMI码型变换2、实验仪器JH5001(Ⅲ)通信原理基础实验箱电脑3、实验原理3.1CMI编码规则CMI码一般作为PCM四次群数字中继接口的码型。它具有检错能力,并且不具有直流分量,是一种很重要的码型。它的编码规则如下:表格1CMI编码规则输入码字编码结果001100/11交替表示当输入码字为0时,输出为01码型;对于输入为1的码字,输出有两种情况:输出不仅与当前码字有关,还与前一个1码的输出有关,1码对应的00或11码型,交替出现。由此可以看出,在同步的情况下,输出只对应三种有效码型,10码型无效,因此可以根据这个特点进行检错。3.2程序流程要求根据输入的时钟信号(14.336MHz)产生一个m序列(256KHz),并对该m序列进行CMI码型变换,最后将CMI码型输出。因为1位输入码元对应2位编码输出,所以输出CMI码频率是输入m序列的2倍,即512KHz。1、m序列产生m序列是最长线性反馈移存器序列的简称,它具有均衡性,无直流分量,能够起到载频抑制的作用。m序列可以通过一个带反馈的线性移存器产生,移存器的原理图如下所示:图表1带反馈的线性移存器原理图c0~cn表示反馈系数,其中c0和cn需为1,其他反馈系数可以为0或1,寄存器初值(不能全部为0)an−1~a0共n位,通过反馈相加之后将结果存入an−1,整体移动,如此循环,所以m序列是一个周期序列,它的周期为2n−1.在本实验中,我们产生一个n为4的m序列,并且反馈系数满足如下条件:c0=c1=c3=1c2=0框图如下所示:所以,易知寄存器各位算式和输出表达式如下:a32=a31+a01a22=a31a12=a21a02=a11m=aout2=a01当初始状态an−1~a0=1000时,根据上式可以计算出输出m序列的值为0001111010110012、CMI的1状态记忆根据CMI编码规则可以看出,1码对应的输出与前一个1码的状态有关,所以在程序中,需要对1码进行记忆,根据上一个1码来判断下一个1码的输出码型。4、quartus编程及仿真1码型变换源程序分析a3a2a1a0图表2n=4的m序列原理图/*================================================================*|cmi编码程序,由一个源时钟生成一个m序列和它对应的cmi码。|*================================================================*/moduleCMI(clk_main,mout,cmi_coded);inputclk_main;outputregmout;outputregcmi_coded;/*输入一个时钟信号clk_main(14.336MHz),输出产生的m序列和它的cmi编码reg[5:0]divider1,divider2,origin1,origin2;//divider1,origin1formsequence,计数,来产生m序列的时钟//divider2,origin2forcmisequence,计数,来产生cmi序列的时钟reg[3:0]m;reg[1:0]cmi_reg;/*cmi码型存储,在cmi时钟的触发下输出regcount,mstate;/*count和mstate用来对m序列中的1码进行记忆regcarry1,carry2;//carry1:256khz,是m序列的时钟信号,由divider1产生//carry2:512khz,是cmi序列的时钟信号,由divider2产生initialbeginorigin1=8;/*origin1是产生m序列时钟的计数初值。divider1从origin1开始计数/*当divider1从origin1增加到63(计数器为6位,2^6=64)的时候/*m序列时钟carry1翻转,divider1重新从origin1计数/*14.336M/256K=56,所以计数初值为63-56=8origin2=35;/*原理同上,14.336M/512K=28,计数初值为63-28=35divider1=63;divider2=63;count='b0;m=4'b1000;/*m序列移位寄存器初始值为1000carry1=0;carry2=0;mstate=0;end//dividefrequency,carry1andcarry2always@(posedgeclk_main)beginif(divider1==63)begin/*当divider1从origin1增加到63(计数器为6位,2^6=64)的时候carry1=1;divider1=origin1;/*m序列时钟carry1翻转,divider1重新从origin1计数endelsebegincarry1=0;divider1=divider1+1;endendalways@(posedgeclk_main)beginif(divider2==63)begincarry2=1;divider2=origin2;endelsebegindivider2=divider2+1;carry2=0;endend/*产生m序列,进行cmi编码并对1码进行记忆always@(posedgecarry1)begin//m_sequencemout=m[0];m=(m1);m[3]=mout^m[2];//cmi编码if(mout==0)cmi_reg='b01;elsebegin//1码状态记忆mstate=~mstate;if(mstate==0)cmi_reg='b00;elsecmi_reg='b11;endend/*在cmi时钟信号carry2的触发下输出cmi编码信号always@(posedgecarry2)begincount=count+1;if(count==1)cmi_coded=cmi_reg[1];elsecmi_coded=cmi_reg[0];endendmodule/*================================================================*|2quartus仿真先对源程序进行编译,编译通过后,建立wave文件,对输出进行仿真。仿真之前,先将endtime设置为1ms,这样,就可以得到m序列和cmi码的周期性波形。仿真得到的输出波形如下图所示:图表3quartus仿真波形在上图中,可以完整的看到m序列的一个周期,共有15位,对应的cmi编码信号与m序列相比,有一定时间的延时。1码对应得00或11交替显示,0码时钟对应于01。程序成功!
本文标题:基于verilog的CMI编码实现
链接地址:https://www.777doc.com/doc-7129391 .html