购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 Verilog基础

1.5.1 数据

(1)电路四种状态。

Verilog用4个值来实现电平描述:0,1,Z和X。

(2)数值表示方法:位数+’+进制+值。

表1-5-1 数值进制表示方法

(3)数据类型

硬件的数据类型描述以驱动的方式来分类,常用的有两种:reg和wire。

1.5.2 运算符

(1)逻辑运算符。

表1-5-2 逻辑运算表

(2)算术运算符。

表1-5-3 算术运算表

(3)比较运算符。

表1-5-4 比较运算表

1.5.3 结构声明

由于Robei的存在,以下部分代码可以不用输入,省去用户的大量时间,但是用户需要了解这部分代码的存在,所以被省去的代码会在描述中提出。

1.模块定义

Robei的每个框图代表一个模块,每个模块的声明都由“module”开始,然后是该模块的名称,之后的括号里面包含了输入和输出的引脚。最后要写上“endmodule”,如图1-5-1所示。

图1-5-1

2.引脚定义

引脚的名称将会出现在模块定义的括号里面。模块定义完成后,在module和endmodule中间声明引脚的走向。从外向内的箭头是输入引脚,从内向外的箭头是输出引脚,无箭头的既可以做输入也可以做输出。有数据宽度的用中括号给出。紧接着,声明每个引脚信号的类型,一般是wire或者reg,如图1-5-2所示。

图1-5-2

3.连接线

连接线的定义是由连接线类型加上位宽和名称组成的,与引脚的类型定义类似,但是在Robei中,顶层模块与子模块的连接线可以不声明,直接连接引脚,所以部分连接线并不存在于代码中。

4.例化

例化的时候根据模块的连接方式,确定与每个引脚相连的引脚或者连接线,通过类似模块声明的方式进行例化。在例化的时候,有些需要空接一些信号,输入引脚悬空,输入为高阻 Z,输出引脚悬空,则该引脚废弃不用,如图1-5-3和图1-5-4所示。

图1-5-3

实际举例如DFF的例化:

图1-5-4

1.5.4 代码撰写

1.赋值语句

常用的赋值语句如assign,assign的作用是将一个信号与另外一个信号进行直接相连,任何信号的变化都是同步的。assign语句中等号左边信号必须是wire类型,如图1-5-5所示。

图1-5-5

2.分支语句

If…else

类似于C语言中if…else 的写法。如果if…else写全,就会生成寄存器,但是只有if没有else的语句,将会生成锁存器。在硬件设计中应该尽量避免锁存器的产生。当有多条语句存在于if…else中间的时候,需要用begin end将多条语句进行包含,此时begin end相当于C语言中的{},具体代码如图1-5-6所示。

图1-5-6

case

类似于C语言中的case 的写法。如果case语句写全且default值也设置好,就会生成寄存器,否则将会生成锁存器,具体代码如图1-5-7所示。

3.循环语句

for

如图1-5-8所示,类似于C语言中for 的写法。但是Verilog中,没有自加的语句,所以没有i++,只能用i=i+1。

图1-5-7

图1-5-8

while

类似于C语言中的while 的写法。while 语句在执行时,首先判断循环执行条件表达式是否为真,如果为真,执行后面的语句块,然后重新判断循环执行条件表达式是否为真,如果为真,再执行一遍后面的语句块。如此不断,直到条件表达式不为真,如图1-5-9所示。

4.初始化与重复执行

initial

Verilog中用initial进行初始化,initial 只执行一次,且在0时刻执行,主要用在仿真测试模块中,如图1-5-10所示。

图1-5-9

图1-5-10

always

Verilog中always一直重复执行到程序结束。always有自己的敏感信号列表,用always@(敏感信号1 or敏感信号2 or...)来表示,当敏感信号发生改变的时候更新状态,如图1-5-11所示。

图1-5-11

只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。

5.阻塞式赋值与非阻塞式赋值

阻塞赋值 (=)

在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。在always中begin...end语句块的所有语句是顺序执行的,阻塞赋值是在上一条语句完全完成之后,才开始执行下一条语句的,参见图1-5-12所示。

图1-5-12

非阻塞赋值 (<=)

先计算符号右边表达式的值并暂存在一个暂存器中,iD的值被保存在一个寄存器中,而oQA当前的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完,之后才会进行对左边的寄存器变量的赋值,如图1-5-3所示。这样oQB得到的是oQA的原始值而不是iD。

图1-5-13

1.5.5 一个模块的总结

学习的过程是实践积累的过程,只有不断的练习,才能真正掌握集成电路设计。 iukzpeLpwcm5++C7yz4HPakNUq0T39/DQyHgRVL/m64EeoY03A1z3ow4z5eLhjzH

点击中间区域
呼出菜单
上一章
目录
下一章
×