打印

信号和变量与寄存器的关系

[复制链接]
2281|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1003704680|  楼主 | 2013-4-1 19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
根本区别:信号赋值在相应的进程、函数、过程执行完之后才更新,一般会被综合成时序电路;变量赋值立即更新,一般被综合成组合电路。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信号:
如果信号的赋值是以另一个信号的跳变为条件的,该信号经过综合后会产生寄存器。
注:进程里面所有的信号都是在敏感信号跳变时发生改变的,但那不是以另一个信号的跳变为条件的赋值,它的赋值是一直都存在的,这种情况下的信号通常被综合成组合逻辑,如在ifrising_edge())then条件下的赋值算是以跳变为条件的赋值。
3.3建议:1)在需要表示连线的时候使用变量。
如在process里面需要将integer类型的ABCDEF相加与100比较的时候,为了让if条件表达式简单,我们可以用变量sum=A+B+C+D+E+F;然后if (sum100比较),这样表达式看起来就要简单很多,也更加直观易懂。在这种情况下,并不会被综合成寄存器,用了只是为了方便代码的编写、阅读和理解。
另外,因为变量是即时更新的,上面的语句后面再用sum 来表示GHIJK之和,再用来与其他的值比较也是可以的。当然也可以定义其他变量来表示,反正在这种情况下他们是不占资源的。
在以上情况不要使用信号。如果是在时序电路中,用信号来表示会导致一个CLK的延时。
2)其他情况下建议使用信号吧,至少在计数器中使用信号比使用变量占用的资源要少。
用变量来做计数器,综合后得到的是加法器和寄存器。当脉冲上升沿到来的时候,触发器将上一次输出的值加1作为输入输出,传到加法器输出,用来比较使能其他寄存器。因为寄存器同步输出后又经过了加法器组合逻辑的运算,会产生延时,影响到建立时间和保持时间。在同步时序电路的设计中,这是不合理的。
            要是知道当时开发VHDL语言的人使怎么想的,他们设置变量和信号的初衷是为什么,想分别用它们来干嘛就好了。希望大侠多指教。

相关帖子

沙发
ifpga| | 2013-4-2 08:41 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:但行善事,不问前程!

554

主题

1007

帖子

2

粉丝