关于Verilog HDL中的赋值语句

2010-03-08 09:12:43|  分类: Verilog |  标签: |字号 订阅

关于Verilog HDL中的赋值语句
参考书目:《Verilog HDL程序设计与应用》王伟编著
连续赋值与过程赋值的区别:
  过程赋值 连续赋值
 assign 无assign(过程性连续赋值除外) 有assign
 符号  使用“=”或“《=”   只使用“=”
 位置  在always语句或initial语句中均可出现 不可出现于always语句和initial语句
执行条件 与周围其他语句有关 等号右端操作数的值发生变化时
 用途 驱动寄存器 驱动线网
连续赋值用于数据流行为建模,多用于组合逻辑电路,过程赋值用于顺序行为建模,用于顺序行为建模。
连续赋值等号右边操作数发生变化就需要执行(上电便一直执行),而过程性赋值语句只是执行一次,注意我这里的一次是指:在initial块中,过程性赋值只顺序执行一次,而在always块中,每一次满足always的条件时,都要顺序执行一次该always块中的语句。       
 
过程性连续赋值
连续赋值适用于线网,过程赋值适用于寄存器,但是还有一类赋值方式,它既能对线网赋值也能对寄存器赋值(但不能是寄存器的位选择或部分选择),这种赋值方式被称为过程性连续赋值。它属于过程赋值而非连续赋值,所以他能出现在always和initial语句中(连续赋值语句不可以出现在always和initial语句中)。并且这种赋值语句也有连续赋值的特征,在过程性连续赋值语句中,右端表达式中操作数的任何变化都会引起赋值语句重新执行。
两种过程性连续赋值举例:
(1)assign- deassign(赋值-重新赋值)assign用于对寄存器赋值(不可用于线网赋值),deassign用于取消之前由assign赋值给某寄存器的值,也就是说,使用assign给寄存器赋值之后,这个值将一直保持在这个寄存器上,直到遇到deassign为止。
举例:
module DEF(D,Clr,Clk,Q)
 input D,Clr,Clk;
 output Q;
 reg Q; 
 always@(negedge Clk)
  Q = D;
 always@(Clr)
  begin
   if(!Clr)
    assign Q = 0;
   else
    deassign Q;
  end
endmodule
以上的程序段,第一个always会将Q的值赋为D,第二个always语句在Clr的值发生变化时执行,若Clr 是由高电平变为低电平,则assign有效,并一直保持这个赋值(直到遇到deassign),这时尽管第一个always也在执行(Clk的下降沿是不会起作用的),Q的值会一直保持“assign Q = 0;”,直到Clr来一个高电平为止(deassign Q语句执行)。
(2)force- release(强制-释放,虽然它也可以用于对寄存器赋值,但主要用于线网赋值)
当force语句应用于寄存器时,寄存器当前值被force覆盖,当release语句应用于寄存器时寄存器当前值将保持不变,直到被重新赋值。
举例:
reg[2:0]colt;
……
colt=2;//colt 被赋值为2;
……
force colt=1;//colt被强制赋值为1;
……
release colt;//对colt的强制赋值被取消,colt的值将保持为1;
……
assign colt =5;//colt被赋值为5;
……
force colt=3;//colt被强制赋值为3;
……
release colt;//对colt的强制赋值被取消,assign colt=5;重新生效;
……
force colt[1:0]=3;//不合法,寄存器的部分选择不可以设为过程性连续赋值的目标
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值