2.3 连续赋值语句及“? :”语句
知识分部网络
2.3.1 连续赋值语句
在任务4中,我们采用数据流描述方式来实现了2选1数据选择器的设计,从这个应用实例中可以看到:数据流的建模方式主要采用连续赋值语句(Continuous Assignments)来实现。这里主要介绍连续赋值语句的使用。
在硬件中,assign连续赋值语句一般用来描述组合逻辑电路,用于给线网型wire变量赋值。组合逻辑电路的输出信号只取决于当时的输入信号,与电路原来所处的状态无关。
assign连续赋值语句用右端表达式所推导出来的逻辑来驱动赋值语句左端的连接线变量。“连续”的意思是指等号右端的任一信号发生变化立即影响左端的被赋值信号。只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值结果。
用assign语句实现数据流建模的描述语法如下:
assign wire型变量=表达式;
例如,任务3中的2输入与非门的数据流建模如下:
图2.11 由连续赋值语句综合出来的2输入与非门电路
在上面的例子中,输出变量f和输入变量a、b都默认为wire类型,a和b信号的任何变化都将随时反映到f上来。这条连续赋值语句在Quartus Ⅱ上综合出来的电路如图2.11所示。
任务4中的2选1数据选择器的数据流建模如下:
在Quartus Ⅱ上综合出的硬件电路如图2.12所示。
图2.12 由连续赋值语句综合出来的2选1数据选择器电路
小提示
由assign引出的连续赋值语句与在always过程语句中的过程赋值语句有很大的不同,主要表现在以下几个方面:
(1)连续赋值语句用于对wire线网型变量赋值,而过程赋值语句用于对寄存器型变量赋值。
(2)连续赋值语句在过程块外部使用,而过程赋值语句在过程块内部使用。
(3)连续赋值语句是并发执行的,而过程赋值语句的阻塞式赋值属于顺序执行过程,非阻塞式赋值才是并发执行的。
2.3.2 “ ?:”语句
任务4中的2选1数据选择器电路的特点是根据选择信号的值把对应的输入信号送到输出端,在逻辑电路中,具有这种特点的电路有很多。在Verilog中提供了一种条件操作符“ ?:”来简单处理这种在不同的条件状态下对几个可能的信号或值进行选择的电路。
使用条件操作符的语法格式如下:
条件表达式 ? 表达式1 : 表达式2
条件操作符的运算过程如下:如果条件表达式的值为1(即为真),则运算后的结果取表达式1的值,否则取表达式2的值。
任务4的2选1数据选择器建模还可以在连续赋值语句中用条件操作符来定义,代码如下:
//条件操作符的应用——2选1数据选择器 //mux2_1_ex4.v module mux2_1_ex4( P0, P1, S, F ); input P0,P1,S; //说明P0、P1和S为输入端口 output F; //说明F为输出端口 assign F=(S==1′b0)? P0:P1; //条件表达式 endmodule
图2.13 综合出来的2选1数据选择器电路
上例中,条件表达式是S==1′b0,即判断选择输入信号S的值是否为0,如果是,则给输出端F连续赋予表达式1(输入端P0)的值,否则给输出端F连续赋予表达式2(输入端P1)的值。对2选1数据选择器模型mux2_1_ex4.v进行综合后产生出的硬件电路如图2.13所示。
试一试
将Verilog HDL 设计文件(.v文件)综合出实际硬件电路,可以使用Quartus Ⅱ的内置浏览器观察。在Quartus Ⅱ中观察综合结果的步骤如下:
(1)按照任务3的步骤完成工程建立、器件选择、设计模块输入、设计编译及仿真过程。
(2)单击“Tools”菜单中的“Netlist Viewers”子菜单,选择其下一级子菜单“RTL Viewer”,如图2.14所示。此时在Quartus Ⅱ界面上显示出“RTL Viewer”寄存器传输级电路浏览器的卡片式窗口,给出了综合生成的门级电路,如图2.15所示。
图2.14 在Quartus Ⅱ中进行电路综合的菜单
图2.15 浏览电路综合结果的Quartus Ⅱ界面