用VHDL语言设计HDB3编码器.docx

上传人:b****5 文档编号:8049654 上传时间:2023-01-28 格式:DOCX 页数:11 大小:169.31KB
下载 相关 举报
用VHDL语言设计HDB3编码器.docx_第1页
第1页 / 共11页
用VHDL语言设计HDB3编码器.docx_第2页
第2页 / 共11页
用VHDL语言设计HDB3编码器.docx_第3页
第3页 / 共11页
用VHDL语言设计HDB3编码器.docx_第4页
第4页 / 共11页
用VHDL语言设计HDB3编码器.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

用VHDL语言设计HDB3编码器.docx

《用VHDL语言设计HDB3编码器.docx》由会员分享,可在线阅读,更多相关《用VHDL语言设计HDB3编码器.docx(11页珍藏版)》请在冰豆网上搜索。

用VHDL语言设计HDB3编码器.docx

用VHDL语言设计HDB3编码器

1.VHDL语言概述1

2.HDB3码介绍2

2.1AMI码2

2.2HDB3码2

2.3HDB3编码规则3

3.用VHDL语言设计HDB3编码器5

3.1HDB3编码器实现的基本原理5

3.2HDB3编码器的设计过程6

3.2.1插“V”模块的实现6

3.2.2插“B”模块的实现7

3.2.3单极性变双极性的实现8

3.3HDB3编码仿真调试9

3.4生成模块10

5.课设心得11

参考文献12

附录A13

本科生课程设计成绩评定表15

1.VHDL语言概述

VHDL的全名是very-high-speedintegratedcircuithardwaredescriptionlanguage,诞生与1982年。

1987年底VHDL被IEEE和美国国防部确认为标准硬件描述语言。

自IEEE发布了HDL标准版本后,各EDA公司相继推出了自己的VHDL实际环境,或宣布自己的程序可以和VHDL接口。

此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。

1993年,IEEE对VHDL进行了修正,从更高的抽象层次和系统描述能力扩展VHDL的内容。

现在,VHDL和VERILOG作为IEEE的工业硬件描述语言,又得到了众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。

VHDL主要用于描述数字系统的结构,行为,功能和接口。

除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。

VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。

在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。

这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

2.HDB3码介绍

数字基带信号的传输是数字通信系统的重要组成部分之一。

在数字通信中,有些场合可不经过载波调制和解调过程,而对基带信号进行直接传输。

为使基带信号能适合在基带信道中传输,通常要经过基带信号变化,这种变化过程事实上就是编码过程。

于是,出现了各种各样常用码型。

不同码型有不同的特点和不同的用途。

作为传输用的基带信号归纳起来有如下要求:

1希望将原始信息符号编制成适合与传输用的码型;2对所选码型的电波形,希望它适宜在信道中传输。

可进行基带传输的码型较多。

2.1AMI码

AMI码称为传号交替反转码。

其编码规则为代码中的0仍为传输码0,而把代码中1交替地变化为传输码的+1-1+1-1,、、、。

举例如下。

消息代码:

01110010、、、

AMI码:

0+1-1+100-10、、、或

0-1+1-100+10、、、

AMI码的特点:

(1)无直流成分且低频成分很小,因而在信道传输中不易造成信号失真。

(2)编码电路简单,便于观察误码状况。

(3)由于它可能出现长的连0串,因而不利于接受端的定时信号的提取。

2.2HDB3码

这种码型在数字通信中用得很多,HDB3码是AMI码的改进型,称为三阶高密度双极性码。

它克服了AMI码的长连0传现象。

NRZ,AMI,HDB3码之间的对应关系:

假设信息码为0000011000010000,对应的NRZ码、AMI码,HDB3码如图所示。

图1NRZ,AMI,HDB3码型图

分析表现,AMI码及HDB3码的功率谱不含有离散谱fS成份(fS=1/TS,等于位同步信号频率)。

