1
module mux2_1
(
input wire in_1,
input wire in_2,
input wire sel,
output reg output);
// 1 always 与 if else 相结合
always @(*) being // 相当于(sel, in_1, in_2)
if(sel == 1'b1) begin
out = in_1;
end
else begin
out = in_2;
end
end
// 2 always 与 case 相结合
always @(*) begin
case (sel)
1'b1: out = in_1;
1'b0: out = in_0;
default: out = in_1;
endcase
end
// 3 out 组合逻辑输出选择结果
assign out = (sel == 1'b1) ? in1: in2;
endmodule
tb_module
'timescale 1ns/1ns
module tb_mux_2_1();
// 仿真文件对输入信号的模拟
reg in_1;
reg in_2;
reg sel;
wire output;
initial begin
in_1 <= 1'b0;
in_2 <= 1'b0;
sel <= 1'b0;
end
always #10 in_1 <= {$random} % 2; // 每隔10ns对in_1进行赋值,有可能是0或者1
always #10 in_2 <= {$random} % 2; // 每隔10ns对in_2进行赋值,有可能是0或者1
always #10 sel <= {$random} % 2; // 每隔10ns对sel进行赋值,有可能是0或者1
initial begin
$timeformat(-9, 0, "ns", 6); // 小数点后面的位数
$monitor("@time %t:in_1=%b, in_2=%b, sel=%b, out=%b", $time, in_1, in_2, sel, out);
end
// 实例化
mux2_1 mux2_1_inst
(
.in_1(in_1);
.in_2(in_2);
.sel(sel);
.out(out);
);
endmodule
方式2
实现38译码器,按键输入,3个按键,8个LED灯。
module decoder
(
input wire in_1,
input wire in_2,
input wire in_3,
ouput reg [7:0]out // always语句赋值肯定是reg型 assign语句赋值一定是wire型
);
// 方式1 if else 会有优先级
always@(*) // 组合逻辑
if({in_1,in_2,in_3} == 3'b0000)
out = 8'b0000_0001;
else if({in_1,in_2,in_3} == 3'b0001)
out = 8'b0000_0010;
...
else
out = 8'b0000_0001;
// 方式2 case 在任何时候都不会存在优先级,只判断case中的条件
always@(*) // 组合逻辑
case({in_1,in_2,in_3})
3'b000: out = 8'b0000_0001;
...
default: out = 8'b0000_0001;
endcase
endmodule
if else
case
`timescale 1ns/1ns
module tb_decoder();
// 使用always 和initial
reg in_1;
reg in_2;
reg in_3;
wire [7:0] out;
initial begin
in_1 <= 1'b0;
in_2 <= 1'b0;
in_3 <= 1'b0;
end
always #10 in_1 <= {$random} % 2;
always #10 in_2 <= {$random} % 2;
always #10 in_3 <= {$random} % 2;
initial begin
$timeformat(-9, 0, "ns", 6); // 小数点后面的位数
$monitor("@time %t:in_1=%b, in_2=%b, in_3=%b, out=%b", $time, in_1, in_2, in_3, out);
end
decoder decoder_inst
(
.in_1(in_1),
.in_2(in_2),
.in_3(in_3),
.out(out) // always语句赋值肯定是reg型 assign语句赋值一定是wire型
);
使用按键和LED灯实现
1 模块框图
2 真值表
3 波形图
module half_adder
(
input wire in_1,
input wire in_2,
ouput wire sum,
ouput wire count
);
assign {count, sum} = in_1 + in_2;
endmodule
仿真文件编写:
`timescale 1ns/1ns
module tb_half_adder();
reg in_1;
reg in_2;
wire sum;
wire count;
initial begin
in_1 <= 1'b0;
in_2 <= 1’b0;
end
always #10 in_1 <= {$random} % 2;
always #10 in_2 <= {$random} % 2;
initial begin
$timeformat(-9, 0, "ns", 6); // 小数点后面的位数
$monitor("@time %t:in_1=%b, in_2=%b, count=%b, sum=%b", $time, in_1, in_2, count, sum);
end
half_adder half_adder_inst
(
.in_1(in_1),
.in_2(in_2),
.sum(sum),
.count(count) // always语句赋值肯定是reg型 assign语句赋值一定是wire型
);
endmodule