任务
- 实现74HC85的程序设计与仿真
- 用74HC85连接成1个16位的数值比较器
74HC85
程序设计
//filename:74HC85.v
module dc74HC85(
input Igt,Ilt,Ieq,
input [3:0]A,B,
output reg Fgt,Flt,Feq
);
/*电路功能描述
4位数值比较器
1.(*)表示 always 块中所有输入信号都是敏感信号
2.输出定义成 reg 型
*/
/*端口功能描述
Igt,Ilt,Ieq:扩展输入端,上一级的输出做为输入,便于级联
A,B:输入两个4位需要比较的数值,前者与后者关系
Fgt,Flt,Feq:上一级的结果联合A与B比较结果
*/
always@(*)begin
if(Igt&&!Ilt&&!Ieq)begin
Fgt=1;Flt=0;Feq=0;
end
if(Ilt&&!Igt&&!Ieq)begin
Fgt=0;Flt=1;Feq=0;
end
if(!Ilt&&!Igt&&Ieq)begin
if(A>B)begin
Fgt=1;Flt=0;Feq=0;
end
else if(A<B)begin
Fgt=0;Flt=1;Feq=0;
end
else if(A==B)begin
Fgt=0;Flt=0;Feq=1;
end
end
end
endmodule
仿真
//filename:tb_74HC85.v
`timescale 1ns/1ns
module tb_74HC85;
reg Igt,Ilt,Ieq;
reg [3:0]A,B;
wire Fgt,Flt,Feq;
//实例化74HC85
dc74HC85 dc74HC85_inst(
.Igt(Igt),
.Ilt(Ilt),
.Ieq(Ieq),
.A(A),
.B(B),
.Fgt(Fgt),
.Flt(Flt),
.Feq(Feq)
);
initial begin
Igt=1;Ilt=0;Ieq=0;A=4'b0000;B=4'b1111;
#1
Igt=0;Ilt=1;Ieq=0;A=4'b0111;B=4'b0011;
#1
Igt=0;Ilt=0;Ieq=1;A=4'b0000;B=4'b0000;
#1
Igt=0;Ilt=0;Ieq=1;A=4'b0001;B=4'b0000;
#1
Igt=0;Ilt=0;Ieq=1;A=4'b1000;B=4'b0110;
#1
Igt=0;Ilt=0;Ieq=1;A=4'b0010;B=4'b1101;
#1
;
end
endmodule
16位数值比较器
串行接法
思路
将上一级的比较结果传递下去,级联最后一级得到最终结果.
同样将最初的输入端保留,以便更多数位级联
程序设计
//filename:dc16bits.v
module dc16bits(
input Igt,Ilt,Ieq,
input [15:0]A,B,
output reg Fgt,Flt,Feq
);
/*电路功能描述
16位数值比较器
*/
/*端口功能描述
Igt,Ilt,Ieq:扩展输入端,上一级的输出做为输入,便于级联
A,B:输入两个16位需要比较的数值,前者与后者关系
Fgt,Flt,Feq:上一级的结果联合A与B比较结果
*/
wire [3:0] Fgts,Flts,Feqs;
//实例化74HC85:4位数值比较器DC3,DC2,DC1,DC0
dc74HC85 DC3(
.Igt(Igt),
.Ilt(Ilt),
.Ieq(Ieq),
.A(A[15:12]),
.B(B[15:12]),
.Fgt(Fgts[3]),
.Flt(Flts[3]),
.Feq(Feqs[3])
);
dc74HC85 DC2(
.Igt(Fgts[3]),
.Ilt(Flts[3]),
.Ieq(Feqs[3]),
.A(A[11:8]),
.B(B[11:8]),
.Fgt(Fgts[2]),
.Flt(Flts[2]),
.Feq(Feqs[2])
);
dc74HC85 DC1(
.Igt(Fgts[2]),
.Ilt(Flts[2]),
.Ieq(Feqs[2]),
.A(A[7:4]),
.B(B[7:4]),
.Fgt(Fgts[1]),
.Flt(Flts[1]),
.Feq(Feqs[1])
);
dc74HC85 DC0(
.Igt(Fgts[1]),
.Ilt(Flts[1]),
.Ieq(Feqs[1]),
.A(A[3:0]),
.B(B[3:0]),
.Fgt(Fgts[0]),
.Flt(Flts[0]),
.Feq(Feqs[0])
);
always@(*)begin
Fgt=Fgts[0];Flt=Flts[0];Feq=Feqs[0];
end
endmodule
仿真
//filename:tb_dc16bits.v
`timescale 1ns/1ns
module tb_dc16bits;
reg Igt,Ilt,Ieq;
reg [15:0]A,B;
wire Fgt,Flt,Feq;
//实例化16位数值比较器
dc16bits dc16bits_inst(
.Igt(Igt),
.Ilt(Ilt),
.Ieq(Ieq),
.A(A),
.B(B),
.Fgt(Fgt),
.Flt(Flt),
.Feq(Feq)
);
initial begin
Igt=1;Ilt=0;Ieq=0;A=16'h0000;B=16'h1111;
#1
Igt=0;Ilt=1;Ieq=0;A=16'h0111;B=16'h0011;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0000;B=16'h0000;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0001;B=16'h0000;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h1000;B=16'h0110;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0010;B=16'h1101;
#1
;
end
endmodule
并行接法
思路
考虑到芯片实际使用过程中的延迟问题,采取并行接法,同时比较4组数据,并把4组数据的比较结果传入最终结果,起到以空间换时间的效果
程序设计
//filename:dc16bits_pa.v
module dc16bits_pa(
input Igt,Ilt,Ieq,
input [15:0]A,B,
output reg Fgt,Flt,Feq
);
/*电路功能描述
16位数值比较器
*/
/*端口功能描述
Igt,Ilt,Ieq:扩展输入端,上一级的输出做为输入,便于级联
A,B:输入两个16位需要比较的数值,前者与后者关系
Fgt,Flt,Feq:上一级的结果联合A与B比较结果
*/
wire [4:0] Lgts,Llts,Leqs;
supply1 VCC;
supply0 GND;
//实例化74HC85:4位数值比较器DC3,DC2,DC1,DC0
dc74HC85 DC3(
.Igt(GND),
.Ilt(GND),
.Ieq(VCC),
.A(A[15:12]),
.B(B[15:12]),
.Fgt(Lgts[3]),
.Flt(Llts[3]),
.Feq(Leqs[3])
);
dc74HC85 DC2(
.Igt(GND),
.Ilt(GND),
.Ieq(VCC),
.A(A[11:8]),
.B(B[11:8]),
.Fgt(Lgts[2]),
.Flt(Llts[2]),
.Feq(Leqs[2])
);
dc74HC85 DC1(
.Igt(GND),
.Ilt(GND),
.Ieq(VCC),
.A(A[7:4]),
.B(B[7:4]),
.Fgt(Lgts[1]),
.Flt(Llts[1]),
.Feq(Leqs[1])
);
dc74HC85 DC0(
.Igt(GND),
.Ilt(GND),
.Ieq(VCC),
.A(A[3:0]),
.B(B[3:0]),
.Fgt(Lgts[0]),
.Flt(Llts[0]),
.Feq(Leqs[0])
);
dc74HC85 DC4(
.Igt(Igt),
.Ilt(Ilt),
.Ieq(Ieq),
.A(Lgts),
.B(Llts),
.Fgt(Lgts[4]),
.Flt(Llts[4]),
.Feq(Leqs[4])
);
always@(*)begin
Fgt=Lgts[4];Flt=Llts[4];Feq=Leqs[4];
end
endmodule
仿真
//filename:tb_dc16bits_pa.v
`timescale 1ns/1ns
module tb_dc16bits_pa;
reg Igt,Ilt,Ieq;
reg [15:0]A,B;
wire Fgt,Flt,Feq;
//实例化16位数值比较器
dc16bits_pa dc16bits_pa_inst(
.Igt(Igt),
.Ilt(Ilt),
.Ieq(Ieq),
.A(A),
.B(B),
.Fgt(Fgt),
.Flt(Flt),
.Feq(Feq)
);
initial begin
Igt=1;Ilt=0;Ieq=0;A=16'h0000;B=16'h1111;
#1
Igt=0;Ilt=1;Ieq=0;A=16'h0111;B=16'h0011;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0000;B=16'h0000;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0001;B=16'h0000;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h1000;B=16'h0110;
#1
Igt=0;Ilt=0;Ieq=1;A=16'h0010;B=16'h1101;
#1
;
end
endmodule