集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2334|回复: 4

VHDL常见问题解惑

[复制链接]
小泡泡 发表于 2010-4-23 11:37:52 | 显示全部楼层 |阅读模式
不少人在编写VHDL时常常分不清信号与变量有什么不同。正确使用信号与变量是完成设计的必要环节,这里有一个程序大家看一下。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

  
---- Uncomment the following library declaration if instantiating

---- any Xilinx primitives in this code.

--library UNISIM;

--use UNISIM.VComponents.all;

  
entity sig_vari is

port

(reset,clk:in std_logic;

aout,bout,coutut integer range 0 to 127

);

end sig_vari;

  
architecture Behavioral of sig_vari is

signal a,b:integer range 0 to 127;

begin

process(reset,clk)

variable c:integer range 0 to 127;

begin

  if reset='1' then

    a<=1;

    b<=4;

    c:=1;

  elsif rising_edge(clk) then

    c:=c+1;

    a<=c+1;

    b<=a+2;

  end if;

cout<=c;

end process;

aout<=a;

bout<=b;


  


从源代码和波形图中,我们可以看出信号与变量的一些不同。

首先,声明信号用signal,赋值符号为”<=”,而变量声明为variable,赋值符号为”:=”。

其次,信号在architecture内,process外定义;而变量在process内定义。也就是说信号可以在整个结构体内有效,可以在不同进程间传递数值;变量只是在定义该变量的进程中有效,不能被别的进程所用。

   最后,请大家仔细观察reset为0时的第一个时钟上升沿,执行变量运算c:=c+1后c的值立即变成2(可以通过cout监测c的信号),a<=c+1所以a也相应变为3,但是b<=a+2却没有变成5(3+2),而是变成3(1+2)。从这个实例我们可以看出,进程中变量赋值语句一执行,目标变量马上被赋予新值,在执行下一条语句(本例中a<=c+1)该变量值为上一句新赋的值;而信号的赋值不会是信号立即发生改变,下一条语句执行时若用到被赋值变量仍使用原来的信号值(a=1,因此b的值为1+2=3),信号在进程挂起时才发生代入。大家可以写几个变量与信号混合的程序仿真一下,理解变量和信号的区别。

   待
wjfpga 发表于 2010-11-28 16:15:54 | 显示全部楼层
为啥没图呢
FPGAgj 发表于 2010-11-29 23:17:01 | 显示全部楼层
很好嘛!!
weibode01 发表于 2010-12-1 13:25:16 | 显示全部楼层
都是要记的
mhrh 发表于 2010-12-10 15:56:05 | 显示全部楼层
很好嘛!!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-27 17:24 , Processed in 0.057316 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表