本章重点介绍了wire数据类型及与之匹配的assign组合电路设计方法。另外,本章介绍了各种运算符及它们的优先级问题,并通过各种例子介绍了它们的应用。
加菲猫曾经说过:“意大利千层面 是一种生活方式、一种存在的状态,它是人类最完美的成就。”
仅仅对于千层面这种食物而言,贫道觉得其口味是乏善可陈的,太油腻、太多奶酪,不适合鄙人的中国胃。但是大多数数字逻辑系统的结构,用千层面来做比喻倒是非常贴切的,尤其是混合多种馅的那种。单调一致的面皮是骨架,是时序单元——触发器;同时,内容丰富的馅料,是味道的融合,是各种组合逻辑单元。如图3.1所示,数字逻辑电路的结构基本都可以抽象为触发器之间夹着组合逻辑的模样。当面皮与馅料相遇,就会触发一段美好的味觉体验;当组合逻辑和时序单元结合,就会产生一个奇妙无比的系统。
图3.1 数字逻辑系统与千层面
为了防止那个喜欢抬杠的比丘来找茬,补上一句:复杂的数字逻辑系统就像台湾小吃——大饼包小饼,是层层基本逻辑嵌套、并行的。鄙人是靠阅读《南华经·养生主 》悟道的,对于入口腹道观、出五谷道场之物是了若指掌,不怕任何提问的。老方丈,尽可放马过来!
为了制作这人间至美味的千层面,烹调过程也可以分为馅料和面皮两个相对独立的过程。接下来的两章里会具体讲解馅料(组合逻辑)的制作,然后还有一章会说明面皮(时序逻辑)的工艺。馅料(组合逻辑)分两类,分别采用wire类型变量和reg类型变量来完成。本章主要介绍第一类:wire类型变量型组合逻辑描述方法。在下一章里会介绍reg的情况。
提到wire类型变量型组合逻辑描述方法,一个不能回避的关键词就是“assign”。它用于对于wire类型变量的赋值。Assign赋值的一般形式为
assign[drive_strength][delay]net_lvalue=expression;
其中,drive_strength为信号强度,delay为设定时延,net_lvalue为wire型变量名,expression为表达式;方括号对“[]”可省略,而且这两个内容与电路逻辑设计无关,在此不详细论述。例3.1给出了一些用关键词assign给wire型变量赋值的例子。
【例3.1】利用assign给wire型变量赋值
//Variable declaration
wire _select_flag;
wire[7:0]input_data,next_data;
……
//Assignment
assign _select_flag=1'b0;
//wire型变量常数赋值,变量_select_flag被赋值为1'b0
assign input_data=next_data;;
//wire型变量变量赋值,变量input_data被赋值为变量next_data的值
assign input_data[7:4]=4'b0000;
//wire型变量局部赋值,高四位被赋值为常数4'b0000
例3.2给出了一个直通模块的完整代码。这段代码没有实际意义,就是输出时时刻刻等于输入的功能。各位听众需要掌握的是完整模块代码的格式。
【例3.2】直通模块的完整代码
/***********************************************
Module Name: Bypass
Feature: Input bypass to output
Coder: Garfield
Organization: XXXX Group,Department of Architecture
-----------------------------------------------------
Input ports: Input_Data,8 bits
Output Ports: Output_Data,8 bits,equalesInput_Data
-----------------------------------------------------
History:
11-27-2015: First Version by Garfield
11-27_2015: Verified by Garfield with Bypass_test in ISE/Modelsim
***********************************************/
module Bypass
(
input[7:0]Input_Data,
output wire[7:0]Output_Data
);
//Definition for Variables in the module
//None for this module
//Logical
assign Output_Data= Input_Data;
endmodule
说明一下,因为这个模块实际上不具有逻辑功能,所以一般综合软件都会在给出警告(Warning)后,把这个模块优化掉。
顺道说一下,一般对于警告的处理态度是:知道为什么会有警告,则这个警告可以不排除。例如,这个例子中的有关警告是由逻辑功能缺失引起的,我们在设计之前就预料到,因此不必理会它们。
前文书说到组合逻辑丰富多彩,下面就待说书人一一到来。