《课程设计(论文)基于VHDL的HDB3编译码器的设计1.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于VHDL的HDB3编译码器的设计1.doc(18页珍藏版)》请在三一办公上搜索。
1、基于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码
2、的译码器仿真波形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周周一)整体下
3、载及测试(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个
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码编码器模
5、型如上图:整个HDB3码的编码器包括3个功能部分:添加破坏符号“V”、添加符号“B”和单极性码转变成双极性码。信号处理的顺序不能像编码规则那样:首先把代码串变换成为AMI码,完成添加破坏符号“V”、添加符号“B”工作之后,其后的“+1”和“-1”的极性还要依据编码规则的规定变换。这样做需要大量的寄存器,同时电路结构也变得复杂。因此本设计在此处把信号处理的顺序变换一下:首先完成添加破坏符号“V”工作,接着执行添加符号“B”功能,最后实现单极性变双极性的信号输出。这样做的好处是输入进来的信号和添加破坏符号“V”、添加符号“B”功能电路中处理的信号都是单极性信号,且需要的寄存器的数目可以很少。另外,
6、如何准备识别电路中的“1”、“V”和“B”,这也是一个难点,因为“V”和“B”符号是人为标识的符号,但在电路中最终的表示形式还是逻辑电平“1”,同时QUARTUS软件也不能像HDB3码的编码规则那样把代码串变换成AMI码,这是因为QUARTUS软件不能处理带负号的信号,因此在软件中本设计还是利用双相码来表示。双相码的编码规则如下:对每个二进制代码分别利用两个不同相位的二进制代码去取代。例如:信息序列:110010双相码: 010100000100 6.2.1 插V模块的实现 添加破坏符号“V”模块的功能实际上就是对消息代码里的四个连0串的检测,即当出现四个连0串的时候,把第四个“0”变换成符号
7、“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”功能
8、的关键代码,具体程序见附录一 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 p
9、rocess add_v;这个程序设计了一个计算器(count0),用来作为应插V符号的标志。在进程(process)中,通过条件控制开关(case语句)完成插V功能。这里使用了一个技巧来实现流程的控制,即再选择语句(case语句)中嵌套了条件判断语句(if语句)来控制双重条件判断的执行结果。假设输入一串代码,根据设计思想,输入代码与插入V符号之后的关系如下:6.2.2插B模块的实现插“B”模块的功能是为了保证附加“V”符号后的序列不破坏“极性交替反转”造成的无直流特性,即当相邻“V”符号之间有偶数个非0符号的时候,把后一小段的第一个“0”变换成一个非破坏符号“B”符号。如图6.3为实现插B符
10、号的流程图。 图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
11、); 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
12、-用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位的移位寄存器里,再
13、同步时钟的作用下,同时进行是否插B的判决,等到码元重移位寄存器里出来的时候,就可以决定是应该变换成B符号,还是照原码输出。因此,再程序的结果中进行元件声明(Component Declaration),调用库里的D触发器来实现延迟作用。为了使程序更清晰,用了元件例化语句(Compoment Instantiation),来说明信号的流向。要进行插B判决,首先要知道哪一个是V,从前面的程序中了解到,V已经用11代替,1用01取代,从这里就表现出采用双相码的优点,它轻易地解决了V和1的差别。根据这个设计思想,输入代码与插B后的代码关系如下:6.2.3 编码中单/双极性转换的实现根据HDB3码的编码
14、规则,可知 “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; fl
15、ag1b=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所示)
16、 图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和
17、扣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码
18、检测模块 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
19、扣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码的译码器仿真波形七
20、、参考文献 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 down
21、to 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):=0
22、0000;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;
23、 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 ca
24、se; 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),
25、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(c
26、odeoutv=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; fl
27、ag1b=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_unsig
28、ned.all; entity hdb3_decode is port(out0:in std_logic; out1:in std_logic; clock:in std_logic;data_out:out std_logic ); end hdb3_decode; architecture rtl of hdb3_decode is signal reg0:std_logic_vector(4 downto 0); signal reg1:std_logic_vector(4 downto 0);begin process(clock) beginif rising_edge(clock
29、)then if out1=1 and out0=0 and reg0(4 downto 1)=0001 and reg1(4 downto 1)=0000 then reg0=00001; reg1=00000; elsif out1=1 and out0=1 and reg0(4 downto 1)=0001 and reg1(4 downto 1)=0001 then reg0=00001; reg1=00000; elsif out1=1 and out0=1 and reg0(4 downto 2)=001 and reg1(4 downto 2)=001 then reg0=000
30、0®0(1); reg1=0000®1(1); elsif out1=1 and out0=0 and reg0(4 downto 2)=001 and reg1(4 downto 2)=000 then reg0=0000®0(1); reg1=0000®1(1); else reg0=out1®0(4 downto 1);reg1=out0®1(4 downto 1); end if; end if; end process; process(clock) begin if rising_edge(clock) then if reg0(0)=1 or reg1(0)=1 then data_out=1; else data_out=0; end if; end if; end process; end rtl;