本课程设计概括了HDB3数字编码器的研究背景、意义,同时对EDA技术和编码技术作了简要的说明。设计方面包括规划基于VHDL的HDB3编码器设计的总体方案;基于VHDL的HDB3编码器的软件实现。其中HDB3码的编码程序设计是在QuartusⅡ软件环境下进行的,首先在QuartusⅡ软件环境下建立一个工程,工程名和程序的实体名一致,并将其作为该工程的设计文件。然后在VHDL文本编辑窗中输入设计的VHDL源程序,进行编译。程序编译成功后要进行时序仿真,这一部分同样是在QuartusⅡ软件环境下完成的。
关键词:HDB3;建模;VHDL;编码;QUARTUSⅡ
1、引言
数字基带信号的传输是数字通信系统的重要组成部分之一。特别是HDB3码的使用,其不但保持AMI码的优点,更使连0串的个数减到至多0个的优点,而且还克服了AMI码的关于可能出现长连0串而造成提取定时信号困难的缺点。基于上述的特点HDB3码在通信传输领域应用很广泛,因此其作为CCITT推荐使用的码型之一。
本课程设计的主要工作是HDB3码的编码的建模与实现,对于HDB3编码模块,一般以硬件的方式来实现的。但它具有产品更新慢、设计灵活性差、不可重配置及现场升级性能缺乏等缺点。因此拟采用可编程逻辑电路来实现。可编程逻辑电路是EDA的一个重要技术基础,主要包括FPGA和CPLD,它们具有丰富的可重配置逻辑资源,既包含有大量实现组合逻辑的资源;还包含有相当数量的触发器,因此采用EDA技术进行电子系统的设计有以下优点:
●系统可现场编程,在线升级;
●用软件的方式设计硬件;
●整个系统可集成在一个芯片上,体积小、功耗低、可靠性高;
●用软件方式设计的硬件系统的转换是由有关的开发软件自动完成,降低了系统设计的难度。
2、VHDL语言的介绍
常用的硬件描述性语言有VHDL、Verilog和ABEL语言。VHDL语言起源于美国国防部的VHSIC,VHDL是一种高级描述语言,适用于行为级和RTL级的描述相对与Verilog语言和ABEL语言这些较低一级的适合描述门级电路的描述性语言而言,其具有以下的优点:
⒈设计方法灵活、支持广泛
⒉系统硬件描述能力强
⒊VHDL语言描述与工艺不发生关系
⒋VHDL语言标准、规范,易于共享和复用
基于上述的特点,可知VHDL语言可读性好,又能被计算机识别。VHDL语言中设计实体、程序包、设计库,为设计人员重复利用已有的设计提供了诸多技术手段。可重复利用他人的IP模块和软核也是VHDL的另一特色,许多设计不必每次都从头再来,只要在更高层次上把IP模块组合起来,就能达到事半功倍的效果。这样,设计人员自行开发的IP模块在集成电路设计中占有重要的地位。因此本课程设计采用VHDL语言设计一个完善的HDB3码编码器。
3、HDB3码编码器的建模与实现
3.1 HDB3码的编码规则
在基带传输中,常用的码型有AMI码、HDB3码、4B/3T码、CMI码、以及双相码等。其中,AMI码是将输入单极性波形的所有正脉冲变为适合于在信道传输的正负极性交替的脉冲,而HDB3码则是在AMI码基础上改进的一种双极性归零码,它除具有AMI码功率谱中无直流分量,可进行差错自检等优点外,还克服了AMI码当信息中出现连“0” 码时定时提取困难的缺点,同时HDB3码频谱能量主要集中在基波频率以下,占用频带较窄,因此被广泛用作PCM线路传输码型,因此要了解HDB3码的编码规则,首先要知道AMI码的构成规则,AMI码就是把单极性脉冲序列中相邻的“1”码变为极性交替的正、负脉冲。将“0”码保持不变,把“1”码变为+1、-1交替的脉冲。如:
信息序列:10011010111100001
AMI码:+100-1+10-10+1-1+1-10000+1
HDB3码是一种AMI码的改进型,它的编码过程为:
①没有4个或4个连“0”串时,HDB3编码规律与AMI码相同,即“1”码变为“+1”、 “-1”交替脉冲。
②当代码序列中出现4个或4个以上连“0”串时,则将每4个连“0”小段即“0000”的第4个0变换成与前一非“0”符号同极性的符号,用破坏符号V表示。
③为了使附加V符号后的序列不破坏“极性交替反转”造成的无直流特性,还必须保证相邻V符号也应极性交替。这一点,当相邻V符号之间有奇数个非0符号时,则是能得到保证,当有偶数个非0符号时,则就得不到保证,这时再将该小段的第一个0变换成+B或-B,B符号的极性与前一非0符号的极性相反,并让后面的非0符号从V符号开始再交替变换。
3.2 基于VHDL的编码器的建模及实现
3.2.1 编码器的VHDL建模
图1 HDB3码编码器模型
如图所示:整个HDB3码的编码器包括3个功能部分:添加破坏符号“V”、添加符号“B”和单极性码转变成双极性码,各部分之间采用同步时钟作用,并且带有一个异步的复位(清零)端口。
3.2.2 基于VHDL编码器的实现
1. 添加破坏符号“V”的实现
添加破坏符号“V”模块的功能实际上就是对消息代码里的四个连0串的检测,即当出现四个连0串的时候,把第四个“0”变换成符号“V”,而在其他的情况下,则保持消息代码的原样输出,同时为了区别代码“1”、 “V”和“0”,在添加破坏符号“V”时,用“11”标识符号“V”,用“01”标识符号“1”,用“00”标识符号“0”。因此,添加破坏符号“V”的设计思想如下:首先判断输入的代码是什么,如果输入的符号是“0”码,则接着判断这是第几个“0”码,如果是第四个“0”码,则把这个“0”码变换成“V”码。在其他的情况下,让原码照常输出。程序流程图如图3.2所示:
图2 添加破坏符号“V”符号流程图
假设输入某信息序列,根据设计思想,输入代码一添加破坏符号“V”后的关系如下:
信息序列: 10000100001100011
添加破坏符号V后:010*********
2.添加符号“B”的实现
根据HDB3码的编码规则可知:添加破坏符号“V”模块的功能是为了保证附加“V”符号后的序列不破坏“极性交替反转”造成的无直流特性,即当相邻“V”符号之间有偶数个非0符号的时候,把后一小段的第一个“0”变换成一个非破坏符号——“B”符号。如图3.3所示。
其中:
① FIRSTV作为前面是否出现“11”即符号“V”的标志位,其中0表示前面没有出现V,1表示前面已经出现过符号V。
② COUNT1作为记非0符号的奇偶数,其中0表示为偶数,1表示为奇数。
③ FIRST_1遇1状态寄存器,1表示前面遇到过1,0表示没有遇到过。
④ 在本程序中用“10”来标识符号“B”。
⑤ 在本程序中用“01”来标识符号“1”。
⑥ 在本程序中用“00”来标识符号“0”。
⑦ 在本程序中用“11”来标识符号“V”。
图3 添加符号“B”符号流程图
3.3编码中单/双极性转换的实现
3.3.1单/双极性转换的流程图
根据HDB3码的编码规则,可知 “V”的极性是正负交替变换的,而余下的“1”和“B”本毕业设计把其看成为一体且是正负交替变换的,同时满足“V”的极性与前面的非零码极性一致。由此本设计就把“1”和“B”看成一组,而“V”单独作为一组来做正负交替变换。同时,已知“1”、 “V”,“B”已经分别用双相码“01”,“11”,“10”标识,所以对“1”,“V”, “B”的正负交替变换很容易实现。由此可得到程序流程图如图3.4、图3.5、图3.6所示。
图4 单双极性变换控制的程序流程图—“01”和“10”部分
图5 单双极性变换控制的程序流程图—“11”部分
图6 单双极性变换控制的程序流程图--“00”部分
其中在图中:①以01表示+1。②以11表示-1。③以00表示0。
3.4 HDB3码编码器完整源程序
--本程序在添加破坏符号V时用'11'表示'V',00表示0,01表示1
--添加符号B时用00表示0,01表示1,10表示B
--最终输出时是以11表示+1,00表示-1,10表示0
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
ENTITY ENHDB3 IS
PORT(CODEIN : IN STD_LOGIC;
CLK : IN STD_LOGIC;
CLR : IN STD_LOGIC;
CODEOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END ENTITY ENHDB3;
ARCHITECTURE RTL OF ENHDB3 IS
SIGNAL CODEOUTV: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL COUNT0: INTEGER:=0;
SIGNAL S0: STD_LOGIC_VECTOR(4 DOWNTO 0):="00000";
SIGNAL COUNT1: INTEGER RANGE 1 DOWNTO 0; --0表示在V之间有偶数个1,1表示在V之间有奇数个1
SIGNAL CODEOUTB: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL S1: STD_LOGIC_VECTOR(4 DOWNTO 0):="00000";
SIGNAL CLKB: STD_LOGIC;
SIGNAL S3: STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL FLAGOB: INTEGER RANGE 2 DOWNTO 0;
SIGNAL FLAGOV: INTEGER RANGE 2 DOWNTO 0;
SIGNAL FIRSTV: INTEGER RANGE 1 DOWNTO 0;
SIGNAL FIRST_1: STD_LOGIC;
SIGNAL COUNT0_S:STD_LOGIC;
COMPONENT DFF --调元件DFF,即D触发器
PORT(D: IN STD_LOGIC;
CLK: IN STD_LOGIC;
Q: OUT STD_LOGIC);
END COMPONENT DFF;
BEGIN
ADD_V: PROCESS(CLK,CLR) --添加破坏符号V程序
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(CLR='1')THEN
CODEOUTV<="00";
COUNT0<=0;
ELSE
CASE CODEIN IS
WHEN '1'=>CODEOUTV<="01"; --01表示1
COUNT0<=0;
WHEN '0'=>
IF(COUNT0=3)THEN
COUNT0_S<='1';
CODEOUTV<="11";
COUNT0<=0;
ELSE
COUNT0_S<='0';
COUNT0<=COUNT0+1;
CODEOUTV<="00";
END IF;
WHEN OTHERS=>
CODEOUTV<="00";
COUNT0<=COUNT0;
COUNT0_S<='0';
END CASE;
END IF;
END IF;
END PROCESS ADD_V;
S0(0)<=CODEOUTV(0);
S1(0)<=CODEOUTV(1);
DS11: DFF PORT MAP(S1(0),CLK,S1(1));
DS01: DFF PORT MAP(S0(0),CLK,S0(1));
DS12: DFF PORT MAP(S1(1),CLK,S1(2));
DS02: DFF PORT MAP(S0(1),CLK,S0(2));
DS13: DFF PORT MAP(S1(2),CLK,S1(3));
DS03: DFF PORT MAP(S0(2),CLK,S0(3)); --调元件DFF,即D触发器
BCLK: CLKB<=NOT CLK;
ADD_B: PROCESS(CLKB)
BEGIN
IF(CLKB'EVENT AND CLKB='1')THEN
IF(CODEOUTV="11")THEN
IF(FIRSTV=0)THEN
IF(FIRST_1='1')THEN
COUNT1<=0;
FIRSTV<=1;
S1(4)<=S1(3);
S0(4)<=S0(3);
ELSE
IF(COUNT0_S='1')THEN
FIRSTV<=1;
S1(4)<='1';
S0(4)<='0';
COUNT1<=0;
ELSE
COUNT1<=0;
FIRSTV<=1;
S1(4)<=S1(3);
S0(4)<=S0(3);
END IF;
END IF;
ELSE
IF(COUNT1=0)THEN --v之间的1为偶数
S1(4)<='1';
S0(4)<='0';
COUNT1<=0;
ELSE
S1(4)<=S1(3);
S0(4)<=S0(3);
COUNT1<=0;
END IF;
END IF;
ELSIF(CODEOUTV="01")THEN
IF(COUNT1=0)THEN
FIRST_1<='1';
COUNT1<=1;
S1(4)<=S1(3);
S0(4)<=S0(3);
ELSE
FIRST_1<='1';
COUNT1<=0;
S1(4)<=S1(3);
S0(4)<=S0(3);
END IF;
ELSE
COUNT1<=COUNT1;
S1(4)<=S1(3);
S0(4)<=S0(3);
END IF;
END IF;
END PROCESS ADD_B;
CODEOUTB<=S1(4)&S0(4);
OUTPUT: PROCESS(CLK) --01表示为+1,11表示为-1,00表示为0
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF((CODEOUTB="01") OR (CODEOUTB="10"))THEN --1/B
IF(FLAGOB=0)THEN
IF(FLAGOV=0)THEN
CODEOUT<="01";
FLAGOB<=1;
ELSIF(FLAGOV=1)THEN
CODEOUT<="11";
FLAGOB<=2;
ELSIF(FLAGOV=2)THEN
CODEOUT<="01";
FLAGOB<=1;
END IF;
ELSIF(FLAGOB=1)THEN
CODEOUT<="11";
FLAGOB<=2;
ELSIF(FLAGOB=2)THEN
CODEOUT<="01";
FLAGOB<=1; --判01/10
END IF; --FLAGOB/FLAGOV:0表示还未遇到V/B,1表示遇到奇数个V/B,2表示遇到偶数个V/B
ELSIF(CODEOUTB="11")THEN
IF(FLAGOV=0)THEN
IF(FLAGOB=0)THEN
CODEOUT<="01";
FLAGOV<=1;
ELSIF(FLAGOB=1)THEN
CODEOUT<="01";
FLAGOV<=1;
ELSIF(FLAGOB=2)THEN
CODEOUT<="11";
FLAGOV<=2;
END IF;
ELSIF(FLAGOV=1)THEN
CODEOUT<="11";
FLAGOV<=2;
ELSIF(FLAGOV=2)THEN
CODEOUT<="01";
FLAGOV<=1; --判V
END IF; --FLAGOB/FLAGOV:0表示还未遇到V/B,1表示遇到奇数个V/B,2表示遇到偶数个V/B
ELSE
CODEOUT<="00";
FLAGOB<=FLAGOB;
FLAGOV<=FLAGOV;
END IF;
END IF;
END PROCESS OUTPUT;
END ARCHITECTURE RTL;
3.5 HDB3码编码器的波形仿真及分析
图7 输入全 “0”时编码输出
图8 输入全“1”时编码输出
图9 输入“000000000000001000000……”时编码输出
图10 输入“100001000011000011000010” 时编码输出
由仿真波形可以得出:
CODEIN: 00000000000000000000……
CODEOUT:010*********……
CODEIN: 111111*********11111……
CODEOUT:0111011101110111011101110111011101110111……
CODEIN: 00000000000001000000……
CODEOUT:010*********……
CODEIN: 100001000011000011000010
CODEOUT:010*********
从图3.9~图3.12可知,其输出的代码与根据HDB3码编码原理算出来的代码完全一致,从码元的输入到编码输出的延迟为913.2ms,满足实时通信对延迟的要求。同时从QUARTUSⅡ上可以看出,编码器系统占用了75个逻辑单元,逻辑单元的占用率为7%,利用了5个芯片引脚,引脚的占用率为5%,对于存储单元的占用率为0,由此可知,此编码器的方案可行,系统资源的占用率低,有利以后为系统进行升级优化。
4、总结与心得
本次课程设计内容丰富,涉及的知识面较广。在设计前期,通过查找资料为设计准备,使我对所学专业方面的许多知识又温习了一遍,许多以前很模糊、很孤立的部分知识通过这次设计得以贯穿,而且掌握得更加地稳固了;此外,通过这次课程设计,在软件编程方面,使我了解到了自己的许多不足之处,通过查找参考资料和指导老师耐心的辅导,使我对使用VHDL语言有了一定的掌握。
但在设计过程中也出现了不少问题,设计前期在利用quartusⅡ软件工具对HDB3数字编码器的程序进行编译时,由于工程名和实体名不一致使得编译无法进行。
通过这次课程设计,我不仅加深了对通信原理理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
5、参考文献
[1] 樊昌信,张甫翎,徐炳祥,吴成柯.通信原理 国防工业出版社,2005.5
[2]王虹.通信系统原理 国防工业出版社,2014.8
[3] 谭会生,张昌凡.EDA技术及应用 西安科技大学出版社,2004.4
[4] 段吉海,黄智伟.基于CPLD/FPGA的数字通信系统建模与实现 电子工业出版社,2004.5
[5] 王乐毅.EDA设计技术与方法PLD与EDA工具 青岛化工学院学报,2001
[6] 林敏,方颖立.VHDL数字系统设计与高层次综合 信息时代,2002下载本文