Verilog设计深入

过程中的两类赋值语句(always语句中)
未指定延时的阻塞式赋值语句:
阻塞式赋值的特点式是只有在当前语句执行完成后才会去执行下一条语句,而在执行这条语句时,赋值是立即发生的,假设没有指定延时。
表述方式:
目标变量名 = 驱动表达式;
阻塞式赋值的适用范围仅限于过程结构中。如果右边的驱动表达式含有延时语句,则在延时没有结束前,赋值的更新不会发生。
执行流程:
(1)阻塞本过程的其他语句的执行,计算出驱动表达式的值
(2)向”目标变量“进行赋值操作(假设没有指定延时)
(3)完成赋值,即实现目标变量的更新,允许对本过程中其他语句的执行
这三步是并成一步完成的,一旦执行目标变量立即被更新,其他同类赋值语句必须停止工作。
在过程中的阻塞式赋值语句的前后顺序情况将直接影响最后的结果。
指定了延时的阻塞式赋值:
表述方式:
赋值号左侧的含延时的赋值语句:
[延时] 目标变量名 = 驱动表达式;
赋值号右侧的含延时的赋值语句:
目标变量名 = [延时] 驱动表达式;
区别:
赋值号左侧的延时是对整条语句执行的延时,即相隔上一条语句执行的延时量。
赋值号右侧的延时是指右侧表达式得出运算结果之后延迟指定的一段时间然后再将运算结果赋值给左边的变量。与assign语句的延时方式相同。
如果没有专门指定延时,则默认延时为0
未指定延时的非阻塞式赋值:
表述方式:
目标变量名 <= 驱动表达式;
此类赋值在其赋值过程中不会影响同过程中其他语句的赋值操作。非阻塞式的三步不是一步完成的,即多个语句的目标变量式同时完成更新的。
当多个语句对同一目标变量进行赋值时,最终获得的值为最后一个赋值的目标变量,即最接近过程结束的那一个语句(与阻塞式赋值相同)。但是目标变量不会经过中间过程的更新而只被最后一个赋值语句进行更新。
当多个语句的驱动表达式互相关联时,两种赋值方式会造成结果不同。
指定了延时的非阻塞式赋值:
表述方式:
赋值号左侧的含延时的赋值语句:
[延时] 目标变量名 <= 驱动表达式;
赋值号右侧的含延时的赋值语句:
目标变量名 <= [延时] 驱动表达式;
区别:
赋值号左侧的延时是对整条语句执行的延时,即相隔上一条语句执行的延时量。
赋值号右侧的延时是指右侧表达式得出运算结果之后延迟指定的一段时间然后再将运算结果赋值给左边的变量。
非阻塞式赋值用的时间为最长的延时,阻塞式赋值用的延时为各个语句所用延时的和。
过程结构中的输出信号和双向端口信号的数据类型必须是寄存器类型,如reg、integer类型等,此外在同一过程中,对同一目标变量的赋值形式必须一致,不能混合,即在同一过程中,多次对同一目标变量的赋值,或者全部是阻塞式赋值,或者全部是非阻塞式赋值。
过程语句归纳
过程语句always的执行依赖于敏感信号的变化(或称发生事件)
所有过程语句结构本身都属于并行语句,而由任一过程引导的各类语句结构都属于顺序语句。
如果有描述的信号有反馈,assign语句也会构成时序电路。
同一个过程中只能描述针对同一时钟的同步时序逻辑,而异步时序逻辑、多时钟同步逻辑或时序逻辑的混合逻辑必须由多个过程来实现。不允许存在独立于时钟的异步的组合模块。
利用不完整的条件语句来实现时序电路的构建(通常用于描述电平触发类锁存器电路)。
通常,完整的条件语句只能构成组合逻辑电路。如果没有充分考虑电路中的所有可能出现的条件,即没有列出所有的条件及对应的处理方法,将导致不完整的条件语句出现,从而设计出组合与时序电路的混合体。
由于case语句的遗漏导致时序模块的引入。
Verilog默认else与最近的没有else的if相关联。
三态门与双向端口设计
Z表示高阻逻辑位,它只能在端口赋值,不能在电路模块中被信号所传递。
由于双向端口在完成输入功能时,必须使原来呈输出模式的端口呈高阻态,否则待输入的外部数据势必会于端口处原有电平发生线与,导致无法将外部数据正确地读入,也无法实现双向功能。

猜你喜欢

转载自blog.csdn.net/weixin_40475469/article/details/78936060
今日推荐