欢迎来到天天文库
浏览记录
ID:51524211
大小:2.02 MB
页数:29页
时间:2020-03-22
《HDB3码编码器及解码器verilog代码编程及实现.ppt》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、通信原理消息数字基带信号调制传输解调基带信号解码消息基带信号的选择: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”的极性
2、与前一个非”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、如果计数值为
3、“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;endelsebegincounter<=counter+1;if(counter==3)begindata_out=2'b11;counter=0;endelsebeg
4、indata_out=2'b00;endendendmoduleRTL图插“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_o
5、ut,clk);inputclk;input[1:0]add_in;output[1:0]addb_out;regfirstv;regcounter;reg[1:0]d[3:0];always@(posedgeclk)begind[3]<=d[2];d[2]<=d[1];d[1]<=d[0];d[0]<=add_in;endalways@(posedgeclk)beginif(d[0]==2'b11)begincounter=0;firstv=0;endelseif(d[0]==2'b01)begincounter=counter+1;firstv=
6、1;endelsebeginfirstv=1;endendassignaddb_out=(counter==0)&&(firstv==1)&&(d[0]==2'b11)?2'b10:d[3];endmoduleRTL图单双极性变换:由HDB3编码规则,“V”的极性是正负交替,而“1”和“B”的极性看成一体,为正负交替的,同时“V”的极性与前面的非“0”码一致。1、设置一个极性标志even=0;2、如果输入信号为“00”,输出仍为“00”;3、输入为“01”,或“10”,如果even=1,输出“01”;如果even=0,输出为“10”,然后将even翻
7、转;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'
8、b11)beginif(even==1)beginpolar_out<=2'b01;endelsebegin
此文档下载收益归作者所有