广工EDA实验报告.docx
《广工EDA实验报告.docx》由会员分享,可在线阅读,更多相关《广工EDA实验报告.docx(48页珍藏版)》请在冰点文库上搜索。
![广工EDA实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/324dff83-3dbb-4b59-bcae-1bcee22ced26/324dff83-3dbb-4b59-bcae-1bcee22ced261.gif)
数字逻辑与系统设计实验报告
学 院 计算机学院
专 业 计算机科学与技术年级班别 (15)7
学 号3215005176
学生姓名 黄海英 指导教师 江志文
16年 12月
计算机
学院 计算机科学与技术 专业_7 班 组、学号
3215005176
姓名_黄海英 协作者 教师评定
实验题目 基于Libero的数字逻辑设计仿真及验证实验
1、 熟悉EDA工具的使用;仿真基本门电路。
2、 仿真组合逻辑电路。
3、 仿真时序逻辑电路。
4、 基本门电路、组合电路和时序电路的程序烧录及验证。
5、 数字逻辑综合设计仿真及验证。
实验报告
1、基本门电路
一、实验目的
1、了解基于Verilog的基本门电路的设计及其验证。
2、熟悉利用EDA工具进行设计及仿真的流程。
3、学习针对实际门电路芯片
74HC00、74HC02、74HC04、74HC08、74HC32、74HC86进行VerilogHDL设计的方
法。
二、实验环境
Libero仿真软件。
三、实验内容
1、掌握Libero软件的使用方法。
2、进行针对74系列基本门电路的设计,并完成相应的仿真实验。
3、参考教材中相应章节的设计代码、测试平台代码(可自行编程),完成
74HC00、74HC02、74HC04、74HC08、74HC32、74HC86相应的设计、综合及仿真。
4、提交针对74HC00、74HC02、74HC04、74HC08、74HC32、74HC86(任选一
个)的综合结果,以及相应的仿真结果。
四、实验结果和数据处理
1、所有模块及测试平台代码清单
//74HC00代码-与非
//74HC00.v
moduleHC00(A,B,Y);input[4:
1]A,B;
output[4:
1]Y;
assignY=~(A&B);//与非
45
endmodule
//74HC00测试平台代码
//testbench.v
`timescale1ns/1nsmoduletestbench();reg[4:
1]a,b;
wire[4:
1]y;
HC00u1(a,b,y);
initialbegin
a=4'b0000;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10a=4'b1111;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
endendmodule
//74HC02代码-或非
//74HC02.v
moduleHC02(A,B,Y);input[4:
1]A,B;
output[4:
1]Y;
assignY=~(A|B);//或非endmodule
//74HC02测试平台代码
`timescale1ns/1nsmoduletest02();reg[4:
1]a,b;
wire[4:
1]y;
HC02u2(a,b,y);
initialbegin
a=4'b0000;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10
a=4'b1111;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
endendmodule
//74HC04代码-非moduleHC04(A,Y);input[6:
1]A;
output[6:
1]Y;assignY=~A;//非endmodule
//74HC04测试平台代码
`timescale1ns/1nsmoduletest04();reg[6:
1]a;
wire[6:
1]y;
HC04u4(a,y);
initialbegin
a=6'b000001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
endendmodule
//74HC08代码-与
moduleHC08(A,B,Y);
input[4:
1]A,B;
output[4:
1]Y;assignY=A&B;//与endmodule
//74HC08测试平台代码
`timescale1ns/1nsmoduletest08();reg[4:
1]a,b;
wire[4:
1]y;
HC08u8(a,b,y);
initialbegin
a=4'b0000;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10
a=4'b1111;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
endendmodule
//74HC32代码-或moduleHC32(A,B,Y);input[4:
1]A,B;
output[4:
1]Y;assignY=A|B;//或endmodule
//74HC32测试平台代码
`timescale1ns/1nsmoduletest32();reg[4:
1]a,b;
wire[4:
1]y;
HC32u32(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10
a=4'b1111;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
endendmodule
//74HC86代码-异或moduleHC86(A,B,Y);input[4:
1]A,B;
output[4:
1]Y;
assignY=A&(~B)|(~A&B);//异或endmodule
//74HC86测试平台代码
`timescale1ns/1nsmoduletest86();reg[4:
1]a,b;
wire[4:
1]y;
HC86u86(a,b,y);
initialbegin
a=4'b0000;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
#10
a=4'b1111;b=4'b0001;#10b=b<<1;
#10b=b<<1;
#10b=b<<1;
end
endmodule
2、第一次仿真结果(任选一个门,请注明,插入截图,下同)。
(将波形窗口背景设为白色,调整窗口至合适大小,使波形能完整显示,对窗口截图。
后面实验中的仿真使用相同方法处理)
3、综合结果(截图)。
(将相关窗口调至合适大小,使RTL图能完整显示,对窗口截图,后面实验中的综合使用相同方法处理)
4、第二次仿真结果(综合后)(截图)。
回答输出信号是否有延迟,延迟时间约为多少?
5、第三次仿真结果(布局布线后)(截图)。
回答输出信号是否有延迟,延迟时间约为多少?
分析是否有出现竞争冒险。
2、组合逻辑电路
一、实验目的
1、了解基于Verilog的组合逻辑电路的设计及其验证。
2、熟悉利用EDA工具进行设计及仿真的流程。
3、学习针对实际组合逻辑电路芯片
74HC148、74HC138、74HC153、74HC85、74HC283、74HC4511进行VerilogHDL设
计的方法。
二、实验环境
Libero仿真软件。
三、实验内容
1、掌握Libero软件的使用方法。
2、进行针对74系列基本组合逻辑电路的设计,并完成相应的仿真实验。
3、参考教材中相应章节的设计代码、测试平台代码(可自行编程),完成
74HC148、74HC138、74HC153、74HC85、74HC283、74HC4511相应的设计、综合及
仿真。
4、74HC85测试平台的测试数据要求:
进行比较的A、B两数,分别为本人学号的末两位,如“89”,则A数为“1000”,B数为“1001”。
若两数相等,需考虑级联输入(级联输入的各种取值情况均需包括);若两数不等,则需增加一对取值情况,验证
A、B相等时的比较结果。
5、74HC4511设计成扩展型的,即能显示数字0~9、字母a~f。
6、提交针对
74HC148、74HC138、74HC153、74HC85、74HC283、74HC4511(任选一个)的综合
结果,以及相应的仿真结果。
四、实验结果和数据处理
1、所有模块及测试平台代码清单
//74HC85.v
moduleHC85(A3,A2,A1,A0,B3,B2,B1,B0,QAGB,QASB,QAEB,IAGB,IASB,IAEB);inputA3,A2,A1,A0,B3,B2,B1,B0,IAGB,IASB,IAEB;
outputQAGB,QASB,QAEB;
regQAGB,QASB,QAEB;
wire[3:
0]DataA,DataB;
assignDataA={A3,A2,A1,A0};assignDataB={B3,B2,B1,B0};always@(DataAorDataB)begin
if(DataA>DataB)begin
QAGB=1;QASB=0;QAEB=0;
end
elseif(DataAQAGB=0;QASB=1;QAEB=0;
end
elseif(IAGB&!
IASB&!
IAEB)begin
QAGB=1;QASB=0;QAEB=0;
end
elseif(!
IAGB&IASB&!
IAEB)beginQAGB=0;QASB=1;QAEB=0;
end
elseif(IAEB)begin
QAEB=1;QASB=0;QAGB=0;
end
elseif(IAGB&IASB&!
IAEB)beginQAGB=0;QASB=0;QAEB=0;
end
elseif(!
IAGB&!
IASB&!
IAEB)beginQAGB=1;QASB=1;QAEB=0;
endend
endmodule
//testbench.v
`timescale1ns/10psmoduletestbench;reg[3:
0]ina,inb;wireAGEB;
HC85u1(ina,inb,AGEB);initial
beginina=0;repeat(20)
#20ina=$random;
#20$finish;end
initialbegininb=0;
repeat(10)
#40inb=$random;end
endmodule
//74HC138.v
moduleHC138(A,En,Y);input[2:
0]A;
input[3:
1]En;
output[7:
0]Y;
reg[7:
0]Y;
wire[2:
0]A;integerI;
always@(AorEn)begin
if(En[1]==1||En[2]==1||En[3]==0)Y=8'b11111111;
else
for(I=0;I<=7;I=I+1)if(A==I)
endendmodule
//testbench.v
`timescale1ns/10psmoduletestbench();reg[2:
0]a;
reg[3:
1]en;
wire[7:
0]y;
HC138u1(a,en,y);initial
begin
else
Y[I]=0;
Y[I]=1;
endEndmodule
en[1]=1;en[2]=0;en[3]=1;#10en[1]=0;en[2]=1;
#10en[2]=0;en[3]=0;
#10en[3]=1;a=3'b000;
#10a=3'b001;
#10a=3'b010;
#10a=3'b011;
#10a=3'b100;
#10a=3'b101;
#10a=3'b110;
#10a=3'b111;
//74HC148.v
moduleHC148(DataIn,EO,DataOut,EI,GS);input[7:
0]DataIn;
inputEI;outputEO,GS;
output[2:
0]DataOut;reg[2:
0]DataOut;regEO;
regGS;
integerI;
always@(DataInorEI)begin
if(EI==1)
begin
DataOut=3'b111;
GS=1;
EO=1;
end
elseif(DataIn==8'b11111111)begin
DataOut=3'b111;
GS=1;
EO=0;
endelse
begin
for(I=0;I<8;I=I+1)
begin
if(DataIn[I]==0)begin
DataOut=~I;
EO=1;
GS=0;
end
end
endendmodule
//testbench.v
end
//DataOut=~DataOut;
`timescale1ns/10psmoduletestbench();
reg[7:
0]in;
wire[2:
0]out;regEI;
wireEO,GS;
initial
begin
EI=1;
#20EI=0;in=8'b11111111;
#20in=8'b11111110;
#20in=8'b11111101;
#20in=8'b11111011;
#20in=8'b11110111;
#20in=8'b11101111;
#20in=8'b11011111;
#20in=8'b10111111;
#20in=8'b01111111;
end
HC148u1(in,EO,out,EI,GS);
Endmodule
//74HC153.v
moduleHC153(D0,D1,D2,D3,Sel0,Sel1,Result);inputD0,D1,D2,D3;
inputSel0,Sel1;outputResult;regResult;
always@(D0orD1orD2orD3orSel1orSel0)begin
case({Sel1,Sel0})0:
Result=D0;1:
Result=D1;2:
Result=D2;3:
Result=D3;default:
Result=1'bx;endcase
endendmodule
//testbench.v
`timescale1ns/10ps
moduletestbench;
regD0,D1,D2,D3,Sel1,Sel0;
wireResult;
HC153u1(D0,D1,D2,D3,Sel0,Sel1,Result);
initialbegin
D0=0;D1=0;D2=0;D3=0;Sel1=0;Sel0=0;#100D0=1;D1=0;D2=0;D3=1;
#100Sel1=0;Sel0=1;
#100Sel1=1;Sel0=0;
#100Sel1=1;Sel0=1;
#100;
endendmodule
//74HC283.v
moduleHC283(DataA,DataB,Cin,Sum,Cout);input[3:
0]DataA,DataB;
inputCin;
output[3:
0]Sum;outputCout;
reg[3:
0]Sum;regCout;
always@(DataAorDataBorCin)begin
{Cout,Sum}=DataA+DataB+Cin;end
endmodule
//testbench.v
`timescale1ns/10psmoduletestbench;reg[3:
0]ina,inb;regcin;
wire[3:
0]sum;wirecout;
HC283u1(ina,inb,cin,sum,cout);initial
beginina=0;repeat(20)
#20ina=$random;end
initialbegininb=0;
repeat(10)
#40inb=$random;end
initialbegincin=0;
#200cin=1;endEndmodule
//74HC4511.v
moduleHC4511(A,Seg,LT_N,BI_N,LE);inputLT_N,BI_N,LE;
input[3:
0]A;output[7:
0]Seg;reg[7:
0]SM_8S;
assignSeg=SM_8S;
always@(AorLT_NorBI_NorLE)beginif(!
LT_N)SM_8S=8'b11111111;
elseif(!
BI_N)SM_8S=8'b00000000;
elseif(LE)SM_8S=SM_8S;else
case(A)4'd0:
SM_8S=8'b00111111;
4'd1:
SM_8S=8'b00000110;
4'd2:
SM_8S=8'b01011011;
4'd3:
SM_8S=8'b01001111;
4'd4:
SM_8S=8'b01100110;
4'd5:
SM_8S=8'b01101101;
4'd6:
SM_8S=8'b01111101;
4'd7:
SM_8S=8'b00000111;
4'd8:
SM_8S=8'b01111111;
4'd9:
SM_8S=8'b01101111;
4'd10:
SM_8S=8'b01110111;
4'd11:
SM_8S=8'b01111100;
4'd12:
SM_8S=8'b00111001;
4'd13:
SM_8S=8'b01011100;
4'd14:
SM_8S=8'b01111001;
4'd15:
SM_8S=8'b01110001;
default:
;endcase
endendmodule
//testbench.v
`timescale1ns/10psmoduletestbench;reg[3:
0]A;
regLT_N,BI_N,LE;wire[7:
0]Seg;integeri;
HC4511u1(A,Seg,LT_N,BI_N,LE);
initialbegin
for(i=0;i<16;i=i+1)begin
#20A=i;
endendendmodule
2、第一次仿真结果(任选一个模块,请注明)
3、综合结果
4、第二次仿真结果(综合后)。
回答输出信号是否有延迟,延迟时间约为多少?
5、第三次仿真结果(布局布线后)。
回答输出信号是否有延迟,延迟时间约为多少?
分析是否有出现竞争冒险。
3、时序逻辑电路
一、实验目的
1、了解基于Verilog的时序逻辑电路的设计及其验证。
2、熟悉利用EDA工具进行设计及仿真的流程。
3、学习针对实际时序逻辑电路芯片74HC74、74HC112、74HC194、74HC161进行VerilogHDL设计的方法。
二、实验环境
Libero仿真软件。
三、实验内容
1、熟练掌握Libero软件的使用方法。
2、进行针对74系列时序逻辑电路的设计,并完成相应的仿真实验。
3、参考教材中相应章节的设计代码、测试平台代码(可自行编程),完成
74HC74、74HC112、74HC161、74HC194相应的设计、综合及仿真。
4、提交针对74HC74、74HC112、74HC161、74HC194(任选一个)的综合结果,以及相应的仿真结果。
四、实验结果和数据处理
1、所有模块及测试平台代码清单
//74HC74代码
//74HC74.v
moduleHC74(SD,RD,Clk,D,Q,NQ);
input[1:
0]SD,RD,Clk,D;
output[1:
0]Q,NQ;
reg[1:
0]Q,NQ;
always@(posedgeClk[0]ornegedgeSD[0]ornegedgeRD[0])begin
if(!
SD[0])
begin
if(RD[0])
begin
Q[0]=1;
NQ[0]=0;
endelse
begin
Q[0]=1;
NQ[0]=1;
end
endelse
begin
if(!
RD[0])
begin
Q[0]=0;
NQ[0]=1;
endelse
begin
Q[0]=D[0];
NQ[0]=~D[0];
end
end
end
always@(posedgeClk[1]ornegedgeSD[1]ornegedgeRD[1])begin
if(!
SD[1])
begin
if(RD[1])
begin
Q[1]=1;
NQ[1]=0;
endelse
begin
Q[1]=1;
NQ[1]=1;
end
endelse
begin
if(!
RD[1])
begin
Q[1]=0;
NQ[1]=1;
endelse
begin
Q[1]=D[1];
NQ[1]=~D[1];
end
end
end
endmodule
//74HC74测试平台代码
//testbench.v
`timescale1ns/1nsmoduletestbench;
reg[1:
0]SD,RD,Clk,D;
wire[1:
0]Q,NQ;
HC74u1(SD,RD,Clk,D,Q,NQ);
initialbeginClk=0;
#400$finish;end
parameterclock_period=20;
always#(clock_period/2)Clk=~Clk;
initial
begin
SD=2'b01;RD=2'b10;D=2'b01;#10S