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

任务4 基于HDL实现的2选1数据选择器设计

任务分析

在第1章任务2中,采用原理图输入方式实现了2选1数据选择器,这里将其改为用Verilog HDL来完成设计。2选1数据选择器的相关说明资料可参考任务2。

任务实现

1.2选1数据选择器电路模块的描述

如前所述,我们可以用Verilog HDL在不同的层次级别、采用不同的描述方式来完成逻辑电路的设计,2选1数据选择器电路如图2.8所示。

图2.8 由基本门电路组成的2选1数据选择器

(1)用Verilog HDL的结构级描述方式,描述图2.8所示的2选1数据选择器电路模块。代码如下:

//采用结构级方式描述2选1数据选择器
//mux2_1_ex1.v
module mux2_1_ex1(               //定义2选1数据选择器mux2_1_ex1
P0,                              //模块的外部输入/输出端口列表
P1,
S,
F
);
input P0,P1,S;                   //P0、P1和S为输入端口
output F;                        //F为输出端口
wire not_S,andcntrl1,andcntrl2;  //关键字wire表示连线数据类型,定义
                                 //了电路中各个门原语之间的连接线
not U1 (not_S,S);
and U2 (andcntrl1,P0,not_S),
    U3 (andcntrl2,P1,S);
or  U4 (F,andcntrl1,andcntrl2);
endmodule

小提示

上面代码中的not、and和or分别是非门、与门和或门的门级原语。具体介绍请参考任务3。

(2)用Verilog HDL的行为级数据流描述方式,描述2选1数据选择器电路模块。代码如下:

//采用数据流方式描述2选1数据选择器
//mux2_1_ex2.v
module mux2_1_ex2(
P0,
P1,
S,
F
);
input P0,P1,S;        //P0、P1和S为输入端口
output F;             //F为输出端口
assign F=S&P0|S&P1;   //逻辑表达式
F=S·P0|S·P1,其中符号“”表示非,
                      //“ &”表示与,“|”表示或操作
endmodule

(3)用Verilog HDL的always过程块的行为描述方式,描述2选1数据选择器电路模块。代码如下:

//采用行为描述方法描述2选1数据选择器
//mux2_1_ex3.v
module mux2_1_ex3(
P0,
P1,
S,
F
);
input P0,P1,S;             //P0、P1和S为输入端口
output F;                  //F为输出端口
reg F;                     //关键字reg表示一种暂存的数据类型,说明输出信号F
                           //需要在always语句块中得到赋值
always@(P0 or P1 or S)
   begin
       if(S==1′b0)F=P0;  //if条件分支语句,如果选择端S为0电平,则输出端F上输出
       else F=P1;          //的是输入信号P0的状态;否则如果S为1电平,输出端F上
                           //输出的是P1的状态
   end
endmodule

小提示

代码设计时往往需要根据给定的条件进行判断,从而选择不同的处理手段。对给定的条件进行判断,并根据判断结果选择应执行的操作的代码,称为选择结构代码。在Verilog语言中,选择结构代码设计一般用if语句或case语句来实现,对这两种分支语句的具体介绍请参看第2.5节。

2.2选1数据选择器电路设计的基本步骤

用Verilog HDL描述方式进行2选1数据选择器电路设计按以下步骤进行。

(1)新建工程。

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

(2)设计输入。

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

② 在Verilog文本编辑器中输入mux2_1_ex2.v代码,输入完成后,选择“File”菜单下的“Save As”选项,将代码文件保存在所创建的工程目录中,文件名为mux2_1_ex2.v,见图2.2所示。

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

(4)设计仿真。

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

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

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

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

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

图2.9 采用Verilog HDL设计的2选1数据选择器功能仿真结果

⑤ 时序仿真。在仿真工具对话框中的“Simulation mode”选为“Timing”模式,进行时序仿真,仿真结果如图2.10所示。

图2.10 采用Verilog HDL设计的2选1数据选择器时序仿真结果

可以看到,在任务4中采用Verilog HDL方法与任务2中采用原理图设计方法建立的2选1数据选择器电路模块比较,功能仿真波形和时序仿真波形与任务2中相应的功能仿真波形和时序仿真波形是完全一致的。

任务小结

通过2选1数据选择器的设计,使读者更加熟悉采用Verilog HDL在不同层次级别、采用不同的描述方式进行数字系统设计的方法与步骤,了解Verilog中使用不同的数据类型对各种信号进行定义的方法,并加深理解功能仿真和时序仿真的意义。