逻辑运算和算术运算
一、 实验目的
用if-else语句或case语句实现对两个四位向量A,B的l逻辑运算和算术运算。通过实验熟悉实现数据逻辑运算、算术运算的方法。
① 当M=0时对A,B进行逻辑运算:对A取反,A和B的按位与运算,A和B的按位或运算,A与B的异或运算。
② 当M=1时,对A,B进行算数运算:A+B+Cin或A-B-Cin
二、 实验内容
1. 实验流程
① 分析实验需要实现的功能:在控制信号控制下完成对A,B的逻辑运算和算术运算。本实验的关键在于理清逻辑顺序,用verilog语言将在不同条件实现不同运算表达出来。
② 实验中M用于区分A,B进行逻辑运算或算术运算。
③ 逻辑运算又分为四种运算,可以用一个2-4译码器来实现,这里需要一个2位向量。
④ 算术运算分为两种运算,也可以用逻辑运算中的2位向量控制,增加default表示无效输出。
⑤ 算数运算中可能产生进位,输出中除四位输出结果,还需增加一位进位输出。
⑥ 根据上诉理论分析写出verilog代码,并上板验证功能。
2. Verilog代码分析
(1) Design source(.v文件):
module lab4(
input [3:0]A,
input [3:0]B,
input [1:0]S,
input M,
input Cin,
output reg Cout,
output reg [3:0] F
);
always@(*)
begin
if(M==0)
begin
case(S)
2'b00: F=~A;
2'b01: F=A&B;
2'b10: F=A|B;
2'b11: F=A^B;
endcase
Cout=0;
end
else
begin
case(S)
2'b00: {Cout,F}=A+B+Cin;
2'b01: {Cout,F}=A-B-Cin;
default: {Cout,F}=5'b11111;//输出无效,全亮
endcase
end
end
endmodule
.v分析:
① input两个四位向量A,B作为运算输入的两个对象
② input两位向量控制信号S,用于在逻辑运算和算术运算中选择具体运算种类
③ input 信号M用于选择逻辑运算类或算术运算类
④ input 数Cin,参与A,B的算术运算
⑤ output 一个4位向量作为逻辑运算的结果或算术运算的部分结果
⑥ output 一个进位Count,作为算术运算的进位
⑦ 在always语句中,通过if-else语句对M的值进行判断,当M为0时进入逻辑运算类,M不为0时进入算术运算类。
⑧ 在逻辑运算类和算术运算类中,分别用case语句,根据S的值进行对应运算,其中算术运算中用拼接符将进位信号和本位输出进行串行进位赋值。
(2) Constraints source(.xdc文件)
##switches
set_property PACKAGE_PIN J15 [get_ports A[0]]
set_property IOSTANDARD LVCMOS33 [get_ports A[0]]
set_property PACKAGE_PIN L16 [get_ports A[1]]
set_property IOSTANDARD LVCMOS33 [get_ports A[1]]
set_property PACKAGE_PIN M13 [get_ports A[2]]
set_property IOSTANDARD LVCMOS33 [get_ports A[2]]
set_property PACKAGE_PIN R15 [get_ports A[3]]
set_property IOSTANDARD LVCMOS33 [get_ports A[3]]
set_property PACKAGE_PIN R17 [get_ports B[0]]
set_property IOSTANDARD LVCMOS33 [get_ports B[0]]
set_property PACKAGE_PIN T18 [get_ports B[1]]
set_property IOSTANDARD LVCMOS33 [get_ports B[1]]
set_property PACKAGE_PIN U18 [get_ports B[2]]
set_property IOSTANDARD LVCMOS33 [get_ports B[2]]
set_property PACKAGE_PIN R13 [get_ports B[3]]
set_property IOSTANDARD LVCMOS33 [get_ports B[3]]
set_property PACKAGE_PIN T8 [get_ports Cin]
set_property IOSTANDARD LVCMOS33 [get_ports Cin]
set_property PACKAGE_PIN U8 [get_ports M]
set_property IOSTANDARD LVCMOS33 [get_ports M]
set_property PACKAGE_PIN R16 [get_ports S[0]]
set_property IOSTANDARD LVCMOS33 [get_ports S[0]]
set_property PACKAGE_PIN T13 [get_ports S[1]]
set_property IOSTANDARD LVCMOS33 [get_ports S[1]]
##led
set_property PACKAGE_PIN H17 [get_ports F[0]]
set_property IOSTANDARD LVCMOS33 [get_ports F[0]]
set_property PACKAGE_PIN K15 [get_ports F[1]]
set_property IOSTANDARD LVCMOS33 [get_ports F[1]]
set_property PACKAGE_PIN J13 [get_ports F[2]]
set_property IOSTANDARD LVCMOS33 [get_ports F[2]]
set_property PACKAGE_PIN N14 [get_ports F[3]]
set_property IOSTANDARD LVCMOS33 [get_ports F[3]]
set_property PACKAGE_PIN R18 [get_ports Cout]
set_property IOSTANDARD LVCMOS33 [get_ports Cout]
.xdc分析:
① “#”代表被注释的引脚。
② 每个引脚两行语句:第一行代表引脚在实验板上的位置;第二行代表输入输出标准电平3.3V
③ 引脚锁定文件使用到的引脚名称与design source中所使用到变量名称相对应
④ 本次实验中用到12个输入端口,其中9位端口用于输入参与运算的数据,3位端口用于输入决定具体运算类型的控制向量
(3) Elaborated design:
三、 实验结论
通过本次实验,我掌握了通过控制信号进行多种不同运算操作的方法。在逻辑运算中,根据逻辑运算的具体种类数目,可以译码器原理决定控制信号位数。本次实验中为了减少端口的使用,算术运算没有另增一个控制信号而是利用逻辑运算中的S信号,通过M进行区别。整个实验中,M与S相结合,实现了对运算操作种类的选择
四、思考与讨论
(一)实验感想:
本次实验让我利用了对verilog语言中的if-else语法和case语法有了更加熟练的运用,同时通过verilog理清了具备多种功能电路的逻辑思路。