野火A7学习第三次(组合逻辑相关)

本文详细介绍了使用Verilog进行数字逻辑设计,包括2:1多路选择器的实现,通过if-else和case两种方式编写代码,并进行波形仿真。接着,介绍了3:8译码器的设计,同样展示了两种实现方法。最后,阐述了半加器的原理,并提供了代码实现及仿真过程。通过这些实例,深入理解数字逻辑设计的基础知识。
摘要由CSDN通过智能技术生成

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 绑定管教分析综合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.2.6 上板测试

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值