1、第3章 Verilog 设计入门 3.1 组合电路的Verilog描述 3.1.1 2 选1多路选择器及其Verilog 描述 3.1 组合电路的Verilog描述 3.1.1 2 选1多路选择器及其Verilog 描述 模块名 端口表 描述端口情况和各信号的性质 描述模块内部的逻辑功能和电路结构 3.1 组合电路的Verilog描述 3.1.1 2 选1多路选择器及其Verilog 描述 1模块表达 2端口语句、端口信号名和端口模式 数字、中文、库中已有的关键词或元件和数字起头的模块名非法 Verilog中,所有关键词必须小写 标识符对大小写敏感 单逻辑位,或标量位 多信号端口或总线端口?o
2、utput 3:0 C,D;?表示定义了两个4位位宽的矢量或总线端口信号C3:0,D3:0.例如对于C3:0,等于定义了四个单个位的输出信号,他们分别是C3,C2,C1,C0.?Verilog的端口模式有三种:?1、input:输入端口。定义的通道为单向只读模式,即规定数据只能由此端口被读入模块实体中。?2、output:输出端口。定义的通道为单向输出模式,即规定数据只能通过此端口从模块实体向外流出,或者说可以将模块中的数据向此端口赋值。?3、inout:双向端口。定义的通道确定为输入输出双向端口,即从内部看,可以对此端口进行赋值,或通过此端口读入外部数据信息;从外部端口看,信号即可由此端口流
3、出,也可向此端口输入信号,如RAM的数据口、单片机的I/O口等。3.1 组合电路的Verilog描述 3.1.1 2 选1多路选择器及其Verilog 描述 3赋值语句和条件操作符 关键词 assign 可以引导不同形式的赋值语句 Assign y=(s?a:b)是条件赋值语句,此语句使用了条件操作符“?:”当条件表达式的计算值为真(1)时,选择并计算表达式1的值,否则选择并计算表达式2的值。4关键字 多数Verilog编辑器都是关键字敏感型的,会以特定颜色表示。5标识符 设计者自定义的词语,用于标识不同名称。6规范的程序书写格式 Verilog格式要求很宽松,可以一行写多条语句,也可分行写。
4、不过要养成良好的书写习惯。7文件取名和存盘 文件名应该与改程序的模块名一致,后缀名是v,如MUX21a.v。文件名区分大小写。3.1 组合电路的Verilog描述 3.1.2 4 选1多路选择器及其case 语句表述方式 3.1 组合电路的Verilog描述 3.1.2 4 选1多路选择器及其case 语句表述方式 3.1 组合电路的Verilog描述 3.1.2 4 选1多路选择器及其case 语句表述方式 1reg 型变量定义 reg 定义寄存器变量或称寄存器数据类型的变量。如果没有在模块中显示的定义信号的类型,默认定义为wire型网线型。PS:输入或双向信号不能定义为寄存器型信号类型。2
5、过程语句过程语句 Always 引导顺序语句规定必须的reg类型变量。它总是和其它相关语句一起构成一个语法规则的程序块。表中的敏感信号表述方式有多种:(1)用or连接所有敏感信号。表中所有信号都是逻辑或的关系,当其中任何一个信号发生变化时,都将启动过程语句的执行。(2)用逗号区分或连接所有敏感信号。(3)省略形式。(*)或always*一个模块中可以包含任意个过程语句结构,所有的过程语句都属于并行语句,而任一过程引导的语句都是顺序语句;过程结构又是一个不断重复运行的模块,只要敏感信号变化,就启动执行。3.1 组合电路的Verilog描述 3.1.2 4 选1多路选择器及其case 语句表述方式
6、 3块语句begin_ end begin_end本身没有什么功能,只限于在always 引导的过程语句使用,通常用来组合顺序语句,故称为顺序块。若某一语句结构中仅包含一条语句,且无需定义局部变量时,则块语句被默认使用;若含多条语句,包括语句结构,如case语句,也包含有局部变量定义的单条语句,则必须使用begin_end把他们括起来。PS:块名可以省略 4case 条件语句和4种逻辑状态 case语句属于最常用的可综合顺序语句,必须放在过程语句中使用。首先计算出表达式中的值,然后根据以下条件语句中与之相同的值,执行对应的语句。PS:表达式的值必须和列出的数据类型匹配。允许多个分支同时满足表达
7、式的情况存在,这时执行最先满足的分支项,然后跳出case语句 除非所有条件语句中的选择取值能完全覆盖 case语句中表达式的取值,否则最末一个条件语句必须加上 default.3.1 组合电路的Verilog描述 3.1.2 4 选1多路选择器及其case 语句表述方式 5并位操作和数字表达 并位操作可以嵌套使用,用于简化某些重复表述。B,O,H,D代表2、8、16和10进制,不分大小写。Verilog中有4种基本数值:0、1、z、x。Z 高阻态,高阻态可用“?”代替;x 不确定。Z、x大小写不分。3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 3.1
8、组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 1按位逻辑操作符 3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 2等式操作符 =等于操作符用作比较,两边相等输出1表示关系为真,两个二进制被逐位比较,每一位相等输出为1,否则为0.且如果其中有的位是未知值x或高阻值都判定为假(0)。=全等比较操作符,将x或z都当成确定的值进行比较,表述相同输出1.3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 3assign 连续赋值语句 驱动的含义是强调这一表达式的本质是对于目标变量的激励源,或赋值
9、源,是为左侧的目标变量提供运算操作后的结果。如果变量a、b一直恒定不变,此赋值语句始终不会被执行,尽管同样属于与其他语句地位平等的并行语句。同一目标变量名下不允许有多个不同赋值表达式,以上两个表述不能出现在同一个模块中。3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 4wire 定义网线型变量 一位变量 矢量型变量 取代 3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 3.1 组合电路的Verilog描述 3.1.3 4 选1多路选择器及其数据流描述方式 5注释符号 用于隔离程序,添加程序说明文字。像一个括号,只要
10、文字在此“括号”中就可以换行,可以连续放更多行注释文字 3.1 组合电路的Verilog描述 3.1.4 4 选1多路选择器及其if语句描述方式 3.1 组合电路的Verilog描述 3.1.4 4 选1多路选择器及其if语句描述方式 1if_ else 条件语句 如果只有一个条件,可以表述为:if(s)Y=A;else Y=B.要执行的语句有多条时,需要begin_end把他们括起来。?2过程赋值语句过程赋值语句?(1)阻塞式赋值?“=”作为阻塞赋值语句的符号。阻塞式赋值的特点是,一旦执行完当前的赋值语句,赋值目标变量y即刻获得来自等号右侧的计算值。一个块语句中有多条阻塞式赋值语句,当执行其
11、中某一条时,其他语句被禁止执行,属于顺序执行语句。?PS:assign 和always 中的“=”性质不同,前者属于连续赋值语句,后者属于顺序赋值语句。?(2)非阻塞式赋值?“=”非阻塞式赋值的特点是,必须在块语句执行结束时才整体完成赋值操作。也就是说在begin_end 块中的所有赋值语句都可以并行运行。?PS:阻塞式赋值和非阻塞式赋值不允许混合使用。3数据表示方式数据表示方式?SEL=2,类型似乎不匹配。这种情况下Verilog会自动使其匹配。?如果所赋的值大于某变量已定义的矢量位可能的值,综合器会首先将赋值符号右侧的数据折算成二进制数,然后根据被赋值变量定义的位数,向左截去多余的数位。?
12、半加器?半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位。是实现两个一位二进制数的加法运算电路。数据输入A被加数、B加数,数据输出S和数(半加和)、进位C0。3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 1.半加器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 1.半加器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 1.半加器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 1.半加器描述 3.1 组合电路的Verilog描述
13、3.1.5 加法器及其Verilog 描述 1.半加器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 2.全加器描述?对两个一位二进制数及来自低位的“进位”进行相加,产生本位“和”及向高位“进位”的逻辑电路称为全加器。由此可知,全加器有三个输入端,二个输出端。3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 2.全加器顶层文件设计和例化语句?原件例化就是引入一种连接关系,将预先设计好的设计模块定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中指定端口相连接,从而为当前设计实体引进一个新的、第一层次的设计层次。?例
14、3-10中,当前设计实体模块相当于一个较大的电路系统,所定义的元件相当于一个要插在这个电路板上的芯片,而当前设计实体模块中指定的端口则相当于这块电路板上准备接受此芯片的一个插座。3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 2.全加器顶层文件设计和例化语句 此句的功能就是描述某一元件与外部连线或其它元件连接的情况。h_adder 是带调用的元件名,它就是已存盘的,如例3-7或3-8描述的半加器的文件名或模块名;u2是用户在此特定情况下调用元件h_adder而取的名字,也就是例化名。.a(e)表示图3-8的第二个半加器的输入端口a与外部的连线e相接。括号内、外
15、分别对应外部、内部接口。此外,端口关联法允许某些或某个端口不接,即连接表述不写上去。对此,若是输入口,综合后是高阻态;若是输出口,则为断开。这是位置关联法。所谓关联,就是以位置的对应关系连接相应的端口。H_adder (a,b,so,co)3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 3.8位加法器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 3.8位加法器描述 3.1 组合电路的Verilog描述 3.1.5 加法器及其Verilog 描述 3.8位加法器描述 3.2 时序模块及其Verilog表述 3.2.1 边
16、沿触发型触发器及其Verilog 表述 3.2 时序模块及其Verilog表述 3.2.1 边沿触发型触发器及其Verilog 表述?posedge CLK:对时钟信号CLK的上升沿敏感的敏感变量或敏感表达。当输入信号CLK出现一个上升沿时,posedge CLK将启动过程语句。?在Verilog中凡是边沿触发性质的时序元件必须使用始终边沿敏感表达(如posedge CLK),而不用此表述产生的时序电路都是电平敏感性时序电路。3.2 时序模块及其Verilog表述 3.2.2 电平触发型锁存器及其Verilog 表述 3.2 时序模块及其Verilog表述 3.2.2 电平触发型锁存器及其Ve
17、rilog 表述 在条件语句中有意不把所有可能的条件对应的操作表述出来,只列出满足某部分条件下完成某任务,而不交代当不满足此条件或其他条件时,程序该如何操作。如3-14中,当CLK不满足=1条件时,程序有意不做交代(没有else语句),从而是综合器解释为不满足条件时不做赋值,而保持原数据于Q。3.2 时序模块及其Verilog表述 3.2.3 含异步复位/时钟使能型触发器及其Verilog 表述 时钟使能信号EN=1时,始终上升沿才有效。只要RST=0,此D触发器的输出端即刻被清零,与时钟状态无关。3.2 时序模块及其Verilog表述 3.2.3 含异步复位/时钟使能型触发器及其Verilo
18、g 表述 3.2 时序模块及其Verilog表述 3.2.4 同步复位型触发器及其Verilog 表述?这是一个含同步清0的D触发器电路,它在输入端D处加了一个2选一多路选择器。工作时,当RST=1时,选通“1”端的数据0进入D输入端,如果这时CLK有一个上升沿,便将此 0送往输出端Q,这就实现了同步清 0的功能。?当RST=0时,则选通“0”端的数据D进入触发器的D输入端。这时的电路如同一个普通 D触发器。3.2 时序模块及其Verilog表述 3.2.4 同步复位型触发器及其Verilog 表述 可以删除 3.2 时序模块及其Verilog表述 3.2.5 异步复位型锁存器及其Verilo
19、g 表述 3.2 时序模块及其Verilog表述 3.2.5 异步复位型锁存器及其Verilog 表述 3.2 时序模块及其Verilog表述?3.2.6 Verilog的时钟过程表述的特点和规律?1、如果将某信号A定义为边沿敏感时钟信号,则必须在敏感信号表中给出对应的表述,如 posedge A或negedge A;但在always 过程结构中不能再出现信号A了。?2、若将某信号B定义为对应于时钟的电平敏感的异步控制信号,则除了在敏感信号表中给出对应的表述外,如posedge B,在always 过程结构中必须明示信号B的逻辑行为。如例3-15 中的RST.?3、若将某信号定义为对应于时钟的
20、同步控制信号(或仅仅是同步输入信号),则绝不可能以任何形式出现在敏感信号表中。?4、敏感和非敏感表述不能同时出现在敏感信号表中;每一个过程语句只能放一种类型的敏感信号。?always(posedge CLK or RST)?always(posedge CLK or negedge RST or D)?以上两种表述都是错误的?Always(posedge CLK or negedge RST)begin if(RST)这种表述是错误的,因为RST和negedge不匹配,应改为?if(!RST)3.2 时序模块及其Verilog表述 3.2.6 Verilog的时钟过程表述的特点和规律 3.2.
21、7 异步时序模块的Verilog 表述 这是一个异步时序电路,其中两个D触发器的时钟没有由同一时钟信号控制。在时序电路中应注意,一个时钟过程只能构成对应单一的时钟信号的时序电路,异步逻辑的设计必须采用多个时钟过程来构成。3.2 时序模块及其Verilog表述 3.2.7 异步时序模块的Verilog 表述 时钟过程1的输出信号Q1成了时钟过程2的始终敏感信号。这两个时钟过程通过Q1进行通信联系。虽然他们是并行语句,但他们被执行的时刻并非同时,因为根据敏感信号的设置,过程1总是先于过程2被启动。3.3 二进制计数器及其Verilog设计 3.3.1 4 位二进制计数器及其Verilog 表述 3
22、.3 二进制计数器及其Verilog设计 3.3.1 4 位二进制计数器及其Verilog 表述 3.3 二进制计数器及其Verilog设计 3.3.1 4 位二进制计数器及其Verilog 表述 3.3 二进制计数器及其Verilog 设计 3.3.2 功能更全面的计数器设计功能更全面的计数器设计 3.3 二进制计数器及其Verilog设计 3.3.2 功能更全面的计数器设计 3.3 二进制计数器及其Verilog设计 3.3.2 功能更全面的计数器设计 习 题 左边是举重比赛时的裁判判决结果,试用VerilogHDL语言描述出能实现此功能的逻辑电路图。用case语句描述左边的逻辑电路图。习 题 3-7 3-6 习 题 3-13