资源描述:
《安徽工业大学—通信原理课程设计—基于fpga的时分多路数字电话基带传输系统的设计与开发》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
一.项目名称及小组分工1.1项目名称:时分多路数字电话基带传输系统的设计与开发1.2成员分工:程杜仁64Kb/S的A律PCM数字话音编码器的开发设计李栋64Kb/S的A律PCM数字话音译码器的开发设计戴健博数字基带编码HDB3编码器的开发设计毕东立数字基带编码HDB3译码器的开发设计刘东方PCM30/32一次群时分复接器的开发设计胡磊PCM30/32一次群时分分接器的开发设计王堂辉同步(帧、位同步)电路的开发设计二、课题背景及目的2.1课程设计背景基带传输就是不经过调制而直接传送的方式,即发送端不使用调制器,接收端也不使用解调器。目前,虽然在实际使用的数字通信系统中基带传输不如频带传输制那样广泛,但是,对于基带输系统的研究仍然是十分有意义的。主要原因有以下几个方面。1)38 在频带传输制式里同样存在基带传输的问题(如码间干扰等),因为信道的含义是相对的,若把调制解调器包括在信道中(如广义信道),则频带传输就变成了基带传输。可以说基带传输是频带传输的基础。2)随着数字通信技术的发展,基带传输这种方式也有迅速发展的趋势。目前,它不仅用于低速数据传输,而且还用于高速数据传输。3)理论上也可以证明,任何一个采用线性调制的频带传输系统,总是可以由一个等效的基带传输系统所替代。2.2课程设计目的:使大家在综合已学现代通信系统理论知识的基础上,借助可编程逻辑器件FPGA及EDA技术的灵活性和可编程性,充分发挥自主创新意识,在规定时间内完成符合实际需求的通信系统电路设计与调试任务。通过此次课程设计不仅能够提高大家对所学理论知识的理解,还能够提高和挖掘大家对所学知识的实际运用能力,锻炼大家的创新实践能力,为以后自己做项目打下基础。38 三、系统结构框图及工作原理3.1系统框图图3.1系统总框图3.2工作原理模拟话音经A/D转换后每个样点13个比特,经PCM编码后形成每个样点8比特的非均匀量化值。30路话音及同步、信令信息复接成一路2.048Mbit/s串行数据流发送出去。在接收端进行HDB3译码、分接、PCM译码、D/A转换,还原出模拟话音。四、各模块工作原理及程序实现4.1PCM编码器4.1.1PCM编码器模块简介输入信号为:(1)一个13位逻辑矢量的均匀量化值:D0,D1…D12,其中:D0为极性位,取值范围在-4096~+4096之间;38 (2)一个占空比为1/32的8K/S的取样时钟信号;(3)一个占空比为50%的2.048Mb/S的合路时钟信号;输出信号为:(1)一个8位逻辑矢量的13折线非均匀量化值:C0,C1…C7,其中:C0为极性位.C0=1为正,C0=0为负;(2)一个占空比为1/32的8K/S的取样时钟信号;(3)一个占空比为50%的2.048Mb/S的合路时钟信号;4.1.2PCM编码原理PCM脉冲编码调制是PulseCodeModulation的缩写。PCM编码的方法是对语音信号进行采样,然后对每个样值进行量化编码。CCITT(现ITU-T)的64kbit/s语音编码标准G.711采用PCM编码方式,采样速率为8kHz,每个样值用8bit非线性的μ律或A律进行编码,总速率为64kbit/s。我国和欧洲各国都采用A律,它的13折线的产生是从非均匀量化的基点出发,设法用13折线逼近A=87.6的A律压缩特性。A律压扩特性是连续曲线,这样,它基本上保证了连续压扩的优点,有便于数字电路实现。38 在13折线法中,无论输入信号是正是负,均按8段折线(8个段落)进行编码。若用8位折叠二进制码来表示输入信号的抽样量化值,其中用第一位表示量化值的极性,其余七位(第二位至第八位)则表示抽样量化值的绝对大小。具体的做法是:用第二至第四位表示段落码,它的8种可能状态来分别代表8个段落的起点电平。其它四位表示段内码,它的16种可能状态来分别代表每一段落的16个均匀划分的量化级。这样处理的结果,8个段落被划分成128个量化级。段落码和8个段落之间的关系如表1所示;段内码与16个量化级之间的关系见表4.1.2所示。表4.1.2-1段落码表4.1.2-1段内码段落序号段落码段落范围量化间隔段内码量化间隔段内码81112048-40961511117011171101024-2048141110601106101512-1024131101501015100256-512121100401004011128-25611101130011301064-12810101020010200132-64910011000110000-3281000000004.1.3PCM编码程序实现程序实现方法参照表4.1.3,运用VHDL语言中的连接符’&’实现输入输出的转换。38 图4.1.34.1.4PCM编码程序与仿真libraryieee;useieee.std_logic_1164.all;entitypcm_bmisport(clkin:instd_logic;b:instd_logic_vector(12downto0);c:outstd_logic_vector(7downto0));endpcm_bm;architectureoneofpcm_bmisbeginprocess(clkin,b)beginifclkin'eventandclkin='1'thenifb(11)='1'thenc<=b(12)&"111"&b(10downto7);elsifb(10)='1'thenc<=b(12)&"110"&b(9downto6);elsifb(9)='1'thenc<=b(12)&"101"&b(8downto5);elsifb(8)='1'thenc<=b(12)&"100"&b(7downto4);elsifb(7)='1'thenc<=b(12)&"011"&b(6downto3);elsifb(6)='1'thenc<=b(12)&"010"&b(5downto2);elsif38 b(5)='1'thenc<=b(12)&"001"&b(4downto1);elsec<=b(12)&"000"&b(4downto1);endif;endif;endprocess;endone;4.2PCM译码器4.2.1PCM译码器模块简介输入信号:(1)一个8位逻辑矢量的13折线非均匀量化值:C0,C1…C7其中:C0为极性位.C0=1为正,C0=0为负。(2)一个占空比为1/32的8K/S的取样时钟信号。(3)一个占空比为50%的2.048Mb/S的合路时钟信号。输出信号:(1)一个13位逻辑矢量的均匀量化值:D0,D1…D12,其中:D0为极性位,取值范围在-4096~+4096之间。38 (2)一个占空比为1/32的8K/S的取样时钟信号(3)一个占空比为50%的2.048Mb/S的合路时钟信号。4.2.2PCM译码译码原理PCM译码是PCM编码的逆过程。通过对PCM编码的分析,可以进行8位PCM编码到13位A率13折线的转换,具体转换见下译码规则见图4.2.2。图4.2.2PCM译码规则4.2.3流程图如下38 4.2.4PCM译码程序与仿真图libraryieee;useieee.std_logic_1164.all;entityPCMdecodeisport(clkin:instd_logic;C:instd_logic_vector(7downto0);D:outstd_logic_vector(12downto0);clkout:outstd_logic);endPCMdecode;architecturebehaviorofPCMdecodeissignaltemp:std_logic_vector(2downto0);begintemp<=C(6downto4);process(clkin)beginifclkin'eventandclkin='1'thencasetempiswhen"111"=>D<=C(7)&"1"&C(3downto0)&"1000000";38 when"110"=>D<=C(7)&"01"&C(3downto0)&"100000";when"101"=>D<=C(7)&"001"&C(3downto0)&"10000";when"100"=>D<=C(7)&"0001"&C(3downto0)&"1000";when"011"=>D<=C(7)&"00001"&C(3downto0)&"100";when"010"=>D<=C(7)&"000001"&C(3downto0)&"10";when"001"=>D<=C(7)&"0000001"&C(3downto0)&"1";when"000"=>D<=C(7)&"0000000"&C(3downto0)&"1";whenothers=>D<=null;endcase;endif;endprocess;clkout<=clkin;endbehavior;4.3HDB3编码器4.3.1HDB3编码器模块简介:输入信号:(1)一路串行2.048Mb/S合路数据流;(2)一路2.048Mb/S位同步时钟脉冲。输出信号:(1)一路串行2.048Mb/S合路HDB3编码的正极性数据流H+;(2)一路串行2.048Mb/S合路HDB3编码的负极性数据流H-;(3)一路2.048Mb/S位同步时钟脉冲。38 4.3.2HDB3编码原理1)对输入为1码元交替翻转编码,即依次在H+和H-端口输出12)对输入为0码元同时在H+和H-端口输出03)当连续输入4个0码元,且与上一个连续0码元之间1码元为奇数个时,第四个0码元改为1码元,且与之前1码元的最后一个1码元同极性,即:在同端口输出4)当连续输入4个0码元,且与上一个连续4个0码元之间1码元为偶数个时,第一个0码元改为1码元,与之前1码元的最后一个1码元反极性,即:在不同端口输出,第四个0码元改为1码元,且与之前1码元的最后一个1码元同极性,即:在同端口输出4.3.3设计流程图图4.3.338 4.3.4HDB3编码程序与仿真图libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhdb3_bmisport(clk,data:instd_logic;h1,h2:outstd_logic);endhdb3_bm;architectureoneofhdb3_bmissignalfirstv:std_logic:='0';signalreg_h1,reg_h2:std_logic_vector(3downto0):="0000";signalflag,h1_temp,h2_temp,B,s1,ctl:std_logic:='0';beginp1:process(clk)variablecnt0:std_logic_vector(2downto0):="000";variablecnt1,cnt11,v:std_logic:='0';beginifclk'eventandclk='1'thenifdata='0'thencnt0:=cnt0+1;ifcnt0="100"thencnt0:="000";--输入连续四个0;if(firstv='0')thenif(cnt11='0')thenv:='0';elsev:='1';endif;cnt11:='0';firstv<='1';elsev:=notv;ifcnt11='0'then--偶数1插Bctl<='1';B<=v;flag<=notflag;--修改B之后用flag标记以后对1极性做相反处理elsecnt11:='0';ctl<='0';endif;endif;ifv='1'thenh1_temp<='1';h2_temp<='0';elseh1_temp<='0';h2_temp<='1';endif;else38 ctl<='0';--不为四个连0时;h1_temp<='0';h2_temp<='0';endif;else--输入为1时;cnt0:="000";ctl<='0';cnt11:=notcnt11;cnt1:=notcnt1;ifflag='0'then--没有修改B时对1处理ifcnt1='1'thenh1_temp<='1';h2_temp<='0';elseh1_temp<='0';h2_temp<='1';endif;else--修改B后对1处理与上相反ifcnt1='1'thenh1_temp<='0';h2_temp<='1';elseh1_temp<='1';h2_temp<='0';endif;endif;endif;endif;endprocessp1;p2:process(clk)beginifclk'eventandclk='1'then--移位寄存器部分reg_h1(0)<=h1_temp;reg_h2(0)<=h2_temp;fortin1to3loopreg_h1(t)<=reg_h1(t-1);reg_h2(t)<=reg_h2(t-1);endloop;ifctl='1'thenifB='1'thenreg_h1(3)<='1';reg_h2(3)<='0';elsereg_h1(3)<='0';reg_h2(3)<='1';endif;endif;38 h1<=reg_h1(3);h2<=reg_h2(3);endif;endprocessP2;endone;4.4HDB3译码器4.4.1HDB3译码器模块简介:输入信号:(1)一路串行2.048Mb/S合路HDB3编码的正极性数据流H+;(2)一路串行2.048Mb/S合路HDB3编码的负极性数据流H-;(3)一路2.048Mb/S位同步时钟脉冲。输出信号:(1)一路串行2.048Mb/S合路数据流;(2)一路2.048Mb/S位同步时钟脉冲。4.4.2HDB3译码规则分析将编码修改过的0码元恢复,并将双极性交替1脉冲改为单极性1脉冲38 4.4.3HDB3译码VHDL语言设计对输入的H+和H-分别设立一个五级缓存移位寄存器,每一拍都判断是否存在10001,或1001X;若存在分别改成10000,或0000X。再将H+和H-相或输出。4.4.4设计流程图4.4.5HDB3译码程序与仿真图libraryieee;useieee.std_logic_1164.all;entityhdbdecodeisport(clkin:instd_logic;datainhh:instd_logic;datainhl:instd_logic;dataout:outstd_logic;clkout:outstd_logic);endhdbdecode;architecturebehaviorofhdbdecodeissignalhh,hl:std_logic_vector(4downto0);signaltemp:std_logic;beginAHH:process(clkin)variabletemphh:std_logic_vector(4downto0);beginifclkin'eventandclkin='0'thentemphh(0):=datainhh;iftemphh="10001"then38 temphh:="10000";elsif(temphh="10010"ortemphh="10011")thentemphh:="0000"&datainhh;endif;endif;hh<=temphh;temphh(4downto1):=temphh(3downto0);endprocess;AHL:process(clkin)variabletemphl:std_logic_vector(4downto0);beginifclkin'eventandclkin='0'thentemphl(0):=datainhl;iftemphl="10001"thentemphl:="10000";elsif(temphl="10010"ortemphl="10011")thentemphl:="0000"&datainhl;endif;endif;hl<=temphl;temphl(4downto1):=temphl(3downto0);endprocess;temp<=(hh(4)orhl(4));dataout<=temp;clkout<=clkin;endbehavior;38 4.5时分复接器4.5.1时分复接器模块简介输入信号:(1)一个8位数据总线D7~D0(即30路PCM话音并行数据共用总线)D7-C0;D6-C1;…D0-C7.(2)一个一次群串行位同步时钟2.048MB/S信号输出信号:(1)一个一次群串行合路数据流2.048MB/S信号(2)一个一次群串行位同步时钟2.048MB/S信号(3)一个5位时隙地址总线信号(即30路PCM话音并行地址总线)(其说明当前输入的数据总线上是哪个时隙数据)。4.5.2时分复接原理它将30路语音信号通过抽样、量化、编码和时分复用产生2.048Mbit/s的数字信号进行传输。它可以与高次群数字复用设备连接构成更大容量的数字通信系统。它主要解决的是同步的问提,即如何将30路语音信号时分复用,以及在收端又如何将30路语音信号各自提取出来。复接器就是完成这样的并行的语音信号转换成串行的数据流在信道中传输,并且产生地址选择信号选中不同的时隙。38 图4.5.2时分复接帧结构图4.5.3时分复接原理框图38 一次群时分复接器根据ITU-TG.704协议将速度为2.048MHZ的并行数据流转换成速度为64KB大小的串行数据输出,其中主要原理是并串转换电路。为了使接受端数据流能够准确提取在30路语音信号中插入同步和信令时隙。在G-704协议中要求一个复帧有16个子帧构成。其中偶帧的第0帧传递同步信息,“10011011”奇数帧的第0帧作为它用。第0复帧第16帧传送复帧同步信息“00001111”。4.5.4程序及仿真图libraryieee;--程序所调用的库是IEEE库useieee.std_logic_1164.all;--定义了std_logic,std_logic_vector类型useieee.std_logic_unsigned.all;--用到基于std_logic,std_logic_vector类型的--无符号的算术运算entityfujieisport(clockin:instd_logic;datain:instd_logic_vector(7downto0);--30路语音信号输入dataout:outstd_logic;--输出串行数据流ads:outstd_logic_vector(4downto0);--五位时隙总线信号clockout:outstd_logic);--输出时钟endfujie;architecturebehavoffujieissharedvariableshixijishuqi:std_logic_vector(8downto0);--时隙计数器sharedvariableweijishuqi:std_logic_vector(2downto0);--位计数器beginp1:process(clockin)--位时钟和时隙计数beginifclockin'eventandclockin='1'then--上升沿有效ifweijishuqi="111"thenweijishuqi:="000";shixijishuqi:=shixijishuqi+'1';elseweijishuqi:=weijishuqi+'1';endif;endif;endprocessp1;p2:process(clockin)variableregester:std_logic_vector(7downto0);--定义一个内部的寄存器,--用于寄存输入的八位数据variablex:std_logic_vector(7downto0);--定义一个中间变量,用于数据的串行输出38 beginifclockin'eventandclockin='1'thenads<=shixijishuqi(4downto0);--记录当前输出的是第几路信号ifweijishuqi="000"thenifshixijishuqi(5downto0)="000000"thenregester:="10011011";--双帧计数为0时传帧同码elsifshixijishuqi(5downto0)="100000"thenregester:="11111111";--双帧计数为32时传勤务信息elsifshixijishuqi="000010000"thenregester:="00001111";--复帧计数为16时传复帧同步码elsifshixijishuqi(4downto0)="10000"thenregester:="11111111";--除F0帧外,每帧的第16时隙都传信令信息elseregester:=datain;--不满足以上条件时传语音信号endif;x:=regester;--并串转换dataout<=x(7);--时隙的第一个时钟上升沿输出最高位elsex(7downto1):=x(6downto0);--右移dataout<=x(7);--接着发其他位endif;endif;clockout<=clockin;--输出时钟endprocessp2;endbehav;38 4.6时分分接器4.6.1时分分接模块简介输入信号为:(1)一个一次群串行合路数据流2.048Mb/S信号(2)一个一次群串行位同步时钟2.048Mb/S信号输出信号为:(1)一个一次群串行合路数据流2.048Mb/S信号(2)一个30位逻辑矢量时隙脉冲信号(每位对应一路时隙脉冲)(3)一个一次群串行位同步时钟2.048Mb/S信号4.6.2时分分接原理分接器完成将64KB的串行性数据流转换成2.048的并行数据转换。利用位同步时钟触发计数器。产生出不同时隙的地址选择信号,利用这个信号与数据流相与产生并行的数据。4.6.3系统框图图4.6.3时分分接系统框图38 为了正确地实施分接,在分接前必须先通过帧同步单元对合路信号进行帧同步检测。一旦检测到帧同步码(10011011),立即输出一个捕获脉冲信号。系统工程上电复位后,在起始时刻处于失步状态,系统从外部输入的合码路流中搜捕帧同步码“10011011”,若合路码流中没有帧同步码,状态计数器仍保持为00;若从合码路流中检测同步码,则状态计数器变为01,系统进入同步核校态,开始将合路码流写入移位寄存器,分接器输出开关仍然为关闭状态。连续3次判断为帧同步码,则状态计数器变为10,系统进入保持态,分接器输出开关打开,开始正常分接合路码流。相反,若连续3次未捕获到同步码,则系统进入失步态。4.6.4时分分接程序及仿真图libraryieee;--库说明useieee.std_logic_1164.all;--包集合useieee.std_logic_unsigned.all;entityfenjieis--实体定义port(datain,clkin:instd_logic;hua_lu1,hua_lu2,hua_lu3,hua_lu4,hua_lu5,hua_lu6,hua_lu7,hua_lu8,hua_lu9,hua_lu10,hua_lu11,hua_lu12,hua_lu13,hua_lu14,hua_lu15,hua_lu16,hua_lu17,hua_lu18,hua_lu19,hua_lu20,hua_lu21,hua_lu22,hua_lu23,hua_lu24,hua_lu25,hua_lu26,hua_lu27,hua_lu28,hua_lu29,hua_lu30:outstd_logic;dataout,clkout:outstd_logic);endfenjie;architecturefjoffenjieis--构造体38 signalreg,single32:std_logic_vector(7downto0):="00000000";--reg为八位移位寄存器用于捕获同步码,single32为单帧计数器signaldouble64:std_logic_vector(8downto0):="000000000";--double64为双帧计数器signalstate:std_logic:='0';--同步码捕捉状态标志0表捕捉态,1表示同步态signaltong_bu,shi_bu:std_logic_vector(1downto0):="00";--同步计数器与失步计数器beginP1:process(clkin)--利用移位寄存器暂存当前输入码,敏感信号为时钟上升沿beginifclkin'eventandclkin='1'then--时钟上升沿有效暂存输入数据reg<=reg(6downto0)&datain;endif;endprocessP1;P2:process(clkin)--同步码捕捉,同步保持比较beginifclkin'eventandclkin='0'then--时钟下降沿有效验证是否为同步码--且验证落后于暂存刚好半个时钟周期,敏感信号为时钟下降沿,即时钟下降沿到达一次程序执行一次double64<=double64+1;single32<=double64(7downto0);ifstate='0'then--state为0时为捕捉态iftong_bu="00"thenifreg="10011011"then--第一次捕捉到同步码tong_bu<=tong_bu+1;double64<="000000111";--将其次数加一,并且让输出变为第八位endif;elsifdouble64="000000110"then--已捕捉到同步码的同时验证捕获共需要512次时钟也就是双帧ifreg="10011011"theniftong_bu="10"thenstate<='1';tong_bu<="00";--验证同步次数达到三次时转为同步状态elsetong_bu<=tong_bu+1;endif;else38 tong_bu<="00";--验证不是同步码时转为重新捕获状态endif;endif;else--state为1,同步态时,同步保持比较ifdouble64="000000110"andreg/="10011011"then---表示同步时验证不是同步码////////ifshi_bu="10"thenstate<='0';shi_bu<="00";--验证失步次数达到三次时转为捕捉状态elseshi_bu<=shi_bu+1;endif;endif;endif;endif;endprocessP2;P3:process(clkin,single32,state)--时钟上升沿有效,译码输出beginifclkin'eventandclkin='1'thenifstate='1'thendataout<=datain;ifsingle32>="00001000"andsingle32<="00001111"thenhua_lu1<=datain;elsehua_lu1<='0';endif;--cnt=8-15ifsingle32>="00010000"andsingle32<="00010111"thenhua_lu2<=datain;elsehua_lu2<='0';endif;--cnt=16-23ifsingle32>="00011000"andsingle32<="00011111"thenhua_lu3<=datain;elsehua_lu3<='0';endif;--cnt=24-31ifsingle32>="00100000"andsingle32<="00100111"thenhua_lu4<=datain;elsehua_lu4<='0';endif;--cnt=32-39ifsingle32>="00101000"andsingle32<="00101111"thenhua_lu5<=datain;elsehua_lu5<='0';endif;--cnt=40-47ifsingle32>="00110000"andsingle32<="00110111"thenhua_lu6<=datain;elsehua_lu6<='0';endif;--cnt=48-55ifsingle32>="00111000"andsingle32<="00111111"thenhua_lu7<=datain;elsehua_lu7<='0';endif;--cnt=56-63ifsingle32>="01000000"andsingle32<="01000111"thenhua_lu8<=datain;elsehua_lu8<='0';endif;--cnt=64-71ifsingle32>="01001000"andsingle32<="01001111"thenhua_lu9<=datain;elsehua_lu9<='0';endif;--cnt=72-7938 ifsingle32>="01010000"andsingle32<="01010111"thenhua_lu10<=datain;elsehua_lu10<='0';endif;--cnt=80-87ifsingle32>="01011000"andsingle32<="01011111"thenhua_lu11<=datain;elsehua_lu11<='0';endif;--cnt=88-95ifsingle32>="01100000"andsingle32<="01100111"thenhua_lu12<=datain;elsehua_lu12<='0';endif;--cnt=96-103ifsingle32>="01101000"andsingle32<="01101111"thenhua_lu13<=datain;elsehua_lu13<='0';endif;--cnt=104-111ifsingle32>="01110000"andsingle32<="01110111"thenhua_lu14<=datain;elsehua_lu14<='0';endif;--cnt=112-119ifsingle32>="01111000"andsingle32<="01111111"thenhua_lu15<=datain;elsehua_lu15<='0';endif;--cnt=120-127--第0时隙和第16时隙非话音信息ifsingle32>="10001000"andsingle32<="10001111"thenhua_lu16<=datain;elsehua_lu16<='0';endif;--cnt=136-143ifsingle32>="10010000"andsingle32<="10010111"thenhua_lu17<=datain;elsehua_lu17<='0';endif;--cnt=144-151ifsingle32>="10011000"andsingle32<="10011111"thenhua_lu18<=datain;elsehua_lu18<='0';endif;--cnt=152-159ifsingle32>="10100000"andsingle32<="10100111"thenhua_lu19<=datain;elsehua_lu19<='0';endif;--cnt=160-167ifsingle32>="10101000"andsingle32<="10101111"thenhua_lu20<=datain;elsehua_lu20<='0';endif;--cnt=168-175ifsingle32>="10110000"andsingle32<="10110111"thenhua_lu21<=datain;elsehua_lu21<='0';endif;--cnt=176-183ifsingle32>="10111000"andsingle32<="10111111"thenhua_lu22<=datain;elsehua_lu22<='0';endif;--cnt=184-191ifsingle32>="11000000"andsingle32<="11000111"thenhua_lu23<=datain;elsehua_lu23<='0';endif;--cnt=192-199ifsingle32>="11001000"andsingle32<="11001111"thenhua_lu24<=datain;elsehua_lu24<='0';endif;--cnt=200-207ifsingle32>="11010000"andsingle32<="11010111"thenhua_lu25<=datain;elsehua_lu25<='0';endif;--cnt=208-215ifsingle32>="11011000"andsingle32<="11011111"thenhua_lu26<=datain;elsehua_lu26<='0';endif;--cnt=216-223ifsingle32>="11100000"andsingle32<="11100111"thenhua_lu27<=datain;elsehua_lu27<='0';endif;--cnt=224-231ifsingle32>="11101000"andsingle32<="11101111"thenhua_lu28<=datain;elsehua_lu28<='0';endif;--cnt=232-239ifsingle32>="11110000"andsingle32<="11110111"thenhua_lu29<=datain;elsehua_lu29<='0';endif;--cnt=240-247ifsingle32>="11111000"andsingle32<="11111111"thenhua_lu30<=datain;elsehua_lu30<='0';endif;--cnt=248-255endif;38 endif;endprocessP3;clkout<=clkin;endfj;38 4.7同步模块同步分为两个模块:帧同步和码元同步。设计方案如下4.7.1帧同步图4.7.1帧同步提取原理框图38 说明:上图为位移搜索法原理框图。在这种方法中系统开始处于捕捉态时,对接受码元逐一考察,若考察第一个码元就发现它符合群同步码元的要求,则暂时假定它就是群同步码元;在等待一个周期后,再考察下一个预期位置上码元是否还符合要求。若连续n个周期都符合要求,就认为捕捉到了同步码;这里将n设为3。若考察第一个码元不符合群同步码元的要求或在n周期内出现一次被考察码元不符合要求,则推迟一位考察下一个接受码元,直到找到符合要求的码元并连续保持n个周期都符合为止;这时捕捉态转为保持态。在保持态,同步电路仍然要不断考察同步码是否正确,但为了防止考察时因噪声偶然发生一次错误而导致错认为失去同步,一般可以规定在连续n个周期内发生m次(m小于n)考察错误才认为是失去同步。这种措施即为同步保护。4.7.2位同步位同步锁相环法实现是在接收端利用鉴相器比较接受码元和本地产生的位同步信号的相位,若两者相位不一致,鉴相器就产生误差信号去调整同步信号的相位,直至获得准备的位同步信号为止。图4.7.2帧同步提取原理框图4.7.3系统总框图程序实现包括三个底层模块:相位比较PCC、数字滤波DLE、受控分频DCO。38 相位比较PCC数字滤波DLE受控分频DCOData_InPhaseerrorInsertsignalReducesignalClk_EstClk图4.7.3-1相位比较原理框图采样电路Data_InClk_Est异或异或SignAbsValPhase_Errabc图4.7.3-2数字滤波原理框图模2N计数器置位计数器2N计数器0相位比较器信号超前脉冲滞后脉冲38 图4.7.3-3位同步程序实现后生成的RTL原理图数字滤波电路主要由双向计数模块和比较控制模块组成。在初始时刻,双向计数器被置初值M/2。前级相位比较器模块送来的相位误差Pase_Eroor在双向计数器中作代数累加。在计数值达到边界值0或M后,比较逻辑将计数器同步置回M/2,同时相应地在Reduce_Signal或Insert_Signal引脚上输出一高脉冲作为控制指令。随机噪声引起的相位误差输出由于长时间保持同一极性的概率极小,在计数器中会被相互抵消,而不会传到后级模块中去,达到了去噪滤波的目的。受控分频主要功能是根据前级DLF模块输出的控制信号Reduce_Signal和Insert_Signal生成本地估算时钟ClkEst,这一时钟信号即为位同步模块恢复出来的位时钟。DCO应有三个基本的组成部分:高速振荡器、相位调节器和分频器。4.7.4程序及仿真图libraryIEEE;--相位比较模块useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityphase_compareisport(Reset:instd_logic;Clk_Est:instd_logic;Date_In:instd_logic;Phase_Error:outstd_logic_vector(1downto0));endphase_compare;architecturertlofphase_compareis38 signalTemp_SampleA:std_logic;signalTemp_SampleB:std_logic;signalTemp_SampleC:std_logic;beginprocess(Reset,Clk_Est)beginif(Reset='0')thenTemp_SampleA<='0';Temp_SampleC<='0';elsif(Clk_Est'eventandClk_Est='0')thenTemp_SampleA<=Temp_SampleC;Temp_SampleC<=Date_in;endif;endprocess;process(Reset,Clk_Est)beginif(Reset='0')thenTemp_SampleB<='0';elsif(Clk_Est'eventandClk_Est='1')thenTemp_SampleB<=Date_in;endif;endprocess;process(Reset,CLK_Est)beginif(Reset='0')thenPhase_Error<="00";elsif(Clk_Est'eventandClk_Est='0')thenPhase_Error(0)<=Temp_SampleAxorTemp_SampleC;Phase_Error(1)<=Temp_SampleBxorTemp_SampleC;endif;endprocess;endrtl;libraryIEEE;--数字滤波模块useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;38 useIEEE.STD_LOGIC_UNSIGNED.ALL;entityloop_filterisgeneric(M:integer);port(Reset:instd_logic;Clk:instd_logic;Clk_Est:instd_logic;Phase_Error:instd_logic_vector(1downto0);insert_signal:outstd_logic;reduce_signal:outstd_logic);endloop_filter;architecturertlofloop_filterissignalvalue_lever:integerrange0to255;signalcount_sample:integerrange0to7;beginprocess(Reset,Clk_Est)beginif(Reset='0')thenValue_Lever<=M/2-1;elsif(Clk_Est'eventandClk_Est='1')thenif((Value_Lever=0)or(Value_Lever=M-1))thenValue_Lever<=M/2-1;elsecasePhase_Erroriswhen"01"=>Value_Lever<=Value_Lever-1;when"11"=>Value_Lever<=Value_Lever+1;whenothers=>endcase;endif;endif;endprocess;process(Reset,Clk)beginif(Reset='0')then38 Count_sample<=0;elsif(Clk'eventandCLk='1')thenCount_sample<=Count_sample+1;endif;endprocess;process(Reset,Clk)beginif(Reset='0')theninsert_signal<='0';reduce_signal<='0';elsif(Clk'eventandCLk='0')thenif(Count_sample=0)thenif(value_lever=0)thenreduce_signal<='1';elsif(value_lever=M-1)theninsert_signal<='1';endif;elseinsert_signal<='0';reduce_signal<='0';endif;endif;endprocess;endrtl;libraryIEEE;--可控分频模块useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitydigital_coisport(Reset:instd_logic;Clk:instd_logic;Clk_Est:bufferstd_logic;insert_signal:instd_logic;reduce_signal:instd_logic);enddigital_co;38 architecturertlofdigital_coissignalCount_Control:integerrange0to7;beginprocess(Reset,Clk)beginif(Reset='0')thenCount_Control<=0;elsif(Clk'eventandCLk='1')thenif(Insert_Signal='1')thenCount_Control<=Count_Control;elsif(Reduce_Signal='1')thenCount_Control<=Count_Control+2;elseCount_Control<=Count_Control+1;endif;endif;endprocess;process(Reset,Clk)beginif(Reset='0')thenclk_est<='0';elsif(Clk'eventandCLk='0')thenif(Count_Control=7)thenclk_est<=notclk_est;endif;endif;endprocess;endrtl;libraryIEEE;--顶层设计模块useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitydigital_pllisport(Reset:instd_logic;Clk:instd_logic;Date_In:instd_logic;38 Clk_estimate:outstd_logic;data_out:outstd_logic);enddigital_pll;architecturertlofdigital_plliscomponentphase_compareport(Reset:instd_logic;Clk_Est:instd_logic;Date_In:instd_logic;Phase_Error:outstd_logic_vector(1downto0));endcomponent;componentloop_filtergeneric(M:integer);port(Reset:instd_logic;Clk:instd_logic;Clk_Est:instd_logic;insert_signal:outstd_logic;reduce_signal:outstd_logic;Phase_Error:instd_logic_vector(1downto0));endcomponent;componentdigital_coport(Reset:instd_logic;Clk:instd_logic;Clk_Est:bufferstd_logic;insert_signal:instd_logic;reduce_signal:instd_logic);endcomponent;signalclk_est:std_logic;signalphase_error:std_logic_vector(1downto0);signalinsert_signal:std_logic;signalreduce_signal:std_logic;beginu1:phase_compare38 portmap(reset=>reset,clk_est=>clk_est,date_in=>date_in,phase_error=>phase_error);u2:loop_filtergenericmap(256)portmap(reset=>reset,clk=>clk,clk_est=>clk_est,phase_error=>phase_error,insert_signal=>insert_signal,reduce_signal=>reduce_signal);u3:digital_coportmap(reset=>reset,clk=>clk,insert_signal=>insert_signal,reduce_signal=>reduce_signal,clk_est=>clk_est);clk_estimate<=clk_est;data_out<=date_in;endrtl;38 五、心得体会这次EDA课程设计历时两个多星期,在这段时间里也加深了对所学知识的理解、运用和掌握。深刻体会到了《通信原理》在实践中的运用,做到了理论实践相结合。身为小组组长,在做本次课程设计的过程中,我了解了分工合作的重要性。一个项目往往分为许多个细小的模块,每个细小的模块通过组合使得整个系统正常运行的。系统往往是很庞大复杂的,以一个人的能力往往是很难完成的,因此合理分配任务,小组成员相互讨论交换意见是十分重要的。此外,通过这次课程设计也锻炼我们寻找问题、解决问题的能力,这对以后的学习和工作都是很有帮助的。总的来说,这次时分多路数字电话基带系统还是比较成功的,虽然在寻找方案、设计算法、程序调试中遇到了很多问题,但最后都通过努力克服了,达到了理论与实际相结合的目的。通过这次课程设计,不仅把所学的知识得到强化和巩固,同时能力上也得到了锻炼,为以后做项目奠定了一定的基础。此次课程设计,我收获颇丰!38 参考文献:[1]樊昌信,曹丽娜.通信原理(第6版)[M].北京:国防工业出版社,2011.[2]潘松.EDA技术实用教程[M].北京:科学出版社,2010.[3]阎石.数字电子技术[M].北京:高等教育出版社,2010.38