一. 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。