Verilog实现基本的组合逻辑电路

一. 3-8译码器

1. 模块框图:

只需一个模块decoder3-8。

2.  3-8译码器的真值表:

3. 程序设计:(利用case语句设计实现)

decoder3-8模块:

module decoder3_8
(

	input 	wire		in1	,
	input 	wire		in2	,
	input 	wire		in3 ,
	output	reg  [7:0] 	out

);

always@(*)
	begin
		case( {in3, in2, in1} )
			3'b000: out = 8'b0000_0001;
			3'b001: out = 8'b0000_0010;
			3'b010: out = 8'b0000_0100;
			3'b011: out = 8'b0000_1000;
			3'b100: out = 8'b0001_0000;
			3'b101: out = 8'b0010_0000;
			3'b110: out = 8'b0100_0000;
			3'b111: out = 8'b1000_0000;
			default:out = 8'b0000_0001;
		endcase
	end
	
	
endmodule

编写的testbench仿真文件:

`timescale 1ns/1ns

module tb_decoder3_8();

reg 		in1	;
reg 		in2	;
reg 		in3 ;
wire [7:0]	out ;

initial 
	begin
		in1 <= 1'b0;
		in2 <= 1'b0;
		in3 <= 1'b0;
	end
	
always #10 in1 <= {$random} % 2;

always #10 in2 <= {$random} % 2;

always #10 in3 <= {$random} % 2;

decoder3_8 decoder3_8_inst
(

	.in1	(in1	),
	.in2	(in2	),
	.in3 	(in3	),
	.out	(out	) 

);
 
endmodule

4. 仿真结果波形如下:

二. 数据选择器

1. 模块框图:

2. 真值表:

3. 程序设计:

(1) 可用always中if-else语句实现;

(2) 可用always case语句实现;

(3) 可用assign语句以及三元运算符实现;

module MUX2_1
(

	input	wire 		in1	,
	input 	wire 		in2	,
	input 	wire 		sel ,
	
	output 	reg 		out

);



always@(*)
	begin
		if( sel == 1'b1 )
			out = in1 ;
		else
			out = in2 ;
	end

//case语句实现:

/*always@(*)
	begin
		case(sel)
			1'b0: in2;
			1'b1: in1;
			default: 1'bz;
		endcase
	end*/
	
//assign 三元运算符实现

//assign out = (sel==1'b1) ? in1:in2;
	

endmodule

testbench仿真文件的编写: 

`timescale 1ns/1ns

module tb_MUX2_1();

reg 	in1	;
reg 	in2	;
reg 	sel	;

wire 	out ;

initial
	begin
		in1 = 1'b0 ;
		in2 = 1'b1;
		sel = 1'b0 ;
	end


always #10 in1 <= {$random} % 2;

always #10 in2 <= {$random} % 2;

always #10 sel <= {$random} % 2;




MUX2_1 MUX2_1_inst
(

	.in1	(in1	),
	.in2	(in2	),
	.sel 	(sel	),
	.out	(out	)

);

		
endmodule

4. 仿真波形:

功能正确无误。

三. 半加器 全加器

1. 半加器全加器的模块图:

(全加器利用半加器可以实现)

2. 真值表:

半加器:

全加器:

3. 程序设计:

(1)半加器:

可用always case语句实现,也可以直接用assign语句实现;

module half_adder
(
	input 	wire	in1		,
	input	wire	in2 	,
	
	output 	wire	sum		,
	output	wire	count	
);

/*always@(*)
	begin
		case({ in1, in2 })
			2'b00: sum = 1'b0 ;
			2'b01: sum = 1'b1 ;
			2'b10: sum = 1'b1 ;
			2'b11: sum = 1'b0 ;
		endcase
	end

assign count = in1 & in2 ;*/

assign { count, sum } = in1 + in2 ;

endmodule

(2)全加器(通过调用半加器模块实现):

module full_adder
(
	input 	wire	in1		,
	input 	wire	in2		,
	input	wire	cin		,
	
	output	wire	sum		,
	output	wire	count	
);

wire 	sum0	;
wire 	count0	;
wire 	count1	;

half_adder u0
(
		.in1		(in1	),
        .in2 		(in2	),
        
        .sum		(sum0	),
        .count		(count0 )

);

half_adder u1
(
		.in1		(sum0	),
        .in2 		(cin	),
        
        .sum		(sum	),
        .count		(count1 )
); 

assign count = (count1 | count0) ;

endmodule

testbench文件的编写:(此处只对全加器做仿真 半加器在其中可得到验证)

`timescale 1ns/1ns

module tb_full_adder();

reg 	in1		;
reg		in2		;
reg 	cin		;

wire	sum		;
wire	count	;

initial
	begin
		in1 <= 1'b0	;
		in2 <= 1'b0	;
		cin <= 1'b0 ;
	end

always #10 in1 		<= {$random} % 2 ;
always #10 in2 		<= {$random} % 2 ;
always #10 cin	 	<= {$random} % 2 ;

full_adder full_adder_inst
(
	.in1	(in1 	),
	.in2	(in2	),
	.cin    (cin	),

	.sum	(sum	),
	.count	(count	)
);

endmodule

4. 仿真波形结果:

实现:sum = in1⊕in2⊕cin

           count = cin(in1⊕in2)+in1&in2。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是既白呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值