HDB3码编码器及解码器verilog代码编程及实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

通信原理基带信号的选择:AMI码HDB3码HDB3码保持了AMI码的优点,克服了AMI码在遇到连“0”长时难以提取定时信息的困难,因而获得广泛应用。HDB3码编码规则*HDB3码为3阶高密度双极性码,其编码规则为:*1将消息代码转换为AMI码;*2检查AMI码中连“0”的情况,出现4个或4个以上连“0”时,将第4个“0”变为与前一个非“0”符号同极性的符号,用“V”标识(+V和-V);*3、检查相邻V符号之间非“0”符号是否为偶数,如果为偶数,则将当前V符号前一个非“0”符号后的第一个“0”变为“B”,”B”的极性与前一个非”0“符号相反,并使“V”后的非“0”符号从“V”开始再交替变化。*编码器实现:*在实际电路设计时,先在纯粹的数字电路下完成插“V”的操作,再完成插“B”的操作;然后再将单极性变成双极性。这样可以在数字电路中实现,且降低寄存器需求。*因为“V”、“B”是认为标识的符号,所以在具体电路中,需做以下替换:0-00,1-01,V-11,B-10。设计步骤:*插“V”的实现:*1、设置连“0”计数器,复位为0;*2、对输入信号进行判断,如果为1则计数器复位,且输出“01”;*3、如果为“0”,则对“0”进行计数,如果计数值不为4,则输出“00”;*4、如果计数值为“4”,则计数器复位,同时输出为“11”。*moduleadd_v(data_in,clk,data_out);*inputdata_in;*inputclk;*output[1:0]data_out;*reg[1:0]data_out;*regcounter;*always@(posedgeclk)*if(data_in==1'b1)begincounter=0;data_out=2'b01;end*else*begin*counter=counter+1;*if(counter==3)begindata_out=2'b11;counter=0;end*elsebegindata_out=2'b00;end*end*endmodule*RTL图DQPREENACLRdata_out[1..0]~reg01'h0--data_inclkdata_out[1..0]图(1)插V模块波形仿真(clk:时钟信号;data_in:输入数据;data_out:输出数据)*插“B”的实现:*1、设置对“01”的计数器counter为0,设置对“11”的计数器firstV为0;*2、对输入进行判断,如果为“01”,则counter加1,仍然输出“01”;*3、如果输入为“00”,输出为“00”,计数器不变;*4、如果输入为“11”,firstV加1,此时如果counter为奇数,则输出仍为“11”;*5、如果counter为偶数,则将counter复位,且将此处前第4个数变成“10”。关键要设置四位的移位寄存器*moduleadd_b(add_in,addb_out,clk);*inputclk;*input[1:0]add_in;*output[1:0]addb_out;*regfirstv;*regcounter;*reg[1:0]d[3:0];*always@(posedgeclk)*begin*d[3]=d[2];*d[2]=d[1];*d[1]=d[0];*d[0]=add_in;*end*always@(posedgeclk)*begin*if(d[0]==2'b11)begincounter=0;firstv=0;end*elseif(d[0]==2'b01)begincounter=counter+1;firstv=1;end*elsebeginfirstv=1;end*end*assignaddb_out=(counter==0)&&(firstv==1)&&(d[0]==2'b11)?2'b10:d[3];*endmoduleRTL图+A[0]B[0]ADDER1011010DENAQPRECLR01010DQPREENACLRDQPREENACLRDQPREENACLRDQPREENACLR=A[1..0]B[1..0]EQUAL=A[1..0]B[1..0]EQUALDENAQPRECLRAdd0addb_out~2addb_out~3counter~0counter~1d[0][1..0]d[1][1..0]d[2][1..0]d[3][1..0]Equal02'h1--Equal12'h3--firstvclkadd_in[1..0]addb_out[1..0]counteraddb_out~1图(2)插B模块波形仿真(clk:时钟信号;add_in:二进制码输入数据;addb_out:数据输出;)单双极性变换:由HDB3编码规则,“V”的极性是正负交替,而“1”和“B”的极性看成一体,为正负交替的,同时“V”的极性与前面的非“0”码一致。1、设置一个极性标志even=0;2、如果输入信号为“00”,输出仍为“00”;3、输入为“01”,或“10”,如果even=1,输出“01”;如果even=0,输出为“10”,然后将even翻转;4、如果输入为“11”,判断even,如果为1,则输出“10”,如果位0,输出“01”。注意:输出后的“10”和“01”表示的不再是“1”、“V”、和“B”了,而是标识符号的正负极性。再将输出控制4选1的开关,就可以将“00”、“01”、“10”转化为0、+1和-1了。*modulepolar(addb_out,clk,BP,BN);*input[1:0]addb_out;*inputclk;*outputBP,BN;*reg[1:0]polar_out;*regBP,BN;*regeven;*always@(posedgeclk)*if(addb_out==2'b11)*begin*if(even==1)beginpolar_out=2'b01;end*elsebeginpolar_out=2'b11;end*end*elseif(addb_out==2'b01||addb_out==2'b10)*if(even==1)begineven=0;polar_out=2'b11;end*elsebegineven=1;polar_out=2'b01;end*elsebeginpolar_out=2'b00;end*always@(polar_out)*begin*if(polar_out==2'b01)beginBP=0;BN=1;end*elseif(polar_out==2'b11)beginBP=1;BN=0;end*elsebeginBP=0;BN=0;end*end*endmodule*RTL图clkevenaddb_out[1..0]0111010=A[1..0]B[1..0]EQUAL=A[1..0]B[1..0]EQUAL=A[1..0]B[1..0]EQUALDENAQPRECLR01polar_outalways0~0BN~0Equal02'h3--Equal12'h1--Equal22'h2--eveneven~0clkBPBNaddb_out[1..0]图(3)单双极性转换模块波形仿真(clk:时钟信号;addb_out:输入数据;BP;HDB3码正;BN;HDB3码负)*顶层模块设计*modulebian(clk,data,BP,BN);*inputclk,data;*outputBP,BN;*add_vu1(.clk(clk),.data_in(data),.data_out(a));*add_bu2(.clk(clk),.add_in(a),.addb_out(b));*polaru3(.clk(clk),.addb_out(b),.BP(BP),.BN(BN));*endmodule*RTL图图(4)顶层模块仿真(clk:时钟信号:data:输入数据;BP;正脉冲;BN:负脉冲)译码器:译码原理:根据编码规则,破坏点V脉冲与前一个脉冲同极性。因此可从所接受的信码中找到V码,然后根据加取代节的原则,V码与前面的三位码必然是取代码,需要全部复原为四连0。只要找到V码,不管V码前是两个“0”码,一律把取代节清零,完成了扣V扣B功能,进而得到原二元信码序列。可实现HDB3译码的模型框图如图4-1所示,HDB3译码器包括双/单极性变换、V码检测、时钟提扣V扣B四部分组成。正整流负整流+V码检测-V码检测相加器相加器扣V扣B时钟提取*BP,BN转换模块*moduletrans(clk,BP,BN,P,N);*inputclk,BP,BN;*outputP,N;*reg[1:0]P;*reg[1:0]N;*always@(posedgeclk)*begin*if(BP==0)P=2'b00;*elseP=2'b01;*if(BN==0)N=2'b00;*elseP=2'b01;*end*endmodule*(1)+V检测模块*为了方便起见,设从正整流电路输出的信号为+B,从负整流电路输出的信号为-B。+V码检测模块-B的控制下,对输入的+B进行检测。其原理是:当+B的上升沿到来时,对输入的+B脉冲进行计数,当计数值等于2时,输出一个脉冲作为+V脉冲,同时计数器清零,而且计数期间,一旦有-B信号为“1”电平时,立即对计数器清零,计数器重新从零开始计数。这是因为在两个+B脉冲之间,存在-B脉冲,说明第二个+B脉冲不是+V码,而只有在连续两个+B脉冲之间无-B脉冲,才能说明这两个+B脉冲在HDB3码中,是真正同极性的于是就可以判定第二个+B脉冲实际上是+V码,达到检测+V码的目的。*(2)-V检测模块*V码检测原理与+V码检测的类似。所不同的是,-V码检测电路在+B控制下,对来自-B信号进行计数和检测、判定,若检测到-V码,则输出到-V码信号*modulefindv(clk,P1,N1,out1,out2);*inputP1,N1,clk;*outputout1,out2;*reg[1:0]counter1;*reg[1:0]counter2;*reg[1:0]out1;*reg[1:0]out2;*always@(posedgeclk)*begin*if(P1==2'b01)*begin*if(counter2==2'b10)counter1=2'b00;*elsebegin*counter1=counter1+1;*if(counter1==2'b10)*beginout1=2'b11;counter1=2'b00;end*elsebeginout1=2'b01;end*end*end**elseout1=2'b00;*end*always@(posedgeclk)*begin*if(N1==2'b01)*begin*if(counter1==2'b10)counter2=2'b00;*elsebegin*counter2=counter2+1;*if(counter2==2'b10)*beginout2=2'b11;counter1=2'b00;end*elsebeginout2=2'b01;end*end*end*elseout2=2'b00;*end*endmodule*(3)扣V扣B模块*扣V扣B模块有三个输入信号,即时钟信号、V码信号和来自正、负整流输出的和路信号。由于该和路信号可能包含有B脉冲和V脉冲,因此需要在扣V扣B模块中,去除V和B脉冲。本模块的建模方法是,用V码检测模块所检测出的V码信号,去控制一个移位寄存器,若未碰到V脉冲,则整流输出合成信号在时钟的节拍下,顺利通过移位寄存器,当碰到有V脉冲时,该V脉冲将使移位寄存器清零。考虑到四连0,即V脉冲及其前面的三个码元应为0码,所以,可设置四位的移位寄存器,当V码清零时,同时将移存器中的四位码全变为0。不管是否有B脉冲,在此模块中,一并清零,因而无需另设扣B电路。另外

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功