任务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中使用不同的数据类型对各种信号进行定义的方法,并加深理解功能仿真和时序仿真的意义。