根本区别:信号赋值在相应的进程、函数、过程执行完之后才更新,一般会被综合成时序电路;变量赋值立即更新,一般被综合成组合电路。3.1变量: 1、如果一个变量在一个信号跳变时被赋值,并且该值最终又被赋给另外的信号,那么综合后就会产生寄存器。 2、如果一个变量在还没有进行赋值操作时已经被使用了,也会产生寄存器。 如:计数器。 -- process(clk) -- variable cnt : integer RANGE 0 to 5; -- begin -- if(rising_edge(clk))then -- if(cnt < 5)then -- cnt := cnt + 1; -- else -- cnt := 0; -- end if; -- -- if cnt = 3 then -- q <= not q; -- end if; -- -- end if; -- end process 在计数器里面,cnt:= cnt + 1这一句看着像是先赋值,然后才被使用,同时也没有将值赋给别的信号;实际上是先被使用了才被赋值的。因为像:=之类的运算符都是先算右边再算左边的,所以它是先使用再赋值的。所以会生成寄存器,用来保存cnt的值。 3.2信号:如果信号的赋值是以另一个信号的跳变为条件的,该信号经过综合后会产生寄存器。 注:进程里面所有的信号都是在敏感信号跳变时发生改变的,但那不是以另一个信号的跳变为条件的赋值,它的赋值是一直都存在的,这种情况下的信号通常被综合成组合逻辑,如在if(rising_edge())then条件下的赋值算是以跳变为条件的赋值。 3.3建议:1)在需要表示连线的时候使用变量。如在process里面需要将integer类型的A、B、C、D、E、F相加与100比较的时候,为了让if条件表达式简单,我们可以用变量sum:=A+B+C+D+E+F;然后if (sum与100比较),这样表达式看起来就要简单很多,也更加直观易懂。在这种情况下,并不会被综合成寄存器,用了只是为了方便代码的编写、阅读和理解。 另外,因为变量是即时更新的,上面的语句后面再用sum 来表示G、H、I、J、K之和,再用来与其他的值比较也是可以的。当然也可以定义其他变量来表示,反正在这种情况下他们是不占资源的。 在以上情况不要使用信号。如果是在时序电路中,用信号来表示会导致一个CLK的延时。 2)其他情况下建议使用信号吧,至少在计数器中使用信号比使用变量占用的资源要少。 用变量来做计数器,综合后得到的是加法器和寄存器。当脉冲上升沿到来的时候,触发器将上一次输出的值加1作为输入输出,传到加法器输出,用来比较使能其他寄存器。因为寄存器同步输出后又经过了加法器组合逻辑的运算,会产生延时,影响到建立时间和保持时间。在同步时序电路的设计中,这是不合理的。 要是知道当时开发VHDL语言的人使怎么想的,他们设置变量和信号的初衷是为什么,想分别用它们来干嘛就好了。希望大侠多指教。 |