1 多路选择器
2 实战演练(二选一多路选择器)
2.1 设计规划
1
2.2 波形绘制
2.3 代码编写编译
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.4 波形仿真和对比
2.5 绑定管教和布局布线
方式2
2.6 上版验证通过
3 译码器
4 实战演练(译码器)
实现38译码器,按键输入,3个按键,8个LED灯。
4.1 设计规划
4.2 波形绘制
4.3 代码编写和编译
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
4.4 逻辑仿真和波形对比
`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型
);
4.5 绑定管教分析综合
4.6 上板测试
5 半加器
5.1 理论学习
使用按键和LED灯实现
5.2 实战演练
5.2.1 设计规划
5.2.2 波形绘制
1 模块框图
2 真值表
3 波形图
5.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
5.2.4 波形仿真和对比
5.2.5 绑定管教分析综合