Verilog实现一些简单组合逻辑

加法器(4位)

代码:

//4位加法器
module jiafaqi(X,Y,sum,C);//4位加法器
input[3:0] X,Y;
output[3:0] sum;
output C;
assign {C,sum}=X+Y;
endmodule

测试代码:

//4位加法器测试代码
module jiafaqi_tb();
wire[3:0] sum;
reg[3:0] X,Y;
wire C;
initial
begin
	 X=4'b0010;Y=4'b1101;#50;//延时50ns
	 X=4'b1000;Y=4'b0001;#50;
	 X=4'b0100;Y=4'b0010;#50;
	 X=4'b1110;Y=4'b1111;#50;
end
jiafaqi u1(X,Y,sum,C);
endmodule

仿真结果:
Verilog实现一些简单组合逻辑_第1张图片感觉加法器没什么可以说的,输入X,Y;输出sum,C。
C是X+Y的进位。X,Y是本位,sum是本位和。
如果是n为加法器的话,把3改成n-1即可。

乘法器

类比加法器,8位二进制超前进位乘法电路可以用两个4位二进制超前进位乘法电路加上超前进位形成逻辑来构成。
同理,设计出16位,32位,64位乘法电路。

4位乘法器
//乘法器
module mult_4(X,Y,Product);
input[3:0] X;
input[3:0] Y;
output[7:0] Product;

assign Product=X*Y;
endmodule
//同样8位的乘法器把4改成8,3改成7,7改成15即可。

测试代码:

//乘法器测试代码
module mult_4_tb();
wire[7:0] Product;
reg[3:0] X;
reg[3:0] Y;
//开始赋值
initial
begin
	 X=4'b0010;Y=4'b1101;#50;
	 X=4'b1000;Y=4'b0001;#50;
	 X=4'b0100;Y=4'b0010;#50;
	 X=4'b1110;Y=4'b1111;#50;
end
mult_4 u1(X,Y,Product);
endmodule

不知道为什么我的乘法器看起来这么简陋。。。
仿真结果:

Verilog实现一些简单组合逻辑_第2张图片

比较器

代码:

//比较器
module compare_n(X,Y,XGY,XSY,XEY);
input[width-1:0] X,Y;//输入X,Y两个数
output XGY,XSY,XEY;//输出是X>Y,X
reg XGY,XSY,XEY;//寄存器类型
parameter width=8;//位宽8

always@(X or Y)//每当X或者Y变化时

begin
	if(X==Y)
	XEY=1;
	else XEY=0;
	if(X<Y)
	XSY=1;
	else XSY=0;
	if(X>Y)
	XGY=1;
	else XGY=0;
end

endmodule
//always块中必须要用reg型变量,所以equal申请为reg型,如果不使用always块,也可以申请为wire型,一般来说,模块的输出数据的类型设计为reg类型比较好

测试代码:

//比较器测试代码
module compare_n_tb();
parameter width=8;
reg[width-1:0] X;
reg[width-1:0] Y;
wire XGY;
wire XSY;
wire XEY;
initial
begin
	X=8'b0000_0001;
	Y=8'b0000_0101;//X
	
	#50 X=8'b0000_0100;
	#50 Y=8'b0000_0000;//X>Y
	
	#50 X=8'b1000_1100;
	#50 Y=8'b1000_1100;//X=Y
end
compare_n u1(X,Y,XGY,XSY,XEY);
endmodule

仿真结果:
Verilog实现一些简单组合逻辑_第3张图片电路图,这里我也不是很清楚这个电路图是干啥的,没用过
Verilog实现一些简单组合逻辑_第4张图片顺带一提,modelsim有些bug真的对新手很不友好。。。。

你可能感兴趣的:(verilog,verilog,fpga)