先是编写源文件,我习惯把他的名字与项目名称统一
decoder_3_8.v
/*
模块思路是输入abc,输出8选1,先定义各个端口,考虑到输出有多个选择所以用[7:0]
*/
module decoder_3_8(
a,
b,
c,
out
);
input a;
input b;
input c;
output out;//注意在always中必须使用reg变量,所以还要把out转为reg型变量否则就是wire
reg [7:0]out;
always@(a,b,c)
begin
case({a,b,c})
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;
endcase
end
endmodule
接下来是仿真文件(Test Bench文件)
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// timescale是时间单位/精度,若为1ns/100ps,那么#100就是延时100ns,并且可以延时100.1ns因为100ps是0.1ns
// Create Date: 2024/02/25 15:46:32
//////////////////////////////////////////////////////////////////////////////////
//在仿真文件中不需要外部端口了,只需要自己定义端口并施加激励,所以在模块名旁边括号不加参数了
//在仿真中输入类型定义为reg,输出定义为wire,自定义端口名可以和前面的端口名称一样,注意位数也要一致
module decoder_3_8_tb();
reg a;
reg b;
reg c;
wire [7:0] out;
//接下来是例化,格式:原模块名 自定义名(.变量(原模块变量))我觉得目的就是让自定义信号能对应上逻辑
decoder_3_8 decoder(
.a(a),
.b(b),
.c(c),
.out(out)
);
//开始给予激励
initial begin
a = 0;b = 0;c = 0;
#200;
a = 0;b = 0;c = 1;
#200;
a = 0;b = 1;c = 0;
#200;
a = 0;b = 1;c = 1;
#200;
a = 1;b = 0;c = 0;
#200;
a = 1;b = 0;c = 1;
#200;
a = 1;b = 1;c = 0;
#200;
a = 1;b = 1;c = 1;
#200;
$stop;//停止仿真
end
endmodule