课程设计(论文)-基于VHDL的HDB3编译码器的设计1.doc_第1页
课程设计(论文)-基于VHDL的HDB3编译码器的设计1.doc_第2页
课程设计(论文)-基于VHDL的HDB3编译码器的设计1.doc_第3页
课程设计(论文)-基于VHDL的HDB3编译码器的设计1.doc_第4页
课程设计(论文)-基于VHDL的HDB3编译码器的设计1.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于vhdl的hdb3编译码器的设计 专业: 姓名: 班级: 学号: 2011-12 目录一、设计课题:2二、设计任务及要求:2三、使用设备2四、设计时间安排:2五、基本原理2六、hdb3码的编、译码器的建模与实现36.1 hdb3码的编码规则36.2 基于vhdl的编码器的建模及实现3 6.2.1 插v模块的实现4 6.2.2插b模块的实现5 6.2.3 编码中单/双极性转换的实现8 6.2.4 单/双极性转换的硬件实现9 6.2.5 hdb3码的编码器仿真波形106.3 基于vhdl的译码器的建模及实现11 6.3.1 v码检测模块11 6.3.2 扣v扣b模块12 6.3.3 hdb3码的译码器仿真波形13七、参考文献13八、附录138.1 附录一 hdb3码编码器程序138.2 附录二 hdb3码译码器程序16一、设计课题:基于vhdl的hdb3编译码器的设计二、设计任务及要求:1用vhdl进行hdb3编译码器的建模与设计,完成程序设计、波形仿真与 下载测试。2. 正确实现hdb3编译码(双极性电平可用二进制代码表示)。3. 码元速率可调。(选做)三、使用设备计算机、eda软件、eda实验箱。四、设计时间安排: 分析课题,完成编译码器的vhdl建模(16周周四周五);编码器的vhdl编程与仿真(17周周一至周三)译码器的vhdl编程与仿真(17周周四周五,18周周一)整体下载及测试(18周周二)。设计总结及报告(18周周三)。五、基本原理1、hdb3码是数字基带传输中常用的码型,具有无直流分量,低频成分少, 在有长连0串时也能提取同步信号,缺点是编译码电路较复杂。 2、利用vhdl进行hdb3编译码器的建模与设计,并通过cpld/fpga来实现, 能较好简化电路设计。六、hdb3码的编、译码器的建模与实现 6.1 hdb3码的编码规则 hdb3码是ami码的改进型,称为三阶高密度双极性码,它克服了ami码的长连0串现象。hdb3码的编码规则为先检查消息代码(二进制)的连0串,若没有4个或4个以上连0串,则按照ami码的编码规则对消息代码进行编码;若出现4个或4个以上连0串,则将每4个连0小段的第4个0变换成与前一非0符号(+1或-1)同极性的v符号,同时保证相邻v符号的极性交替(即+1记为+v,-1记为-v);接着检查相邻v符号间非0符号的个数是否为偶数,若为偶,则将当前的v符号的前一非0符号后的第1个0变为+b或-b符号,且b的极性与前一非0符号的极性相反,并使后面的非0符号从v符号开始再交替变化。 6.2 基于vhdl的编码器的建模及实现对信号进行hdb3码编码时,先依据hdb3码的编码规则进行添加破坏符号“v”然后进行添加符号“b”操作,最后才进行单极性信号变成双极性信号的转换。hdb3码的编码模型如图3.1所示。图 6.1 hdb3码编码器模型如上图:整个hdb3码的编码器包括3个功能部分:添加破坏符号“v”、添加符号“b”和单极性码转变成双极性码。信号处理的顺序不能像编码规则那样:首先把代码串变换成为ami码,完成添加破坏符号“v”、添加符号“b”工作之后,其后的“+1”和“-1”的极性还要依据编码规则的规定变换。这样做需要大量的寄存器,同时电路结构也变得复杂。因此本设计在此处把信号处理的顺序变换一下:首先完成添加破坏符号“v”工作,接着执行添加符号“b”功能,最后实现单极性变双极性的信号输出。这样做的好处是输入进来的信号和添加破坏符号“v”、添加符号“b”功能电路中处理的信号都是单极性信号,且需要的寄存器的数目可以很少。另外,如何准备识别电路中的“1”、“v”和“b”,这也是一个难点,因为“v”和“b”符号是人为标识的符号,但在电路中最终的表示形式还是逻辑电平“1”,同时quartus软件也不能像hdb3码的编码规则那样把代码串变换成ami码,这是因为quartus软件不能处理带负号的信号,因此在软件中本设计还是利用双相码来表示。双相码的编码规则如下:对每个二进制代码分别利用两个不同相位的二进制代码去取代。例如:信息序列:110010双相码: 010100000100 6.2.1 插v模块的实现 添加破坏符号“v”模块的功能实际上就是对消息代码里的四个连0串的检测,即当出现四个连0串的时候,把第四个“0”变换成符号“v”(“v”可以是逻辑电平“1”),而在其他的情况下,则保持消息代码的原样输出,同时为了区别代码“1”、 “v”和“0”,在添加破坏符号“v”时,用“11”标识符号“v”,用“01”标识符号“1”,用“00”标识符号“0”。因此,添加破坏符号“v”的设计思想如下:首先判断输入的代码是什么,如果输入的符号是“0”码,则接着判断这是第几个“0”码,如果是第四个“0”码,则把这个“0”码变换成“v”码。在其他的情况下,让原码照常输 图6.2插v符号的流程图出。程序流程图如图6.2所示: 根据图6.2的思想,完成hdb3码编码的程序实现添加破坏符号“v”功能的程序,以下给出实现添加破坏符号“v”功能的关键代码,具体程序见附录一 add_v:process(clk,clr) -插入v符号进程 begin if(rising_edge(clk) then if(clr=1) then codeoutv=00; -用00代表0 count0 codeoutv=01; -用01代表1 count0 if(count0=3)then -当有4个连续0时插入v codeoutv=11; -用11代表v count0=0; else count0=count0+1; codeoutv codeoutv=00; count0=count0; end case; end if; end if; end process add_v;这个程序设计了一个计算器(count0),用来作为应插v符号的标志。在进程(process)中,通过条件控制开关(case语句)完成插v功能。这里使用了一个技巧来实现流程的控制,即再选择语句(case语句)中嵌套了条件判断语句(if语句)来控制双重条件判断的执行结果。假设输入一串代码,根据设计思想,输入代码与插入v符号之后的关系如下:6.2.2插b模块的实现插“b”模块的功能是为了保证附加“v”符号后的序列不破坏“极性交替反转”造成的无直流特性,即当相邻“v”符号之间有偶数个非0符号的时候,把后一小段的第一个“0”变换成一个非破坏符号“b”符号。如图6.3为实现插b符号的流程图。 图6.3 插b符号流程图 上图中插b模块式这个设计遇到的一个难点,因为它涉及到一个由现在事件的状态决定过去事件状态的问题。其次还有如何确定是1,还是v的问题。重下列程序中可以看到我们是如何解决这一难题的。 以下给出添加符号“b”模块的部分程序,完整的程序见附录一。 s0(0)=codeoutv(0); s1(0)=codeoutv(1); ds11: dff port map(s1(0),clk,s1(1);-调用库中的d触发器来实现延迟作用 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); bclk: clkb=not clk; add_b:process(clkb) -插入符号b进程 begin if(rising_edge(clkb) then if(codeoutv=11) then if(firstv=0) then count1=0; firstv=1; s1(4)=s1(3); s0(4)=s0(3); else if(count1=0) then -用10代表b 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 count1=count1+1; s1(4)=s1(3); s0(4)=s0(3); else s1(4)=s1(3); s0(4)=s0(3); count1=count1; end if; end if; end process add_b; codeoutb=s1(4)&s0(4);处理难点的思路是:首先把码元(经插v处理过的)放入一个4位的移位寄存器里,再同步时钟的作用下,同时进行是否插b的判决,等到码元重移位寄存器里出来的时候,就可以决定是应该变换成b符号,还是照原码输出。因此,再程序的结果中进行元件声明(component declaration),调用库里的d触发器来实现延迟作用。为了使程序更清晰,用了元件例化语句(compoment instantiation),来说明信号的流向。要进行插b判决,首先要知道哪一个是v,从前面的程序中了解到,v已经用11代替,1用01取代,从这里就表现出采用双相码的优点,它轻易地解决了v和1的差别。根据这个设计思想,输入代码与插b后的代码关系如下:6.2.3 编码中单/双极性转换的实现根据hdb3码的编码规则,可知 “v”的极性是正负交替变换的,而余下的“1”和“b”看成为一体且是正负交替变换的,同时满足“v”的极性与前面的非零码极性一致。由此把“1”和“b”看成一组,而“v”单独作为一组来做正负交替变换。流程图如图6.4所示。 图6.4 单/双极性转换流程图程序如下: output:process(clk) -单极性变双极性进程 begin if(rising_edge(clk) then if(codeoutb=01)or(codeoutb=10)then -1 or b if(flag1b=1) then codeout=11; flag1b=0; else codeout=01; flag1b=1; end if; elsif(codeoutb=11) then -v if(flag1b=1) then codeout=01; else codeout=11; end if; else codeout=00; flag1b=flag1b; end if; end if;6.2.4 单/双极性转换的硬件实现以上程序输出结果并不是+1、-1、0的多电平变化波形,而是单极性双电平信号。事实上,以上程序输出的是给单/双极性转换的硬件电路地址信号。利用一个四选一的数据选择器cd74hc4052(图6.5),可以再输出端得到符合规则的+1、-1、0变化波形。(选择器特性如表6.1所示) 图6.5 cd74hc4052引脚图表6.1 cd74hc4052的da转换特性图6.2.5 hdb3码的编码器仿真波形6.3 基于vhdl的译码器的建模及实现根据hdb3码的编码规则,v脉冲的极性必然和前面非0脉冲的极性一致。而当无v脉冲时,hdb3码的脉冲是“+1”和“-1”交替变换出现的。而当连续出现两个“+1”或“-1”时,若无误码时,则可知后一个一定是v脉冲。因而可从所接收的信码中找到v码,然后根据加取代节的原则,在v码前面的三位代码必然是取代码,在译码时,需要全部复原为四个连“0”。只要找到v码,不管v码前面两个码元是“0”码,还是3个“0”码,只要把它们一律清零,就完成了扣v和扣b的功能,进而得到原来的二元信码序列。因此可实现hdb3码译码的模型如图6.6所示:图6.6 hdb3码译码器模型如图6.6所示,双/单极性变换电路由两个正负整流电路组成。正整流电路提取正电平码部分,负整流电路提取负电平部分。v码检测电路包括+v码检测和-v码检测两部分。根据编码规则,v脉冲必然是同极性脉冲。当无v脉冲时,传号脉冲+1和-1交替出现。当连续出现两个+1或-1是,若无误码,则后一个一定是v脉冲。时钟提取电路用于提取同步时钟。扣v扣b电路再v脉冲和同步时钟的控制下,完成扣v扣b的功能。由于双/单极性变换电路涉及到双极性信号,无法在fpga中实现,需加外围硬件电路。6.3.1 v码检测模块 1)+v码检测 设从正整流电路输出的信号为+b,从负整流电路输出的信号为b。+v码检模块-b的控制下,对输入的+b进行检测。当+b的上升沿到来时,对输入的+b脉冲进行计数,当计数值等于2时,输出一个脉冲作为+v脉冲,同时计数器清零,而且在计数期间,一旦有-b信号为1电平时,立即对计算器清零,计算器从新重零开始计数。这是因为在两个+b脉冲之间存在-b脉冲再hdb3码中,是真正同极性的,于是就可以判定第二个+b脉冲实际上是+v码,达到检测+v码的目的。如图6.7 图6.7 +v码检测模型2)-v码检测-v码检测原理同+v码检测原理相似。如图6.8 图6.8 -v码检测模型6.3.2 扣v扣b模块用v码检测模块所检测出的v码信号,去控制一个移位寄存器,若未碰到v脉冲,则整流输出合成信号再时钟的节拍下,顺利通过移位寄存器,当碰到有v脉冲时,该v脉冲讲使移位寄存器清零。考虑到四个连0,即v脉冲及其前面的三个码元应为0码,所以,可设置四位的移位寄存器,当v码清零时,同时将移位寄存器中的四位码全变为0。不管是否有b脉冲,在此模块中,一并清零,因而无需另设扣b电路。另外移位四位寄存器起到延时四位时钟周期的作用,以使所检测出的v脉冲与信号流中的v脉冲位置对齐,保证清零的准确性。扣v扣b模块的框图如图6.9. 图6.9 扣v扣b模块 译码器程序见附录二6.3.3 hdb3码的译码器仿真波形七、参考文献 1.eda技术实用教程潘松 科学出版社 2.基于cpld/fpga的数字通信系统建模与设计段吉海电子工业出版社八、附录 8.1 附录一 hdb3码编码器程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hdb3 isport(codein: in std_logic; clk : in std_logic;clr : in std_logic; hdb3 : out std_logic_vector(1 downto 0); codeout1: out std_logic;codeout2:out std_logic);end hdb3;architecture rtl of hdb3 issignal codeout: std_logic_vector(1 downto 0);signal count0 : integer:=0;signal codeoutv: std_logic_vector(1 downto 0);signal s0 : std_logic_vector(4 downto 0):=00000;signal s1 : std_logic_vector(4 downto 0):=00000;signal clkb : std_logic;signal count1 : integer range 1 downto 0;signal codeoutb: std_logic_vector(1 downto 0);signal flagv : integer range 1 downto 0;signal firstv : integer range 0 to 1;signal flag1b : integer range 1 downto 0;component dff -调用元件dff port (d : in std_logic; clk : in std_logic; q : out std_logic);end component;begin add_v:process(clk,clr) -插入v符号进程 begin if(rising_edge(clk) then if(clr=1) then codeoutv=00; -用00代表0 count0 codeoutv=01; -用01代表1 count0 if(count0=3)then -当有4个连续0时插入v codeoutv=11; -用11代表v count0=0; else count0=count0+1; codeoutv codeoutv=00; count0=count0; 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); -调用库中的d触发器来实现延迟作用 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); bclk: clkb=not clk; add_b:process(clkb) -插入符号b进程 begin if(rising_edge(clkb) then if(codeoutv=11) then if(firstv=0) then count1=0; firstv=1; s1(4)=s1(3); s0(4)=s0(3); else if(count1=0) then -用10代表b 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 count1=count1+1; s1(4)=s1(3); s0(4)=s0(3); else s1(4)=s1(3); s0(4)=s0(3); count1=count1; end if; end if; end process add_b; codeoutb=s1(4)&s0(4); output:process(clk) -单极性变双极性进程 begin if(rising_edge(clk) then if(codeoutb=01)or(codeoutb=10)then -1 or b if(flag1b=1) then codeout=11; flag1b=0; else codeout=01; flag1b=1; end if; elsif(codeoutb=11) then -v if(flag1b=1) then codeout=01; else codeout=11; end if; else codeout=00; flag1b=flag1b; end if; end if;hdb3=codeout; end process output; end rtl; 8.2 附录二 hdb3码译码器程序library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity hdb3_decode is port(out0:in std_logic; out1:in std_logic; cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论