目录
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