FPGA/CPLD应用技术(Verilog语言版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

任务5 2位二进制数据比较器的设计

任务分析

在数字逻辑电路的设计中数据比较器占有很重要的位置,它被用来比较两个二进制数的数值关系,即假设有两个二进制数A和B,比较A>B、A<B还是A=B,输出比较结果。

图2.16 2位二进制数据比较器电路符号

本任务是要设计一个2位的二进制数据比较器。该电路应有两个数据输入端口A、B,每个端口的数据宽度为2位,分别设为A0、A1和B0、B1,A0、B0为数据低位,A1、B1为数据高位。电路的输出端口分别为EQ(A=B时的输出信号)、LG(A>B时的输出信号)和SM(A<B时的输出信号)。电路符号如图2.16所示,真值表如表2.12所示。

表2.12 2位二进制数据比较器真值表

分析以上真值表,画出三个输出端口EQ、LG和SM与输入端口A0、A1、B0、B1的关系卡诺图如图2.17、图2.18和图2.19所示。

图2.17 EQ的卡诺图

图2.18 LG的卡诺图

图2.19 SM的卡诺图

由图2.17所示的卡诺图可以得出输出端口EQ的逻辑表达式如下:

由图2.18所示的卡诺图可以得出输出端口LG的逻辑表达式如下:

由图2.19所示的卡诺图可以得出输出端口SM的逻辑表达式如下:

根据这些逻辑表达式,可以设计出一个2位数据比较器的逻辑电路,如图2.20所示。

图2.20 2位数据比较器逻辑电路

代码设计

下面采用不同的Verilog HDL描述方式来进行2位二进制数据比较器逻辑电路的设计。

(1)用Verilog HDL的结构级描述方式,描述图2.20所示的2位数据比较器电路模块的程序代码comp_2_ex1.v如下:

// 2位数据比较器——采用结构描述方式
//comp_2_ex1.v
module comp_2_ex1(           //定义2 位数据选择器模块comp_2_ex1
A0,                          //模块的外部输入/输出端口列表
A1,
B0,
B1,
EQ,
LG,
SM
);
input A0,A1,B0,B1;           //A0、A1和B0、B1为输入端口
output EQ,LG,SM;             //EQ、LG和SM为输出端口
wire [3:0]la;              //定义电路中四个非门的输出连线
wire [9:0]lb;              //定义电路中十个与门的输出连线
not U1 (la[0],A[0]),
    U2 (la[1],A[1]),
U3 (la[2],B[0]),
    U4 (la[3],B[1]);
and U5 (lb[0],la[0],la[1],la[2],la[3]),
    U6 (lb[1],A0,la[1],B0,la[3]),
    U7 (lb[2],la[0],A1,la[2],B1),
    U8 (lb[3],A0,A1,B0,B1),
    U9 (lb[4],A0,la[1],la[3]),
U10 (lb[5],A0,A1,la[2]),
U11 (lb[6],A1,la[3]),
U12 (lb[7],la[0],B0,B1),
U13 (lb[8],la[0],la[1],B0),
U14 (lb[9],la[1],B1);
or  U15 (EQ,lb[0],lb[1],lb[2],lb[3]),
    U16  (LG,lb[4],lb[5],lb[6]),
    U17  (SM,lb[7],lb[8],lb[9]);
endmodule

这个2位比较器电路的输出端口“EQ”的逻辑表达式还可以简化如下:

这个表达式中使用了两个与或门来实现输出端EQ的逻辑功能,电路结构如图2.21所示。

小经验

从这个电路的结构级建模过程很容易看出:当逻辑电路的规模加大时,所需的门电路增加,门电路之间的内部连接线也会大大增加,采用电路结构的描述方式来设计将会非常烦琐,工作量大大增加。此时采用数据流描述方式或行为描述方式来完成电路的建模,能有效提高系统设计的效率,缩短设计周期,降低设计成本。

图2.21 简化的2位数据比较器逻辑电路

(2)用Verilog HDL的数据流描述方式实现2位数据比较器电路模块,代码如下:

//2位数据比较器——采用数据流描述方式
//comp_2_ex2.v
module comp2_ex2(
A,
B,
EQ,
LG,
SM
);
input [1:0]A,B;            //输入端口A、B,它们的数据宽度为2位
output EQ,LG,SM;             //EQ、LG和SM为输出端口
assign EQ=(A==B)?1′b1:1′b0;
assign LG=(A>B)?1′b1:1′b0;
assign SM=(A<B)?1′b1:1′b0;
endmodule

(3)用Verilog HDL的always过程块的行为描述方式实现2位数据比较器电路,代码如下:

//2位数据比较器——采用行为描述方式
//comp_2_ex3.v
module comp_2_ex3(
A,
B,
EQ,
LG,
SM
);
input [1:0]A,B;      //输入端口A、B,它们的数据宽度为2位
output EQ,LG,SM;       //EQ、LG和SM为输出端口
reg EQ,LG,SM;
  always@(A or B)
   begin
        if(A==B)
            begin
              EQ<=1′b1;
              LG<=1′b0;
              SM<=1′b0;
            end
        else if(A>B)
            begin
              EQ<=1′b0;
              LG<=1′b1;
              SM<=1′b0;
            end
        else
            begin
              EQ<=1′b0;
              LG<=1′b0;
              SM<=1′b1;
            end
        end
endmodule

任务实现

下面以代码comp_2_ex3.v为例来说明用Verilog HDL描述方式进行2位数据比较器电路设计的基本步骤。

1.新建工程

启动Quartus Ⅱ软件,在“File”下拉菜单中选取“New Project Wizard”选项,新建工程comp_2_ex3。

2.设计输入

(1)在“File”下拉菜单中选取“New”,选择设计文件“Design Files”列表中的“Verilog HDL File”输入类型,单击“OK”按钮进入Verilog文本编辑界面。

(2)在Verilog文本编辑器中输入comp_2_ex3.v程序代码,输入完成后,执行主菜单“File”下的“Save As”命令,将程序文件保存在所创建的工程目录中,文件名为comp_2_ex3.v。

3.工程编译

选择菜单“Processing”下的“Start Compilation”选项,或者单击位于工具栏的编译按钮,完成工程的编译。

4.设计仿真

(1)建立波形文件。执行“File”菜单下的“New”命令,在弹出的窗口中选择“Other Files”下的“Vector Waveform File”选项,新建仿真波形文件。在波形文件编辑窗口中,单击“File”菜单下的“Save as”选项,将该波形文件另存为“comp_2_ex3.vwf”。

(2)添加观察信号。在波形文件编辑窗口的左边空白处单击鼠标右键,选择“Insert”选项下的“Insert Node or Bus”命令,在该窗口下单击“Node Finder”按钮,在“Node Finder”窗口中单击“List”按钮,设计的4个引脚出现在左边的空白窗口,选中所有引脚,单击窗口中间的“》”按钮,4个引脚出现在窗口的右边空白处,再单击“OK”按钮回到波形编辑窗口。

(3)添加激励。通过拖曳波形,产生想要的激励输入信号。

(4)功能仿真。添加完激励信号后,保存波形文件。选择“Processing”菜单下的“Simulator Tool”选项,在“Simulation mode”选项框中选择“Functional”命令,再单击“Generate Functional Simulation Netlist”按钮,产生仿真需要的网表文件,然后选中“Overwrite simulation input file with simulation result”,否则不能显示仿真结果,单击“Start”按钮进行仿真。

仿真完成后,单击“Open”按钮打开仿真结果,如图2.22所示,2位数据比较器电路模块逻辑功能正确。

图2.22 2位数据比较器功能仿真结果

(5)时序仿真。将仿真工具对话框中的“Simulation mode”选为“Timing”模式,进行时序仿真,仿真结果如图2.23所示。

图2.23 2位数据比较器时序仿真结果

任务小结

本任务是让读者了解数据比较器电路的Verilog HDL设计方法,并加深理解用数据流描述方法及行为描述方法进行数字系统设计的优势,可以缩短开发时间、提高设计效率。在2位数据比较器的行为描述程序模块中,我们还学习使用了“if…else…”条件语句。