verilog基本语法之always和assign

Posted on 2020-05-18 09:03  绿叶落秋风  阅读(9069)  评论(0编辑  收藏  举报

always和assign的作用

一、语法定义

assign,连续赋值。always,敏感赋值。连续赋值,就是无条件全等。敏感赋值,就是有条件相等。assign的对象是wire,always的对象是reg。这就是语法约束。

二、功能差异

assign对应电路下连线操作。always对应插入敏感控制连线。这里容易混淆的就是assign综合的一定是组合电路,但是always综合的不一定是时序电路。always的敏感列表使用*号就可以等效综合为组合电路。如果使用的是电平触发,也使会综合成相应的组合电路。只有出现边沿触发时,才会综合成时序电路。而时序电路,基础就是时钟和使能两个关键信号。时钟在always模块中不再出现(时钟信号在敏感信号作用下的值一直相等,没有使用在内部的意义,当然可以转化后使用)。而对于使能信号,则是会有一个if判断语句,而且处于第一优先级。这就是异步复位。如果不在敏感列表而处于第一优先级,则是同步复位信号。

从上面的描述可以看到:always可以实现两种电路,是不是可以不用assign来实现设计?理论上可以,但是会加大设计的难度。首先要明确的是,always只能对reg变量赋值,这导致wire变量赋值困难。如果没有assign,每个wire变量都要加入一个reg缓冲。可以简单理解:开始时只有always,可以实现基本的功能,然后将其中的组合逻辑提取出来构成assign。同时引入了wire。也就是assign是always的补充(只是方便理解,没有根据)。

三、实际应用

使用assign和always构建加法器:

always@(*)begin
    a<=b+c;
end

assign a=b+c;

四。拓展

在上面的学习中可以看到,reg和wire的作用也是语法的重要区别。以后有时间可以去区别。