FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

目录

一、验证与门

二、验证与非门

三、验证二选一数据选择器

四、验证2-4译码器

五、验证半加器

六、验证全加器

0、初始化定义

1、第一个半加器 

2、第二个半加器

3、得到最终进位Co

代码


0决定与,1决定或

一、验证与门

 只要有一个按键按下,结果即为低电平,灯亮。

assign led1 = key1&key2;		//与门(只要有一个按键按下,则结果为低电平,灯亮)
//验证与门、与非门
module my_and			//my_and:文件名称
(			
//1、配置输入输出变量
input wire key1,		//输入引脚key1
input wire key2,		//输入引脚key2
output wire led1,		//输出引脚led1
output wire led2		//输出引脚led2
);

//2、变量赋值
assign led1 = key1&key2;		//与门(只要有一个按键按下,则结果为低电平,灯亮)
//assign led2 = !(key1&key2);	//与非门(没有按键按下,全为1,结果取反,为0,,灯亮)

endmodule

二、验证与非门

 两个数相与,取反。

只有无按键按下的情况,两个按键都为1,相与结果为1,再取反为0,最终的电平点亮灯。(有任何一个按键按下,灯都不会亮了)

assign led2 = !(key1&key2);	//与非门(没有按键按下,全为1,结果取反,为0,,灯亮)
//验证与门、与非门
module my_and			//my_and:文件名称
(			
//1、配置输入输出变量
input wire key1,		//输入引脚key1
input wire key2,		//输入引脚key2
output wire led1,		//输出引脚led1
output wire led2		//输出引脚led2
);

//2、变量赋值
//assign led1 = key1&key2;		//与门(只要有一个按键按下,则结果为低电平,灯亮)
assign led2 = !(key1&key2);	//与非门(没有按键按下,全为1,结果取反,为0,,灯亮)

endmodule

三、验证二选一数据选择器

 

sl是筛选端,a和b是两个输入端。 

//二选一数据选择器
module my_and(led1, key1, key2, key3);

input wire key1, key2, key3;	//输入:a、b、s
output reg led1;					//输出(y/out)

always@(key1, key2, key3)
begin 
	//使能按下
	if(!key3)
		led1 = key1;
	else
		led1 = key2;
end
endmodule

四、验证2-4译码器

  

2-4:通过1+2个按键和4个led灯来实现。

首先进行使能。(使能按键E)

两个按键四种状态:00、01、10、11

按键00:1(led1亮)
按键01:2(led2亮)
按键10:3(led3亮)
按键11:4(led4亮)

//2-4线译码器
module my_and(key, led, E);

input wire[1:0] key;				//定义两个key数组
input wire E;						//定义使能按键
output reg[3:0] led=4'b1111;	//定义四个led数组(赋初值1)(熄灭led)

always@(key)
	//使能按键按下
	if(!E)
		begin
			case(key)
				2'b00: led = 4'b0111;	//按键00:1(led1亮)
				2'b01: led = 4'b1011;	//按键01:2(led2亮)
				2'b10: led = 4'b1101;	//按键10:3(led3亮)
				2'b11: led = 4'b1110;	//按键11:4(led4亮)
				default: led = 4'b1111;	//led全灭(出错)
			endcase
		end

endmodule

五、验证半加器

半加器:对两个输入数据位相加,输出一个结果位和进位。

结果:S = A ^ B(S=A异或B)

进位:C = A & B(C=A与B)

定义2个按键输入:A、B(分别代表两个输入A、B) 

定义2个LED输出:S、C(分别代表本位结果S、进位C)

//验证半加器
module my_and(A, B, S, C);

input wire A, B;		//定义两个输入
output wire S, C;		//定义结果、进位输出

assign S = A^B;		//本位结果S=A异或B
//二进制只有0+1 或 1+0 才有结果1;否则1+1或者0+0,当前位都为0

assign C = A&B;		//进位C=A与B
//二进制只有1+1 才会出现进位

endmodule

六、验证全加器

全加器:两个半加器连接而成。 

 

标注了1级和2级半加器: 

 (红色标记是容易连错的地方)

 

A、B、CI为输入,结果位S、进位CO为输出

利用模块实例化,分别实例化两个半加器,最终组合为全加器

0、初始化定义

定义输入输出引脚变量。 

//全加器(两个半加器连接)
module my_and(A, B, Ci, S, Co);

//变量定义
input wire A, B, Ci;		//输入1、输入2、低端进位(输入3)
output wire S, Co;		//结果输出位、总进位

1、第一个半加器 

        两个按键key1、key2分别代表A、B,作为两个输入。 最终得到的结果位作为A2(第二个,即后面的那个半加器),得到进位作为C1

注:模块实例化,输入是传入(赋值进去),输出是传出来(被赋值)。 

半加器half_adder只需把.v的文件放入文件夹即可(前面编写过)。

//模块实例化(此处采样端口关联)
//第一个半加器
half_adder half_adder1(.A(A), .B(B), .S(A2), 	  .C(C1));
//第一个半加器:				输入1  输入2  结果位(输出)   进位(输出)

2、第二个半加器

        A2是第一个的S结果位 ,作为第二个半加器的输入1,低端进位Ci对应的是按键key3,作为第二个半加器的输入2。分别得到最终的结果S、第二个半加器进位C2

//第二个半加器
half_adder half_adder2(.A(A2), .B(Ci),      .S(S), 		.C(C2));
//第二个半加器:				输入1  输入2(低端进位) 结果位(输出)  进位(输出)

3、得到最终进位Co

第二个半加器那里已经得到了最终的S结果位,所以现在只需要再处理最终的进位Co即可

把两个半加器的进位C1和C2组合(或)一下,即可得到最终进位Co:

//总进位
assign Co = C1 | C2;

代码

//全加器(两个半加器连接)
module my_and(A, B, Ci, S, Co);

//变量定义
input wire A, B, Ci;		//输入1、输入2、低端进位(输入3)
output wire S, Co;		//结果输出位、总进位

//模块实例化(此处采样端口关联)
//第一个半加器
half_adder half_adder1(.A(A), .B(B), .S(A2), 	  .C(C1));
//第一个半加器:				输入1  输入2  结果位(输出)   进位(输出)

//第二个半加器
half_adder half_adder2(.A(A2), .B(Ci),      .S(S), 		.C(C2));
//第二个半加器:				输入1  输入2(低端进位) 结果位(输出)  进位(输出)

//注:和输入端口相关联时,传入值(赋值进去);
//		和输出端口相关联时,传出值(赋值出来)。

//总进位
assign Co = C1 | C2;

endmodule

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_(*^▽^*)_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值