资源描述
计算机 学院 计算机科学与技术 专业 1班____组、学号
姓名协作者______________ 教师评定_________________
实验题目_________基于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代码-与非
module HC00(A,B,Y);
input [4:1]A,B;
output [4:1]Y;
assign Y=~(A&B);//与非
endmodule
//74HC00测试平台代码
`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
//74HC02代码-或非
module HC02(A,B,Y);
input [4:1]A,B;
output [4:1]Y;
assign Y=~(A|B);//或非
endmodule
//74HC02测试平台代码
`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
//74HC04代码-非
module HC04(A,Y);
input [4:1]A;
output [4:1]Y;
assign Y=~A;
endmodule
//74HC04测试平台代码
`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
//74HC08代码-与
module HC08(A,B,Y);
input [4:1]A,B;
output [4:1]Y;
assign Y=A&B;
endmodule
//74HC08测试平台代码`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
//74HC32代码-或
module HC32(A,B,Y);
input [4:1]A,B;
output [4:1]Y;
assign Y=A|B;
endmodule
//74HC32测试平台代码
`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
//74HC86代码-异或
module HC86(A,B,Y);
input [4:1]A,B;
output [4:1]Y;
assign Y=A^B;
endmodule
//74HC86测试平台代码
`timescale 1ns/1ns
module testbench();
reg [4:1] a,b;
wire [4:1] y;
HC00 u1(a,b,y);
initial
begin
a=4'b0000;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
a=4'b1111;b=4'b0001;
#10 b=b<<1;
#10 b=b<<1;
#10 b=b<<1;
end
endmodule
2、第一次仿真结果(任选一个门,请注明,插入截图,下同)。(将波形窗口背景设为白色,调整窗口至合适大小,使波形能完整显示,对窗口截图。后面实验中的仿真使用相同方法处理)
选用门电路为:与非门。
3、综合结果(截图)。(将相关窗口调至合适大小,使RTL图能完整显示,对窗口截图,后面实验中的综合使用相同方法处理)
4、第二次仿真结果(综合后)(截图)。回答输出信号是否有延迟,延迟时间约为多少?
输出信号有延迟,延迟时间约为0.7ns
5、第三次仿真结果(布局布线后)(截图)。回答输出信号是否有延迟,延迟时间约为多少?分析是否有出现竞争冒险。
延迟时间约为38ns,由于信号输出经过或门与非门后产生了输出延迟,出现了竞争冒险。
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、所有模块及测试平台代码清单
//74HC148代码
module HC148(DataIn, EO, Dataout);
input[7:0] DataIn;
output EO;
output[2:0] Dataout;
reg[2:0] Dataout;
reg EO;
integer I;
always @(DataIn)
begin
Dataout = 0;
EO = 1;
for (I = 0; I < 8; I = I + 1)
begin
if (DataIn[I])
begin
Dataout = I;
EO = 0;
end
end
end
endmodule
//74HC148测试平台代码
`timescale 1ns / 1ns
module test148;
reg[7:0] in;
wire[2:0] out;
wire EO;
initial
begin
in = 00000001;
repeat(9)
#20 in = in << 1;
end
HC148 u148(in, EO, out);
endmodule
//74HC138代码
module decoder138(Din, Enable, Eq);
input[2:0] Din;
input Enable;
output[7:0] Eq;
reg[7:0] Eq;
wire[2:0]Din;
integer I;
always @ (Din or Enable)
begin
if (Enable)
Eq = 0;
else
for (I = 0; I <= 7; I = I + 1)
if (Din == I)
Eq[I] = 1;
else
Eq[I] = 0;
end
endmodule
//74HC138测试平台代码
`timescale 1ns / 1ns
module testbench;
reg[2:0]Din;
reg enable;
wire[7:0]dataout;
initial
#400 $finish;
initial
begin
enable = 1;
#40 enable = 0;
end
initial
begin
repeat(20)
#20 dataIn = $random;
end
decoder138 test(Din, enable, dataout);
//74HC153代码
module mux4_1_a(D0, D1, D2, D3, Sel0, Sel1, Result);
input D0, D1, D2, D3;
input Sel0, Sel1;
output Result;
reg Result;
always @(D0 or D1 or D2 or D3 or Sll or Sel0)
begin
case({ Sel1,Sel0 })
0: Result = D0;
1 : Result = D1;
2 : Result = D2;
3 : Result = D3;
default: Result = 1`bx;
endcase
end
endmodule
//74HC153测试平台代码
`timescale 1ns / 1ps
module testbench_4mux_1;
reg D0, D1, D2, D3, Sel1, Sel0;
wire Result;
mux4_1_a DUT(D0, D1, D2, D3, Sel1, Sel0, Result);
initial
begin
D0 = 0; D1 = 0; D2 = 0; D3 = 0; Sel1 = 0; Sel0 = 0;
#100 D0 = 1; D1 = 0; D2 = 0; D3 = 1;
#100 Sel1 = 0; Sel0 = 1;
#100 Sel1 = 1; Sel0 = 0;
#100 Sel1 = 1; Sel0 = 1;
#100;
end
endmodule
//74HC85代码
module HC85(A3, A2, A1, A0, B3, B2, B1, B0, QAGB, QASB, QAEB, IAGB, IASB, IAEB);
input A3, A2, A1, A0, B3, B2, B1, B0, IAGB, IASB, IAEB;
output QAGB, QASB, QAEB;
reg QAGB, QASB, QAEB;
wire[3:0]DataA, DataB;
assign DataA[0] = A0;
assign DataA[1] = A1;
assign DataA[2] = A2;
assign DataA[3] = A3;
assign DataB[0] = B0;
assign DataB[1] = B1;
assign DataB[2] = B2;
assign DataB[3] = B3;
always @(DataA or DataB)
begin
if (DataA > DataB)
begin
QAGB = 1; QASB = 0; QAEB = 0;
end
else if (DataA < DataB)
begin
QASB = 1; QAGB = 0; QAEB = 0;
end
else if (IAGB&!IASB&!IAEB)
begin
QAGB = 1; QASB = 0; QAEB = 0;
end
else if (!IAGB&IASB&!IAEB)
begin
QASB = 1; QAGB = 0; QAEB = 0;
end
else if (IAEB)
begin
QAEB = 1; QASB = 0; QAGB = 0;
end
begin
if (DataA == DataB)
if (IAGB&IASB&!IAEB)
begin QAGB = 0; QASB = 0; QAEB = 0; end
if (!IAGB&!IASB&!IAEB)
begin QAGB = 1; QASB = 1; QAEB = 0; end
end
end
endmodule
//74HC85测试平台代码
`timescale 1ns / 1ns
module test85;
reg A3, A2, A1, A0, B3, B2, B1, B0;
reg IAGB, IASB, IAEB;
wire QAGB, QASB, QAEB;
initial
begin
A3 = 0;
repeat(20)
#20 A3 = $random;
end
initial
begin
A2 = 0;
repeat(20)
#20 A2 = $random;
end
initial
begin
A1 = 0;
repeat(20)
#20 A1 = $random;
end
initial
begin
A0 = 0;
repeat(20)
#20 A0 = $random;
end
initial
begin
B3 = 0;
repeat(20)
#20 B3 = $random;
end
initial
begin
B2 = 0;
repeat(20)
#20 B2 = $random;
end
initial
begin
B1 = 0;
repeat(20)
#20 B1 = $random;
end
initial
begin
B0 = 0;
repeat(20)
#20 B0 = $random;
end
initial
begin
IAGB = 0;
repeat(10)
#40 IAGB = $random;
end
initial
begin
IASB = 0;
repeat(10)
#40 IASB = $random;
end
initial
begin
IAEB = 0;
repeat(10)
#40 IAEB = $random;
end
HC85 u85
(
.A3(A3),
.A2(A2),
.A1(A1),
.A0(A0),
.B3(B3),
.B2(B2),
.B1(B1),
.B0(B0),
.IAGB(IAGB),
.IASB(IASB),
.IAEB(IAEB),
.QAGB(QAGB),
.QASB(QASB),
.QAEB(QAEB)
);
endmodule
//74HC283代码
module HC283(A, B, Cin, Sum, Cout);
parameter N = 4;
input[N - 1:0] A, B;
input Cin;
output[N - 1:0] Sum;
reg[N - 1:0] Sum;
output Cout;
reg Cout;
reg[N:0] q;
always @ (A or B or Cin)
begin:adder
integer i;
q[0] = Cin;
for (i = 0; i <= N; i = i + 1)
begin
q[i + 1] = (A[i] & B[i]) | (A[i] & q[i]) | (B[i] & q[i]);
Sum[i] = A[i] ^ B[i] ^ q[i];
end
Cout = q[N];
end
endmodule
//74HC283测试平台代码
`timescale 1ns / 10ps
module testbench;
reg[3:0] ina, inb;
reg cin;
wire[3:0] sum;
wire cout;
HC283 testbench283(ina, inb, cin, sum, cout);
initial
begin
ina = 0;
repeat(20)
#20 ina = $random;
end
initial
begin
inb = 0;
repeat(10)
#40 inb = $random;
end
initial
begin
cin = 0;
#200 cin = 1;
end
endmodule
//74HC4511代码
module HC4511(A, Seg, LT_N, BI_N, LE);
input LT_N, BI_N, LE;
input[3:0]A;
output[7:0]Seg;
reg[7:0]SM_8S;
assign Seg = SM_8S;
always @ (A or LT_N or BI_N or LE)
begin
if (!LT_N) SM_8S = 8'b11111111;
else if (!BI_N) SM_8S = 8'b00000000;
else if (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'b01011110;
4'd14:SM_8S=8'b01111001;
4'd15:SM_8S=8'b01110001; default:;
endcase
end
endmodule
//74HC4511测试平台代码
`timescale 1ns / 10ps
module testbench;
reg[3:0] a;
reg lt_n, bi_n, le;
wire[7:0] seg;
HC4511 hc4511(a, seg, lt_n, bi_n, le);
initial
begin
a = 0; lt_n = 1; bi_n = 1; le = 0;
#30 a = 4'b0001;
#30 a = 4'b1000;
#30 a = 4'b0111;
#30 a = 4'b1010;
#30 a = 4'b0101;
#30 le = 1;
#30 bi_n = 0;
#30 lt_n = 0;
#20;
end
endmodule
2、第一次仿真结果(任选一个模块,请注明)
所选择模块:74HC85
3、综合结果
4、第二次仿真结果(综合后)。回答输出信号是否有延迟,延迟时间约为多少?
6、 第三次仿真结果(布局布线后)。回答输出信号是否有延迟,延迟时间约为多少?分析是否有出现竞争冒险。
延迟4.7ns,出现竞争冒险
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代码
module d_ff (Set,Reset,Clk,D,Q);
input Set,Reset,Clk,D;
output Q;
reg Q;
always @(posedge Clk or negedge Reset or negedge Set)
begin
if(!Reset)
begin
if(!Set)Q<=D;
else Q<=1;
end
else
if(!Set) Q<=0;
end
endmodule
//74HC74测试平台代码
`timescale 1ns/1ns
module testbench;
reg D,Reset,Set,Clk;
wire Q;
d_ff testbench_dff(D,Clk,Q,Set,Reset);
initial
begin
Clk =0;
#400 $finish;
end
parameter clock_period=20;
always#(clock_period/2)Clk=~Clk;
initial
begin
D=0;
repeat(20)
#20 D=$random;
end
initial
begin
Reset=0;
repeat(20)
#20 Reset=$random;
end
initial
begin
Set=0;
repeat(20)
#20 Set=$random;
end
endmodule
//74HC112代码
module jk_ff(J,K,Clk,Q,Qn);
input J,K,Clk;
output Q,Qn;
reg Q;
assign Qn=~Q;
always @ (posedge Clk)
case({J,K})
2'b00:Q<=Q;
2'b01:Q<=1'b0;
2'b10:Q<=1'b1;
2'b11:Q<=~Q;
default:Q<=1'bx;
endcase
endmodule
//74HC112测试平台代码
`timescale 1ns/1ns
module testbench;
reg j,k,Clk;
wire Q,Qn;
parameter clock_period=20;
always #(clock_period/2) Clk=~Clk;
initial
begin
j=0;Clk=0;
repeat(20)
#20 j=$random;
end
initial
begin
k=0;
repeat(20)
#20 k=$random;
end
initial
#300 $finish;
jk_ff testbench_jk(j,k,Clk,Q,Qn);
endmodule
//74HC161代码
module HC161(CP,CEP,CET,MRN,PEN,Dn,Qn,TC);
input CP;
input CEP,CET;
output[3:0] Qn;
input MRN,PEN;
input[3:0] Dn;
output TC;
reg[3:0] qaux;
reg TC;
always @ (posedge CP)
begin
if(!MRN)
qaux<=4'b0000;
else if(!PEN)
qaux<=Dn;
else if(CEP&CET)
qaux<=qaux+1;
else qaux<=qaux;
end
always @ (posedge CP)
begin
if(qaux==4'b1111 && CET==1)
TC=1'b1;
else TC=1'b0;
end
assign Qn=qaux;
endmodule
//74HC161测试平台代码
`timescale 1ns/1ns
module testbench;
reg cp,cep,cet,mrn,pen;
reg[3:0] dn;
wire tc;
wire[3:0] qn;
parameter DELY=20;
always #(DELY/2) cp=~cp;
initial
begin
cep=1;
repeat(15)
#DELY cet=$random;
end
initial
begin
pen=1;
#DELY pen=0;
#60 pen=1;
end
initial
begin
mrn=1;
repeat(20)
#15 mrn=$random;
end
initial
#300 $finish;
HC161 test(cp,cep,cet,mrn,pen,dn,qn,tc);
endmodule
//74HC194代码
module HC194(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);
input[3:0] Data;
input Aclr;
input Enable;
input Shiften;
input Shiftin;
input Clock;
output Shiftout;
reg[3:0] Qaux;
always @ (posedge Aclr or posedge Clock)
begin
if(Aclr)
Qaux=0;
else if(Enable)
Qaux=Data;
else if(Shiften)
Qaux={Qaux[2:0],Shiftin};
end
assign Shiftout=Qaux[3];
endmodule
//74HC194测试平台代码
`timescale 1ns/1ns
module testbench;
reg[3:0] Data;
reg Aclr,Enable,Shiften,Shiftin,Clock;
wire Shiftout;
parameter clock_period=20;
always #(clock_period/2) Clock=~Clock;
initial
#400 $finish;
initial
begin
Data=0;
repeat(20)
#20 Data=$random;
end
initial
begin
Clock=0;
Aclr=0;
#40 Aclr=1;
#100 Aclr=0;
end
initial
begin
Enable=0;
#100 Enable=1;
#100 Enable=0;
end
initial
begin
Shiften=0;
repeat(20)
#20 Shiften=$random;
end
initial
begin
Shiftin=0;
repeat(10)
#40 S
展开阅读全文