ASIC实验报告汇编.docx
《ASIC实验报告汇编.docx》由会员分享,可在线阅读,更多相关《ASIC实验报告汇编.docx(26页珍藏版)》请在冰豆网上搜索。
ASIC实验报告汇编
《ASIC设计》课程实验
实验报告
学院:
电子工程学院
班级:
姓名:
学号:
班内序号:
组员:
指导老师:
2014年5月
实验一多路选择器的设计
一、实验目的:
1、掌握门级电路与行为级电路设计的区别;
2、掌握逻辑电路设计方法;
3、熟悉测试程序的编写;
4、注意代码规范性要求。
二、实验内容:
i0
四选一
多路选择器
1、设计一个有两位选择信号的四选一多路选择器,可以根据控制信号从两个或多个输入源中选择一个予以输出。
i1
i2
out
i3
s2
s1
2、用基本逻辑门来实现多路选择器,即门级语言进行描述。
3、用行为级语言进行描述,通过case语句重新设计仿真。
4、编写多路选择器的测试激励模块,并通过Synopsys工具进行仿真。
三、实验过程及结果:
1、门级语言描述:
测试文件:
仿真波形:
由仿真波形可以看出,当两位选择信号是s[1:
0]=00=0时,选择第0路输入源予以输出,当s[1:
0]=01=1时,选择第1路输入源予以输出,当s[1:
0]=10=2时,选择第2路输入源予以输出,当s[1:
0]=11=3时,选择第3路输入源予以输出,实现了四选一多路选择器的功能。
2、行为级语言描述:
测试文件:
仿真波形:
仿真波形分析同门级语言描述仿真分析。
四、实验思考题:
1、门级电路与行为级电路设计的主要区别是什么?
答:
行为级是行为的描述,即对所需实现功能的语言描述;而门级是实例引用,很多行为级描述是不能逻辑综合的。
2、比较门级电路与行为级电路的仿真波形截图,说出其不同点。
答:
由于门级电路的截图没有输出中间状态s1n、s0n、y0、y1、y2和y3,因此门级电路与行为级电路在仿真波形图上看不出有什么区别。
而事实上门级电路有中间状态而行为级电路则没有。
3、如果设计中改用开关级建模,你的思路是什么?
答:
若使用开关级建模,则利用开关导通与高阻来决定输出,采用4个cmos开关,输入为四位i0~i3,s0、s1为控制信号,两个wire型中间变量bar0、sbar1。
用上述管脚即可完成4选一多路选择器的功能。
五、实验源代码:
1、门级语言描述
modulemux(i,s,out);
input[3:
0]i;
input[1:
0]s;
outputout;
wires1_n,s0_n,y0,y1,y2,y3;
notn1(s1_n,s[1]);
notn2(s0_n,s[0]);
anda0(y0,i[0],s1_n,s0_n);
anda1(y1,i[1],s1_n,s[0]);
anda2(y2,i[2],s[1],s0_n);
anda3(y3,i[3],s[1],s[0]);
oro0(out,y0,y1,y2,y3);
endmodule
;测试程序
`timescale1ns/1ps
modulemux_test();
reg[3:
0]i;
reg[1:
0]s;
wireout;
mux(.i(i),.s(s),.out(out));
initial
begin
$dumpvars(1,mux_test);
i=4'b0101;
s=2'b00;
#10s=2'b01;
#10s=2'b10;
#10s=2'b11;
#10s=2'b00;
#100$finish;
end
endmodule
2、行为级语言描述
moduleaction(i,s,out);
input[3:
0]i;
input[1:
0]s;
outputout;
regout;
always@(iors)
begin
case(s)
default:
out=1'b0;
2'b00:
out=i[0];
2'b01:
out=i[1];
2'b10:
out=i[2];
2'b11:
out=i[3];
endcase
end
endmodule
;测试程序
`timescale1ns/1ps
moduleaction_test();
reg[3:
0]i;
reg[1:
0]s;
wireout;
action(.i(i),.s(s),.out(out));
initial
begin
$dumpvars(1,action_test);
i=4'b0101;
s=2'b00;
#10s=2'b10;
#10s=2'b01;
#10s=2'b11;
#10s=2'b00;
#100$finish;
end
endmodule
实验三交通信号灯控制器设计
一、实验目的:
1、掌握时序逻辑电路设计,注意阻塞赋值与非阻塞赋值;
2、熟练运用状态机设计;
3、熟悉测试程序的编写;
4、注意代码规范性要求。
二、实验内容:
1、根据以下功能描述设计一个交通信号灯控制器:
该交通信号灯控制器用于控制一条主干道与一条乡村公路的交叉口的交通,它必须具有下面的功能:
(1)由于主干道上来往的车辆很多,因此控制主干道的交通信号具有最高优先级,在默认情况下主干道的绿灯点亮;
(2)乡村公路间断性地有车经过,有车来时乡村公路的交通等必须变为绿灯,只需维持一段足够长的时间,以便让车通过;
(3)只要乡村公路上不再有车辆,那么乡村公路上的绿灯马上变为黄灯,然后变为红灯,同时,主干道上的绿灯重新点亮;
(4)一个传感器用于监视乡村公路上是否有车等待,它向控制器输入信号X,如果X=1,则表示有车等待,否则X=0;
(5)各个状态转换时,具有一定的延迟,这些延迟必须能够控制。
2、有限状态机设计如下图所示:
其中各状态的含义为:
S0:
主干道绿灯,乡村公路红灯;
S1:
主干道黄灯,乡村公路红灯;
S2:
主干道红灯,乡村公路绿灯;
S3:
主干道红灯,乡村公路绿灯;
S4:
主干道红灯,乡村公路黄灯。
3、编写相应验证程序,对编写的行为级模型进行验证,要求涵盖到状态机所有可能的转换。
三、实验过程及结果:
测试文件:
仿真波形:
仿真图分析:
clk为时钟信号,reset为复位信号,reset为低电平即reset=0时电路正常工作,x为传感器向控制器输入的信号,高电平即x=1时表示乡村公路上有车等待,低电平即x=0时表示乡村公路上没有车等待,l1为主路上交通信号灯的情况,00=0为绿灯,01=1为黄灯,11=3为红灯;l2为乡村公路上交通信号灯的情况,红绿黄灯情况同主路。
当信号x=1时,主路交通灯由绿变为黄灯,经过一段延时后再变为红灯,在主干道为红灯后,经过延时乡村公路交通灯由红灯变为绿灯。
此状态维持一段时间后,再检测x信号,若x信号仍为1,则主干道继续红灯,乡村公路继续绿灯,若x信号变为0,则乡村公路交通灯由绿灯变为黄灯,经过一段延时后再变为红灯,在乡村公路为红灯后,主路由红灯变为绿灯,由此实现了交通信号灯控制器的功能。
四、实验思考题:
1、你是怎样理解阻塞赋值和非阻塞赋值的?
答:
组合逻辑的always模块中使用阻塞赋值,时序逻辑的always模块中使用非阻塞赋值。
阻塞赋值对应的电路往往与触发沿没有关系,只与输入电平的变化有关系,阻塞赋值符号为“=”,非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况,非阻塞赋值符号为“<=”。
阻塞赋值是在赋值语句执行完成后块才结束,非阻塞赋值是快结束后才完成赋值。
2、说明验证程序中涵盖的状态机转换有哪些。
答:
包含了状态机的5个状态x控制状态的转移。
五、实验源代码:
modulemux(clk,reset,state,x,l1,l2);
inputclk,reset,x;
output[2:
0]state;
output[1:
0]l1,l2;
wirex;
reg[2:
0]state,next_state;
reg[1:
0]l1,l2;
always@(posedgeclkorposedgereset)
if(reset)
beginstate<=3'b000;
l1<=2'b00;
next_state<=0;
l2<=2'b11;
end
else
begin
#10state<=next_state;
case(state)
3'b000:
begin
l1<=2'b00;
l2<=2'b11;
if(x)
next_state<=3'b001;
else
next_state<=3'b000;
end
3'b001:
begin
l1<=2'b01;
l2<=2'b11;
next_state<=3'b010;
end
3'b010:
begin
l1<=2'b11;
l2<=2'b11;
next_state<=3'b011;
end
3'b011:
begin
l1<=2'b11;
l2<=2'b00;
if(x)
next_state<=3'b011;
else
next_state<=3'b100;
end
3'b100:
begin
l1<=2'b11;
l2<=2'b01;
next_state<=3'b000;
end
default:
begin
next_state<=3'b000;
l1<=2'b00;
l2<=2'b11;
end
endcase
end
endmodule
;测试程序
`timescale1ns/1ps
modulemux_test();
regclk,reset,x;
wire[2:
0]state;
wire[1:
0]l1,l2;
mux(
.clk(clk),
.reset(reset),
.x(x),
.state(state),
.l1(l1),
.l2(l2));
initial
forever#10clk=~clk;
initial
begin
$dumpvars(2,mux_test);
clk=0;
x=0;
reset=1;
#40reset=0;
#40x=1;
#50x=0;
#500x=1;
#200x=0;
#5000$finish;
end
endmodule
实验五NRZ/HDB3码制变换的功能与时序验证
一、实验目的:
1、掌握复杂时序逻辑电路设计;
2、掌握RTL级设计的基本要求;
3、掌握验证程序的设计方法与技巧。
二、实验内容:
HDB3译码电路
HDB3译码电路完成编码的反变换,关键之处是检出破坏点,取消“取代节”,即将“000V”或“B00V”还原成“0000”,其管腿框图如下:
HDB+
NRZ
HDB-
CRX
三、实验要求:
1、工作速率为50Kb/s~10Mb/s(符合CCITTG.703建议);
2、取时钟频率为2M,信号速率为2M;
3、用VerilogHDL进行电路RTL描述;
4、代码中应具有必要的注释;
5、模块、端口的设计与命名规则应符合要求;
6、写出测试文件,测试文件中应具有验证结果是否正确的判断语句,电路仿真结果正确。
四、设计思路
首先熟悉编码规则,检查连“0”的情况,出现4个或4个以上连“0”时,将第4个“0”变为与前一个非“0”符号同极性的符号,用“V”标识(+V和-V);检查相邻V符号之间非“0”符号是否为偶数,如果为偶数,则将当前V符号前一个非“0”符号后的第一个“0”变为“B”,”B”的极性与前一个非”0“符号相反,并使“V”后的非“0”符号从“V”开始再交替变化。
插“V”的实现:
设置连“0”计数器,复位为0;对输入信号进行判断,如果为1则计数器复位,且输出“01”;如果为“0”,则对“0”进行计数,如果计数值不为4,则输出“00”;如果计数值为“4”,则计数器复位,同时输出为“11”。
插“B”的实现:
设置对“01”的计数器counter为0,设置对“11”的计数器counter2为0;对输入进行判断,如果为“01”,则counter加1,仍然输出“01”;如果输入为“00”,输出为“00”,计数器不变;如果输入为“11”,counter2加1,此时如果counter为奇数,则输出仍为“11”;如果counter为偶数,则将counter复位,且将此处前第4个数变成“10”。
关键要设置四位的移位寄存器。
由HDB3编码规则,“V”的极性是正负交替,而“1”和“B”的极性看成一体,为正负交替的,同时“V”的极性与前面的非“0”码一致。
设置一个极性标志even=0;如果输入信号为“00”,输出仍为“00”;输入为“01”,或“10”,如果even=1,输出“01”;如果even=0,输出为“10”,然后将even翻转;如果输入为“11”,判断even,如果为1,则输出“10”,如果位0,输出“01”。
(注意:
输出后的“10”和“01”表示的不再是“1”、“V”、和“B”了,而是标识符号的正负极性。
再将输出控制4选1的开关,就可以将“00”、“01”、“10”转化为0、+1和-1了。
)
译码原理:
根据编码规则,破坏点V脉冲与前一个脉冲同极性。
因此可从所接受的信码中找到V码,然后根据加取代节的原则,V码与前面的三位码必然是取代码,需要全部复原为四连0。
只要找到V码,不管V码前是两个“0”码,一律把取代节清零,完成了扣V扣B功能,进而得到原二元信码序列。
HDB3译码器包括双/单极性变换、V码检测、时钟提扣V扣B四部分组成。
+V检测模块:
为了方便起见,设从正整流电路输出的信号为+B,从负整流电路输出的信号为-B。
+V码检测模块-B的控制下,对输入的+B进行检测。
其原理是:
当+B的上升沿到来时,对输入的+B脉冲进行计数,当计数值等于2时,输出一个脉冲作为+V脉冲,同时计数器清零,而且计数期间,一旦有-B信号为“1”电平时,立即对计数器清零,计数器重新从零开始计数。
这是因为在两个+B脉冲之间,存在-B脉冲,说明第二个+B脉冲不是+V码,而只有在连续两个+B脉冲之间无-B脉冲,才能说明这两个+B脉冲在HDB3码中,是真正同极性的于是就可以判定第二个+B脉冲实际上是+V码,达到检测+V码的目的。
-V检测模块:
V码检测原理与+V码检测的类似。
所不同的是,-V码检测电路在+B控制下,对来自-B信号进行计数和检测、判定,若检测到-V码,则输出到-V码信号。
扣V扣B模块:
扣V扣B模块有三个输入信号,即时钟信号、V码信号和来自正、负整流输出的和路信号。
由于该和路信号可能包含有B脉冲和V脉冲,因此需要在扣V扣B模块中,去除V和B脉冲。
本模块的建模方法是,用V码检测模块所检测出的V码信号,去控制一个移位寄存器,若未碰到V脉冲,则整流输出合成信号在时钟的节拍下,顺利通过移位寄存器,当碰到有V脉冲时,该V脉冲将使移位寄存器清零。
考虑到四连0,即V脉冲及其前面的三个码元应为0码,所以,可设置四位的移位寄存器,当V码清零时,同时将移存器中的四位码全变为0。
不管是否有B脉冲,在此模块中,一并清零,因而无需另设扣B电路。
另外移位四位寄存器起到延时四位时钟周期的作用,以使所检测出的V脉冲与信号流中的V脉冲位置对齐,保证清零的准确性。
五、实验过程及结果:
仿真波形:
六、实验思考题:
1、什么是验证程序中的三要素?
请结合自己编写的程序,加以阐述。
答:
验证程序中的三要素为电路、激励和显示。
2、在验证过程中发现的问题。
答:
观察波形图发现译码结果所得的与输入相同,即译码成功。
七、实验源代码:
`timescale1ns/1ns
moduleyimama(BP,BN,clk,out3);
inputBP,BN,clk;
output[1:
0]out3;
wire[1:
0]out0;
reg[1:
0]P,N,out1,out2;
reg[1:
0]counter1=0;
reg[1:
0]counter2=0;
reg[1:
0]d[3:
0];
reg[1:
0]out0;
reg[1:
0]a;
reg[1:
0]b;
initialbegin
d[0]=0;
d[1]=0;
d[2]=0;
d[3]=0;
out1=0;
out2=0;
end
always@(posedgeclk)
begin
if(BP==0)P<=2'b00;
elseP<=2'b01;
if(BN==0)N<=2'b00;
elseN<=2'b01;
if(P==2'b01)
begin
counter2<=2'b00;
counter1=counter1+1;
if(counter1==2'b10)
beginout1<=2'b11;counter1<=2'b00;
end
else
beginout1<=2'b01;
end
end
elseout1<=2'b00;
if(N==2'b01)
begin
counter1<=2'b00;
counter2=counter2+1;
if(counter2==2'b10)
beginout2<=2'b11;counter2<=2'b00;end
elsebeginout2<=2'b01;end
end
elseout2<=2'b00;
d[3]<=d[2];
d[2]<=d[1];
d[1]<=d[0];
d[0]<=out0;
if(out0==2'b11)
begin
d[0]<=00;
d[1]<=00;
d[2]<=00;
d[3]<=00;
end
end
assignout0=out1+out2;
assignout3=d[3];
endmodule
`timescale1ns/1ns
modulebian(clk,data,BP,BN,out3);
inputclk,data;
outputBP,BN,out3;
regBP,BN;
reg[1:
0]data_out;
reg[1:
0]counter=0;
regcounter2=0;
reg[1:
0]d[3:
0];
reg[1:
0]polar_out;
regeven=0;
wire[1:
0]addb_out;
initial
begin
BP<=0;
BN<=0;
data_out<=0;
d[0]<=0;
d[1]<=0;
d[2]<=0;
d[3]<=0;
polar_out<=0;
end
always@(posedgeclk)
begin
if(data==1)
begin
counter<=0;
data_out<=2'b01;
end
else
begin
counter<=counter+1;
if(counter==2'b11)
begin
data_out<=2'b11;
end
else
begin
data_out<=2'b00;
end
end
end
always@(posedgeclk)
begin
d[3]<=d[2];
d[2]<=d[1];
d[1]<=d[0];
d[0]<=data_out;
end
always@(posedgeclk)
begin
if(d[0]==2'b01)
begin
counter2<=counter2+1;
end
elsecounter2<=counter2;
end
assignaddb_out=(counter2==0)&&(d[0]==2'b11)?
2'b10:
d[3];
always@(posedgeclk)
if(addb_out==2'b11)
begin
if(even==1)beginpolar_out<=2'b01;end
elsebeginpolar_out<=2'b10;end
end
elseif(addb_out==2'b01||addb_out==2'b10)
if(even==1)begineven<=0;polar_out<=2'b10;end
elsebegineven<=1;polar_out<=2'b01;end
elsebeginpolar_out<=2'b00;end
always@(polar_out)
begin
case(polar_out)
2'b01:
beginBP=0;BN=1;end
2'b10:
beginBP=1;BN=0;end
default:
beginBP=0;BN=0;end
endcase
end
yimamau1(.clk(clk),.BP(BP),.BN(BN),.out3(out3));
endmodule
`timescale1ns/1ns
modulebian_test();
regclk,data;
bian(.clk(clk),.data(data),.BN(),.BP(),.out3());
initial
forever#10clk=~clk;
initial
begin
$dumpvars(3,bian_test);
clk=0;
data=0;
#700$finish;
end
endmodule
实验总结
ASIC实验课程结束了,虽然只有短短的四节课,但是我还是学到了很多东西,获益匪浅。
四次课程总共完成了三次实验,第一节课先对Verilog语言以及VCS软件进行初步的了解,便于之后实验的进行,交通灯的实验开始就需要我们对实验要求进行分析和解析,然后编写代码,最后一次的实验更是,要先对其编码原理了解透彻,再熟练英语Verilog语言。
实验是两个同学一组,着实减轻了我们每个人的压力,思路卡顿时,两个人一起商量便能豁然开朗,所以说实验不仅让我们学到了很多知识,还锻炼了我们的团队合作能力,总之,ASIC实验课程让我收获良多。
希望以后还有机会接触类似课程。
最后,感谢本次实验中我的指导老师韩可老师以及两位学长学姐的悉心指导与帮助。