在通信的终端需将他们译码为NRZ码才能送给数字终端机或数/模转换电路。

在做译码时必须提供位同步信号。

工程上,一般将AMI或HDB3码数字信号进行整流处理,得到占空比为0.5的单极性归零码(RZ|τ=0.5TS)。

由于整流后的AMI,HDB3码中含有离散谱fS,故可用一选频网络得到频率为fS的正弦波,经整形、限幅、放大处理后即可得到位同步信号。

2.3HDB3编码规则

(1)将消息代码变换成AMI码;

(2)检查AMI码中的连0情况,当无4个以上的连0传时,则保持AMI的形式不变;若出现4个或4个以上连0时,则将1后的第4个0变为与前一非0符号(+1或-1)同极性的符号,用V表示(+1记为+V,-1记为-V

(3)检查相邻V符号间的非0符号的个数是否为偶数,若为偶数,则再将当前的V符号的前一非0符号后的第1个0变为+B或-B符号,且B的极性与前一非0符号的极性相反,并使后面的非0符号从V符号开始再交替变化。

HDB3码的特点如下:

(1)基带信号无直流成分,且只有很小的低频成分;

(2)连0串符号最多只有3个,利于定时信息的提取;

(3)不受信源统计特性的影响。

HDB3编码举例如下:

图2HDB3编码实例

3.用VHDL语言设计HDB3编码器

设计要求:

掌握HDB3码的编码原理,设计通信系统框图,画出实现电路原理图,编写VHDL语言程序,上机调试、仿真,记录实验结果波形,对实验结果进行分析。

3.1HDB3编码器实现的基本原理

从编码规则来分析,这个设计的难点之一是如何判决是否应该插“B”,因为这涉及到由现在事件的状态决定过去事件状态的问题。

按照实时信号处理的理论,这是没办法实现的。

但在实际的电路中,可以考虑用寄存器的方法,首先把信码寄存在寄存器里,同时设置一个计数器计数两个“V”之间“1”的个数,经过4个码元时间后,由一个判偶电路来给寄存器发送是否插“B”的判决信号,从而实现插“B”功能。

不过,信号处理的顺序不能像编码规则那样:

首先把代码串变换成为AMI码,完成插“V”、插“B”工作之后,其后的“+1”和“-1”的极性还要依据编码规则的规定变换。

这样做需要大量的寄存器,同时电路结构也变的复杂。

若把信号处理的顺序变换一下:

首先完成插“V”工作,接着执行插“B”功能。

最后实现单极性变双极性的信号输出。

这样做的好处是:

输入进来的信号和插“V”、插“B”功能电路中处理的信号都是单极性信号,且需要的寄存器的数目可以少很多。

另外,如何准确识别电路中的“1”、“V”和“B”。

因为“V”和“B”符号是人为标识的符号,但在电路中最终的表现形式还是逻辑电平“1”。

解决的方法是利用了双相码,将其用二进制码去取代。

例如

代码:

110010

双相码101001011001

这样就可以识别电路中的“1”、“V”、“B”。

也可以人为地加入一个标识符(其最终目的也是选择输出“1”的极性)。

控制一个选择开关,使输出“1”的极性能按照编码规则进行变化。

3.2HDB3编码器的设计过程

图3HDB3编码设计流程

整个HDB3编码器包含3个功能部分:

插“V”、插“B”和单极性码转变成双极性码。

下面将详细介绍各个部分的设计流程、编写的源程序模拟仿真的波形图。

3.2.1插“V”模块的实现

(1)插“V”模块的建模

插“V”模块的功能实际上就是对消息代码里的四连0串的检测即当出现四个连0串的时候,把第四个“0”变换成为符号“V”(即将其置“1”,先不考虑符号问题),而在其他情况下,则保持消息代码的原样输出。

插“V”符号的设计思想很简单:

首先判断输入的代码是什么(用一个条件语句判断),如果输入的是“0”码,则接着判断这是第几个“0”码,则把这一位码元变换成为“V”码。

在其他条件下,让原代码照常输出。

(2)插”V”模块的程序设计

如前考虑,插”V”模块须加入一个变量enjudge,用来作为插”V”符号的标志。

在进程(process)中,通过if语句完成插”V”功能。

假设输入一串代码,根据设计思想,输入代码与插入”V”符号之后的关系如下:

代码:

1000010000110000

插V后:

1000110001110001

图4插“V”流程图

3.2.2插“B”模块的实现

插“B”模块的功能是保证附加“V”符号后的序列不破坏“极性交替反转”造成的无直流特性,即当相邻“V”符号之间有偶数个非0符号的时候,把后一小段的第1个“0”变换成一个非破坏符号——“B”符号。

插“B”模块是这个设计遇到的第一个难点,因为他涉及到一个由现在事件的状态决定过去状态的的问题。

其中还有如何确定是“1”,还是“V”的问题。

处理难点的思路是:

首先把码元(经插“V”处理过的)放入一个4位的移位寄存器里,在同步时钟的作用下,同时进行是否插“B”的判决,等到码元从寄存器里出来的时候,就可以决定是应该变换成“B”符号,还是照原码输出。

要进行插“B”判决,首先要知道哪一个是“V”,此时之前的插“V”判断符号起了作用(enjudge)。

由于标志量与输出量有延时,此时加了一个记录“V”位置的计数器,插“V”后开始计数,用以记录“V”。

再有奇偶判断标志(parity)决定是否插“B”。

在进程中利用if语句判断输出极性与符号。

图5插“B”流程图

3.2.3单极性变双极性的实现

根据HDB3的编码规则,我们可以知道,“V”的极性是正负交替的,余下的“1”和“B”看成一体且是正负交替的,同时满足“V”的极性与前面的非零码极性一致。

由此我们可以将其分别进行极性变换来实现。

根据编码规则,“B”符号的极性与前一非零符号相反,“V”极性符号与前一非零符号一致。

因此将“V”单独拿出来进行极性变换,余下的“1”和“B”看成一体进行正负交替,这样就完成了HDB3的编码。

这个部分遇到的难点在于:

在MaxplusⅡ软件仿真过程中,它无法识别“-1”,在它的波形仿真中只有“1”和“0”。

因此在这里采用了双相码来分别表示“-1”、“+1”、“0”程序中所定义的“00”、“01”、“11”代表0、+1、-1,从而达到设计所需结果。

3.3HDB3编码仿真调试

全“1”码输入:

图6“+1”和“-1”交替

此时为全“1”码输入。

不存在插“V”插“B”的判断,输出结果为“01”“11”的交替即双极性码的“+1”“-1”的交替,由此可指此部分的程序运行符合要求。

全“0”码输入:

图7“B00V”输出

由于是全“0”码输入,奇偶判断符的结果都是偶,输出结果为“B00V”,“B”极性与前面的非零符号相反,“V”与对应的“B”符号相同,可验证程序运行符合要求。

输入码随机:

一路信码经过插V补B后的输出波形仿真图,输出相对与输入延时了5个脉冲周期。

data_out表示二位二进制码输出,默认‘01’为+1,‘11’位-1。

CLOCK为时钟脉冲信号。

图8HDB3码输出

输入为:

111111000000001110000

输出为:

11011101110111001101000111011100001

此时的输出符合HDB3编码规则,可验证程序整体符合要求,输出正确。

3.4生成模块

利用MaxplusⅡ本身的功能,将运行正确的VHDL程序保存,并生成模块,保存顶层文件,得到hdb3_coding1.gcf文件。

图9生成模块

添加波形仿真文件验证模块功能:

图10模块波形输出

根据波形

输入为:

100000000011000011

输出为:

11000110100010011011100110111

编码输出正确,符合HDB3编码,验证得模块文件符合要求,此次课程设计成功。

5.课设心得

通过一步步有条不紊的分析和思考,更重要的是在设计中,根据实际情况,对设计初期的思想做不断完善和改进,因为在设计之前的思路,只能说是一个大体的方向,很多时候,实际的操作和设计要细致和复杂的多,或者原来的想法根本就行不通,得从实际设计的角度一步步来完成了这样一个系统设计。

通过这次课程设计,让我学到了很多知识,也获得很多体会,这是自己将平日学的理论知识应用到实际操作中的一次很好的实践。

才明白:

实际操作和设计,并不是像学习理论知识那么简单,会理论不等于就会应用,很多都是经验的东西,需要在自己的努力设计中才能慢慢体会到,设计多了,才会经验中找到设计自如的感觉。

就像我,对于VHDL语言,开始也没有什么太大的感觉,看书的时候,很清楚明白它的设计结构和流程是什么样的,但是一旦抛开书本,开始自己编程序的时候,不是这里忘了定义,就是那里忘了结构方式;但是,到了现在,在不断实践编程中,程序设计的流程和一些要注意的地方,我都记得很清楚,能很容易的编写一段简单的程序了,也不用看书本帮忙了,这些都是光靠看书本得不到的经验,是我最大的收获。

虽然说,整个系统还存在很多不足,但是,我也并不感到有太多的遗憾,因为面对自己三个月的辛勤劳动的成果,心里更多的还是万分喜悦!

不足之处总是有的,这些就是自己今后需要努力的地方,只要不断的朝着自己的目标的努力,很快就会有解决的那一天!

附录A

基于VHDL语言HDB3编码程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityhdb3_codingis

port(data_in:

instd_logic;

clock:

instd_logic;

data_out:

outstd_logic_vector(1downto0));

endhdb3_coding;

architecturertlofhdb3_codingis

signalreg:

std_logic_vector(3downto0);

signalparity:

std_logic;--记录破坏点间1码个数的奇偶性

signaljudge_v:

std_logic;--判断是否有破坏符

signalgrant_cnt:

std_logic;--允许开始计算破坏点间的1码个数

signallast_sign:

std_logic;--上一输出的符号

signalv_cnt:

std_logic_vector(2downto0);--v点位置跟踪计数器

begin

process(clock)--移位寄存器,插V

begin

ifrising_edge(clock)then

ifdata_in='0'andreg(3downto1)="000"then

reg<=('1'®(3downto1));judge_v<='1';grant_cnt<='1';

elsereg<=data_in®(3downto1);judge_v<='0';grant_cnt<='0';

endif;

endif;

endprocess;

process(clock)--计数

begin

ifrising_edge(clock)then

ifgrant_cnt='1'anddata_in='0'thenparity<='0';

elsifgrant_cnt='1'anddata_in='1'thenparity<='1';

elsifdata_in='1'thenparity<=notparity;

endif;

endif;

endprocess;

process(clock)--V点跟踪

begin

ifrising_edge(clock)then

ifjudge_v='1'thenv_cnt<="000";

elsifv_cnt="111"thenv_cnt<=v_cnt;

elsev_cnt<=v_cnt+1;

endif;

endif;

endprocess;

process(clock)--编码输出

begin

ifrising_edge(clock)then

ifreg(0)='1'then

ifv_cnt<="010"then

iflast_sign='1'thendata_out<="11";

elsedata_out<="01";

endif;

elsiflast_sign='1'thendata_out<="01";last_sign<=notlast_sign;

elsiflast_sign='0'thendata_out<="11";last_sign<=notlast_sign;

endif;

elsifjudge_v='1'andparity='0'then

iflast_sign='1'thendata_out<="01";last_sign<=notlast_sign;

elsedata_out<="11";last_sign<=notlast_sign;

endif;

elsedata_out<="00";

endif;

endif;

endprocess;

endrtl;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1