因为verilog不支持多维数组,故存储器不支持位操作。<br>
下面是我相关学习笔记<br>
<br>
过程性连续赋值<br>
在过程块内对变量进行连续赋值,与连续赋值不同:<br>
(1)过程连续赋值语句只能用在过程块中,而连续赋值语句则不能出现在过程块中。<br>
(2)过程连续赋值可以对寄存器型变量赋值,赋值目标不可以是变量的某一位或者某几位,而连续赋值语句只能对net型变量赋值,它的赋值目标可以使变量的某一位或某几位<br>
过程性连续赋值语句有两种类型:<br>
1) 赋值和重新赋值过程语句:它们对寄存器进行赋值。<br>
2) 强制和释放过程性赋值语句:虽然它们也可以用于对寄存器赋值,但主要用于对线网赋值。<br>
(1) 赋值—重新赋值 assign … deassign<br>
一个赋值过程语句包含所有对寄存器的过程性赋值,重新赋值过程语句中止对寄存器的连续赋值。寄存器中的值被保留到其被重新赋值为止。assign的优先级高于普通过程赋值语句,它的逻辑状态仍然有assign决定。过程连续赋值语句特别适合用来实现优先级高于正常时序逻辑功能得以布置位或者异步清零逻辑功能。<br>
Module def(d,clr,clk,q);<br>
Input d,clk,clr;<br>
Output q;<br>
Reg q;<br>
always@(clr)<br>
begin<br>
if(!clr)<br>
assign q=0;<br>
else<br>
deassign q;<br>
end<br>
always @(negedge clk) q=d;<br>
endmodule<br>
如果C l r为0,assign赋值语句使Q清0,而不管时钟边沿的变化情形,即C l k和D对Q无效。如果C l r变为1,重新赋值语句被执行;这就使得强制赋值方式被取消,以后C l k能够对Q产生影响。<br>
如果赋值应用于一个已经被赋值的寄存器,assign赋值在进行新的过程性连续赋值前取消了原来的赋值。<br>
(2) force … release<br>
优先级最高,高于普通赋值和assign赋值<br>
当f o r c e语句应用于寄存器时,寄存器的当前值被f o r c e语句的值覆盖;当r e l e a s e语句应用<br>
于寄存器时,寄存器中的当前值保持不变,除非过程性连续赋值已经生效(在f o r c e语句被执行时),在这种情况下,连续赋值为寄存器建立新值。当用f o r c e过程语句对线网进行赋值时,该赋值方式为线网替换所有驱动源,直到在那个线网上执行r e l e a s e语句为止。<br>
Reg[2:0] colt;<br>
…<br>
Colt=2;<br>
Force colt=1;<br>
…<br>
Release colt; //colt保持值为1<br>
…<br>
Assign colt=5;<br>
Force colt=3;<br>
Release colt; //colt值变为5<br>
……<br>
C o l t的第1次释放促使C o l t的值被保持为1。这是因为在f o r c e语句被应用时没有过程性连续赋值对寄存器赋值。在后面的r e l e a s e语句中, C o l t因为过程性连续赋值在C o l t上重新生效而重新获得值5。<br>
<br>
[ 本帖最后由 altera2008 于 2006-12-11 17:56 编辑 ] |