verilog仿真——数值比较器74HC85

任务

  • 实现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位数值比较器

串行接法

思路

将上一级的比较结果传递下去,级联最后一级得到最终结果.

同样将最初的输入端保留,以便更多数位级联

《数电》康华光P189

程序设计

//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‘b->16’h),因此得出的波形相同则正确

并行接法

思路

考虑到芯片实际使用过程中的延迟问题,采取并行接法,同时比较4组数据,并把4组数据的比较结果传入最终结果,起到以空间换时间的效果

《数电》康华光P189

程序设计

//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
同样的波形,证明作用一致

Leave a comment

Your email address will not be published. Required fields are marked *