当前位置:   article > 正文

Verilog HDL数字设计与综合(第二版)学习笔记-第六、七章_verilog高级数字设计第二版

verilog高级数字设计第二版

门级建模-----电路规模小,电路门少,直观,繁琐,易出错

数据流--------从抽象层次入手,避免繁琐细节,根据数据在寄存器之间的流动和处理过程对电路进行描述

1.连续赋值语句

1.1 连续赋值语句的特点

  a. 连续赋值语句左值必须是一个标量或向量线网,或者是标量或向量线网的拼接,不能是向量或向量寄存器;

  b.连续赋值语句时刻激活,随任意操作数变化而变化;

  c.操作数可以是标量或向量的线网或寄存器,也可以是函数调用;

  d.赋值延迟用于控制对线网赋予新值的时间,根据仿真时间单位进行说明;

必须以关键字 assign开始,语法如下:

1.2  隐式连续赋值

  在线网声明的同时对其进行赋值,由于线网只能被声明一次,所以对线网的隐式声明赋值只能有一次。

//普通的连续赋值

wire  out;

assign out = in1 & in2;

//使用隐式连续赋值实现

wire out = in1&in2;                    //不是说必须以assign开头的嘛

1.3隐式线网声明

如信号名被用在连续赋值语句的左侧,则默认为一个隐式声明的线网,如连到模块端口,则宽度默认与端口相等。

//连续赋值,out为线网类型

wire i1,i2;

assign out =i1 &i2;//out并未声明为线网,但默认为线网

2.延迟

 三种,用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔

2.1普通赋值延迟,直接说明,跟在assign后面

assign  #10 out = in1&in2;//形式

说明:

  a.也称惯性延迟,脉冲宽度小于赋值延迟的输入变化不会影响输出结果。

2.2隐式连续赋值延迟

//形式如下,都差不多

wire #10 out = in1&in2;========wire out;assign #10 out = in1&in2;

3.线网声明延迟

wire #10 out;

assign out =in1&in2;

//等效语句为

wire out;assign #10 out = in1&in2;

3.表达式、操作符和操作数     略61(78)讲

4操作符类型

 4.1 算术操作符

4.1双目操作符;加减乘除,求幂(**),取模(%),任一操作数不确定,结果也不确定,注意取模的结果是两数相除的余数部分

单目操作符:正负,能用就用

4.2逻辑操作符,用括号提高可读性,注意优先级

4.3关系操作符,大小比较,略

4.4等价操作符,==、!=等

4.5按位操作符,按位操作,位宽不等,使用0向左拓展

4.6缩减操作符,对操作数逐位操作,产生一个一位的结果

4.7移位操作数,箭头指哪往哪移,用0补

4.8重复操作数,67(85)没怎么看懂

4.9拼接操作符

4.10条件操作符

4.11操作符的优先级

 5.举例

挺好用的,但是比较繁琐,容易错,错了难改,多选一,全加器,进位计数器,

七、行为级建模

从算法的角度,即从电路外部行为的角度对其进行描述

1.结构化过程语句:initial和always

每个执行流程并发执行,都从0开始,不能嵌套

1.1initial语句:每个语句只执行一次,并发执行,语句内部可用begin-end划区。常用于初始化,信号监视,生产仿真波形等

1.2always语句:从0开始顺序执行其中的行为语句,不断重复执行直到仿真结束。

 2.过程赋值语句:跟新对象是寄存器、整数、实数或时间变量。

 该类型变量在被赋值后值保持不变,直到被其它过程赋值语句赋予新值,注意与第六章的连续赋值语句作区分。

assignment ::=variable_lvalue = [delay_or_event_control] expression

过程赋值语句的左侧<lvalue>可以是以下类型:

·reg,整型数、实型数、时间寄存器变量或存储器单元。

·上述各种类型的位选(addr[0])

·上述各种类型的域选(addr[31:0])

·上述拼接

2.1阻塞赋值语句

 顺序执行,表现出串行行为,“=”作为赋值语句

2.2非阻塞赋值语句

允许赋值调度,“<=”作为赋值符

注意看两个例子,作区分。(100)

使用非阻塞赋值语句来避免竞争---如,在多个always并行执行的场合下

3.时序控制

延迟值可以是数字、标识符或表达式,使用关键字#。

3.1.常规分类:常规延迟控制、赋值内嵌延迟控制和零延迟控制

常规延迟控制:

 内嵌赋值延迟控制

 零延迟控制:尽量别用,有竞争

 3.2  基于事件的时序控制

四种:常规事件控制、命名事件控制、OR(或)事件控制和电平敏感时序控制

3.2.1常规事件控制:使用@说明,语句继续执行的条件是信号的值发生变化(正向或负向跳变)posedge指正向跳变,negedge指负向跳变

 3.2.2命名事件控制

 3.2.3 OR事件控制:多个信号或者事件中发生任意一个变化都触发,其中OR可以用“,”替代。

注:@*和@(*)表示对其后语句块中的所有输入变量都是敏感的

 3.2.4 电平敏感时序控制:wait

always

  wait (count_enable) #20 count = count + 1;//监控count_enable,为0则不执行,为1则等20单位后执行。

4.条件语句

if else,之间可以嵌套else if,开始套娃

5.多路分支语句

5.1多路分支:使用关键字:case,endcase和default来表示

每一条分支都可以是一条语句或一组语句,按序查找,没有执行default_statement,一条case中不允许多个default_statement。

5.2 casex和casez关键字

让我们在case表达式中只对非x或z的位置进行比较,z或x作为无关值

6.循环语句:while,for,repeat和forever

  6.1while       93(111)

  6.2for循环:(初始条件,判断语句,改变控制变量语句)

for循环一般用于具有固定开始和结束条件的循环,如果只有一个执行循环的条件,用while

  6.3repeat循环:执行固定次数的循环,其循环次数必定是一个常量、变量或信号,是变量或信号时,循环次数是循环开始时变量或信号的值

  6.4forever循环:表示永久循环,无条件表达式,直到系统$finish为止,如需要退出,使用disable语句。需要结合时序控制结构,否则,仿真器将无限循环,仿真时间不再推进。

7.顺序块和并行块

  7.1 顺序快,用begin和end包裹的多条顺序执行的语句

  7.2 并行块,由fork和join声明,并发执行  97(116)

  7.3块可以嵌套,可以命名:begin:block1

  7.4块可以仅用:disable block1

8.生产块

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/613972
推荐阅读
相关标签
  

闽ICP备14008679号