北邮电子院asic实验报告Word文件下载.docx
《北邮电子院asic实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《北邮电子院asic实验报告Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
(3)当相邻破坏点V中间有偶数个原始传号时,用"
B00V'
取代;
(4)用"
取代时,B码和V码与它们前面一个原始传号(或V码)极性相反;
(5)用"
000V'
取代时,V码与它前面的传号极性相同。
可以证明,按照上述原则编出的BPn码,相邻破坏点V的极性也是相反的,因此,破坏点的引入不会导致码流的正负不平衡。
由于HDB3码中的V码破坏了极性交替原则,因此,在收端很容易找到它。
在译码时,将破坏点V检出,包括它前面的三位码一律还原为“0”码就完成了HDB3码的译码工作。
例设前一个破坏点极性为正(记为V+),求NRZ码所对应的HDB3码。
解1110l00001011000011…(NRZ)
(V+)-+-0+-00-+0-+000+-+…(HDB3)
B_00V_000V+
由于已知前一个破坏点为V+,当遇到第一个四连零时,破坏点V的极性一定为负。
但如果用“000V-”来取代,则V码正好与它前面的传号极性相反,没有形成“破坏点”,因此,第一个取代节只能用“B00V”且极性为负。
在确定第二个取代节时,由于两个破坏点间共有三个原始传号(奇数),故取代节为"
000V+”。
例设有一串全零NRZ码,求它对应的HDB3码(设前一个破坏点为V-)。
解……0000000000000000…(NRZ)
…(V_)+00+-00-+00+-00-…(HDB3)
此例说明,相邻破坏点间没有原始传号时,也要用“B00V”取代,以保证相邻的V码极性相反。
2.HDB3译码电路
HDB3译码电路完成编码的反变换,关键之处是检出破坏点,取消“取代节”,即将“000V”或“B00V”还原成“0000”,其管腿框图如下:
四、实验要求:
工作速率为50kb/s~10Mb/s(符合CCITTG.703建议)
这里取时钟频率=2M,信号速率=2M。
用VERILOGHDL进行电路描述,并写出测试文件。
电路仿真结果正确。
五、设计思路:
1、译码原理:
根据编码规则,破坏点V脉冲与前一个脉冲同极性。
因此可从所接受的信码中找到V码,然后根据加取代节的原则,V码与前面的三位码必然是取代码,需要全部复原为四连0。
只要找到V码,不管V码前是两个“0”码,一律把取代节清零,完成了扣V扣B功能,进而得到原二元信码序列。
可实现HDB3译码的模型框图如图所示,V码检测、扣V扣B、双向码转换三部分组成。
2、V码检测:
为了方便起见,设从正信号为bp,从负信号为bn。
+V码检测时钟上升沿的控制下,对输入的bp进行检测。
其原理是:
当bp的上升沿到来时,对输入的bp脉冲进行计数,当计数值等于1时,输出一个脉冲作为+V脉冲,同时计数器清零,而且计数期间,一旦有bn信号为“1”电平时,立即对计数器清零,计数器重新从零开始计数。
这是因为在两个bp脉冲之间,存在bn脉冲,说明第二个bp脉冲不是+V码,而只有在连续两个bp脉冲之间无bn脉冲,才能说明这两个bp脉冲在HDB3码中,是真正同极性的于是就可以判定第二个bp脉冲实际上是+V码,达到检测+V码的目的。
-V码-V码检测与+V码的检测类似,所不同的是-V码的检测是在正整流信号脉冲的控制下对负整流信号脉冲进行计数、检测和判定。
3.扣B扣V模块:
扣V扣B模块有三个输入信号,即时钟信号、V码信号和来自正、负整流输出的和路信号。
由于该和路信号可能包含有B脉冲和V脉冲,因此需要在扣V扣B模块中,去除V和B脉冲。
本模块的建模方法是,用V码检测模块所检测出的V码信号,去控制一个移位寄存器,若未碰到V脉冲,则整流输出合成信号在时钟的节拍下,顺利通过移位寄存器,当碰到有V脉冲时,该V脉冲将使移位寄存器清零。
考虑到四连0,即V脉冲及其前面的三个码元应为0码,所以,可设置四位的移位寄存器,当V码清零时,同时将移存器中的四位码全变为0。
不管是否有B脉冲,在此模块中,一并清零,因而无需另设扣B电路。
另外移位四位寄存器起到延时四位时钟周期的作用,以使所检测出的V脉冲与信号流中的V脉冲位置对齐,保证清零的准确性。
六、电路测试:
(1)测试思路
通过给HDB3译码电路模块bp、bn端口一串固定的激励信号,观察输出端口nrz的输出信号是否与预期一致。
可通过观察仿真波形图或通过测试程序自行判断输出结果是否正确。
同理,需要测试多组数据以确保电路编码的准确性。
(2)输入、输出端口信号电平预期值
输入信号
输出信号
(3)仿真波形图
由仿真波形图可直接观察出HDB3译码电路模块输入与输出信号的关系,通过读信号波形电平值可确定电路编码结果的正确性。
HDB3译码电路仿真波形图下图所示:
分析:
从图中可以看出,我们对该译码器的输入实际为:
手动解码得出的结果为:
从波形可以看出,通过该译码器后,对应的输出为:
手动解码与译码器解码相符,译码器译码成功。
过相应的verilog设计正确。
(4)测试程序验证结果
测试程序可以直接验证仿真结果是否正确,下图为测试程序判断结果。
可以看到结果的每一位输出都是right即都是正确的。
七、综合过程:
1、建立好yima.tcl约束文件。
建立yima.sdc文件。
2、
(1)启动综合工具。
并选择相应的约束文件。
可以得到下图所示的门级电路。
(2)分析report的timing、power等。
a:
timing菜单下的对应的显示如下图所示:
B:
power子菜单先的选项如下图所示。
(3)文件分析:
Sdf文件:
分析:
sdf文件是对触发器的延迟的描述,其中延时信息包括每一个逻辑单元的每一个管脚的上升时延与下降时延的最小值、典型值、最大值。
可以看到里面有
对应的该处的delay就是在设置延迟。
Vg文件:
vg文件描述的是通过逻辑综合生成的逻辑单元的连线组成。
这个文件是对逻辑单元的结构化描述。
3门级电路仿真过程:
不加maxdelays
加了maxdelays
分析:
使用+maxdelays与不使用+maxdelays在门级仿真中有延时的差别,是因为门级仿真时使用到.sdf文件。
这个文件中包含逻辑综合中生成的逻辑单元的延时信息。
这些信息表示了每一个逻辑单元的每一个管脚的上升时延与下降时延的最小值、典型值、最大值。
当使用+maxdelays时,门级仿真使用了延时的最大值,故门级仿真波形表现出其延时要长于不用+maxdelays.
八、实验总结:
本次实验要求我们使用verilog设计一个HDB3译码器。
通过本次实验,我进一步加深了对verilog的体会,提高了对相关语法知识,赋值方式等的理解,也加强了我对硬件描述语言的认识。
当然,通过这次实验,我还回顾了一些关于HDB3编码解码的相关知识,这是一些额外的收获。
在实验过程中,由于是第一次真正使用verilog进行设计开发。
因此,在实验开始时,曾遇到了较大的困难。
第一问题就是,开始前思绪有好多,但是真正动手开始写却又各种出状况。
这直接导致了前两次实验的低效率问题。
后来,通过一位同学拿到了一位学长的代码作为参考。
为了真正读懂那个代码,在课下我也花了不少的时间。
好在功夫不负有心人,通过差找资料以及找同学找老师交流,最后终于将代码弄明白了。
其后的实验做起来就相对来说顺利多了。
虽然,在后续的上机过程中出现过几个小问题,不过,基于软件的强大以及仔细的查找,都能较快的将错误改正过来。
基本编写以及测试便得以完成。
其后,就是对程序进行逻辑综合。
在这过程中,要得到相应的图形其实并不难,因为实验教程中有较为完整的步奏。
但是,要做到对电路进行错误查找就是一个较为困难的地方。
以前没有相应的上机实践经验,因此,即便知道有地方错了,也无法发现错误具体出现在哪个地方。
当然,跟不用说对其改正了。
虽然韩老师有在旁边指点我们如何分析问题在哪,但是,由于对相关分析方法以及相关文件内容所指代的具体含义的不清楚,于是队友和我商量着放弃了。
没有得到最后的正确仿真图形。
这也是我这次实验一个比较大的遗憾。
在实验过程中,遇到了好多次挫折,但是一次又一次的查找问题,一次又一次的继续坐到电脑前继续我的实验,不仅提高了我相应的知识水平,也提过了我分析问题解决问题的能力。
这次实验对我的来说是一次比较好的磨练。
感谢韩老师对我们细心地指导!
九、相关代码:
HDB3译码电路模块设计
//PortDescription:
//Yima
//------------
//bp-->
||
//bn-->
||
//||-->
nrz
//clk-->
//reset-->
//------------
/*************************************/
moduleyima(bp,bn,clk,reset,nrz);
inputbp,bn,clk,reset;
//defineinputports
outputnrz;
//defineoutputports
regnrz;
reg[1:
0]shift_reg[3:
0];
//defineshiftregister
regcount;
//flagtodetectpositiveVcode
regcount_;
//flagtodetectnegtiveVcode
0]pole_change;
//polarconvertingstate
0]flag;
//recordinputsignal
always@(bporbn)//detectpositiveVcodeandnegtiveVcode
begin
if(bp)
begin
if(count)
flag=2'
b00;
count=0;
//clearcountflag
end
else
b10;
count=1;
//setcountflag
count_=0;
elseif(bn)
if(count_)
//clearcount_flag
b01;
count_=1;
//setcount_flag
b11;
always@(posedgeclkorposedgereset)
if(reset)
shift_reg[3]<
=0;
shift_reg[2]<
shift_reg[1]<
shift_reg[0]<
pole_change<
=shift_reg[3];
//shiftoutdatafromshiftregister
=shift_reg[2];
=shift_reg[1];
=shift_reg[0];
case(flag)
2'
b00:
begin
//clearBcodeandVcode
b01:
shift_reg[0]<
=2'
b10:
b11:
default:
endcase
end
always@(posedgeclkorposedgereset)//ouputsignalnrz
nrz<
elseif(pole_change==2'
b10||pole_change==2'
b01)
=1;
endmodule
4、HDB3译码模块测试程序
`timescale100ns/10ns
moduleyima_test;
regbp,bn,clk,reset;
//driveinputports
wirenrz;
//testoutputport
regflag;
//detectfirsthighlevel
integeri;
reg[35:
0]exp_nrz;
//outputexpect
reg[39:
0]judgement;
//judgetheaccuracybetweentheoutputandexpect
0]result;
//showthesimulationresult
yimau1(.bp(bp),.bn(bn),.clk(clk),.reset(reset),.nrz(nrz));
//instantiation
initial//initializevariablesandinputresetsignal
flag=0;
i=0;
exp_nrz=36'
b0000_0000_1101_1000_0100_0111_0001_1000_0111;
clk=0;
reset=0;
#1reset=1;
#5reset=0;
always#2.5clk=~clk;
//clocksignal
initial//inputtestsignal
bp=0;
bn=0;
#10bp=1;
bn=0;
#5bp=0;
bn=1;
#5bp=1;
#15bp=1;
#15bp=0;
#10bp=0;
while
(1)
always@(posedgenrz)
if(!
flag)
flag<
result<
="
right"
;
always@(posedgeclk)//judgetheresultandshowtheinformation
if(flag)
if(i<
36)
if(nrz==exp_nrz[i])
judgement<
wrong"
if(i!
=0)
$display("
%s!
"
judgement);
$write("
nrz=%b;
expect:
nrz=%b;
nrz,exp_nrz[i]);
i<
=i+1;
Thesimulationresultis%s!
result);
$stop;