



硬件描述语言对于电路设计的语句主要就在行为级建模
行为级建模归结起来只有三条语句:赋值,条件,循环(循环语句不作为行为级建模的主要描述语句)

对于可综合来讲就是什么样的语句能够形成电路,什么样的语句不能形成电路
连续赋值赋值语句能够形成电路,这是没有问题的,牵扯的都是最基本的元器件和语法单元,不会有问题。这样来讲的话,出问题出的最多的就在行为级建模上面
initial过程语句

(1)initial语句主要用在仿真和测试
(2)initial在可综合语句中起到什么作用:初始化。!!电路的初始化是靠复位信号完成的,所以initial语句没有太大用。在语法严格的VHDL里面,它是没有initial语句的,它的全局复位就是用复位信号。在代码中,有人信号把刚上电的置位信号全放在initial里面,这样是非常危险的,如果程序跑掉必须断电重来,如果用的复位信号做的初始化只需要复位重来就行了
always过程语句




串行语句块
(1)串行语句块中的每条语句依据块中的排列次序逐条执行。块中每条语句给出的延时间都是相对于前一条语句执行结束的相对时间
(2)串行语句块的起始执行时间就是串行语句块中第一条语句开始执行的时间;串行语句块的结束时间就是块中最后一条语句执行结束的时间
并行语句块
(1)块内语句是同时执行的,即程序流程控制一进入到该并行语句块,块内语句则同时开始执行
(2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的
语句块的使用










(1)在第一章中,我们说会讲三种语句:连续赋值语句(数据流建模),行为级建模(initial或者always),结构级建模
(2)这三条语句是完全并行的三条语句,没有任何的前后顺序
(3)在行为级建模会有顺序的概念,语句块会用串行语句块(begin-end)和并行语句块(fork-join),fork-join也没有顺序的概念,只有在begin-end有前后的顺序。在begin-end有两条赋值语句,一条是阻塞型赋值语句,一条是非阻塞型赋值语句,对于阻塞型赋值语句,它是一个一个执行下来的,对于非阻塞型赋值语句它又是全并行的。
(4)!!!!硬件描述语言的设计思想:在HDL中,只有在行为级中间的串行语句块中间使用阻塞型赋值语句的时候才是串行的结构
连续赋值语句有两种类型:赋值、重新赋值语句(assign、deassign)和强制、释放语句(force、release)
这个语句是不可综合的语句
语法结构:


在语法中force、release比assign、deassign优先级更高
举例:(只是作为语法讲,不建议这么写)




!!!!起作用的环节:当代码量很大的时候,信号有错误,我们可以用assign、deassign或force、release来把这个信号在某个时刻强制拉到正确的位置,看后面的结果对不对。,所以,这两个语句一般只在超大型系统中使用。





case 语句是一种可实现多路分支选择控制的语句

case语句的真值表:

除了 case 分支语句以外,还有 casez、casex 这两种功能类似的条件分支语句,相应的真值表如下

这三个其实就是在不同情况下用的3个语句
(1)case语句:其实是一个全等的比较,不光比较0和1,还会比较x和z的状态
(2)casez语句:只比较0,1,x,当遇到高阻就认为是真
(2)casex语句:只比较0,1,当遇到x和z就认为是真
对于case需要注意:
(1)值1到值n 必须各不相同,一旦判断到与某值相同并执行相应语句块后,case 语句的执行便结束
(2) 如果某几个连续排列的值项执行的是同一条语句,则这几个值项间可用逗号间隔而将语句放在这几个值项的最后一项中
(3)default 选项相当于 if-else 语句中的else 部分,可依据需要用或者不用,当前面已经列出了控制表达式的所有可能值时,default 可以省略
(4)case 语句的所有表达式的值的位宽必须相等,因为只有这样,控制表达式和分支表达式才能进行对应位的比较
!!!!case语句描述了一种非常关键的组合电路的描述方式,case语句的重要作用就是描述真值表(组合电路)。case语句的第二个作用就是对于有限状态机的描述(时序电路)。这两个作用分别是对组合电路和时序电路完全的描述方式(有真值表肯定就能推出电路)

实际上用一个case语句描述了七个真值表
如果写不好case


如果没有列全也没有default,就会造成输出引脚直接接到输入引脚,这是绝对不允许的

!!!这时候就会产生latch这个概念,latch在组合电路中是绝对不允许的



while
while 语句根据条件表达式的真假来确定循环体的执行,当指定的条件表达式取值为真时才会重复执行循环体,否则就不执行循环体

for
关键字“for”所引导的循环语句也表示一种“条件循环”,只有在指定的条件表达式成立时才进行循环
![]()

![]()
