原创 【博客大赛】VHDL中信号与变量的区别及赋值的讨论之变量的使用

2013-12-6 11:44 3036 12 14 分类: FPGA/CPLD 文集: VHDL中信号与变量

上一篇文章中讲述了信号的使用,在这里讲一下变量的使用

变量的赋值

同信号不同,变量的赋值只能在进程内部完成。

 

1、变量的普通赋值

这里所说的变量的普通赋值,是指变量赋值不需要通过时钟边沿的驱动。由于进程中的语句都是顺序语句,所以进程中的变量赋值都是顺序执行的。但有一点需要注意,就是如果在一个进程中多次为一个变量赋值时,赋值会立即起作用,这就与C语言等普通的高级语言相类似了。什么意思呢?也就是说在进程内部多次为一个变量赋值时,赋值立即起作用;如果还将此变量赋给其他信号或变量,一律都按此变量的最近一次所赋的值赋给其它信号或变量,而为此变量多次赋值的语句的位置对结果产生影响。

例7(例8、9都是的实体与库文件说明与例7相同)

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity test is

              port(clk:in std_logic;

               a,b:in std_logic_vector(3 downto 0);

               y:out std_logic_vector(3 downto 0));

end entity test;

architecture one of test is

              begin

              process(a,b)

                  variable s: std_logic_vector(3 downto 0);

                 begin

                  s:=a;

                  s:=a+b;

                  y<=s+1;

              end process;

end architecture one;

在例7的程序中,由于s是变量,所以对s的赋值都是立即起作用的。变量与信号的赋值也都是顺序执行的,这些都与信号的赋值相类似。由于y<=s+1写在s:=a+b之后,所以将a+b的值赋给y。仿真结果如图6所示。

6.jpg

图6 变量的普通赋值(1)

例8:

              process(a,b)

                  variable s: std_logic_vector(3 downto 0);

                 begin

                 s:=a;

                 y<=s+1;

                 s:=a+b;

 end process;

在例8的程序中,由于s是变量,所以对s的赋值都是立即起作用的。变量与信号的赋值也都是顺序执行的,这些都与信号的赋值相类似。由于y<=s+1写在s:=a之后,所以将a的值赋给y。仿真结果如图7所示。

7.jpg

图7 变量的普通赋值(2)

变量的时钟边沿赋值

这里所说的变量的时钟赋值,是指变量赋值需要通过时钟边沿的驱动。由于变量不同于信号,其赋值是立即进行的;所以如果一个变量在时钟边沿到来时多次赋值,然后再将其赋给其它信号或变量,则将其最后一次赋值所得到的值在赋给其它信号或变量。

例9:

     process(clk)

                  variable s: std_logic_vector(3 downto 0);

                 begin

                  if clk='1'and clk'event then

                   s:=a;

                   y<=s+1;

                   s:=a+b;

                    end if;

end process;

在例9的程序中,如果clk发生变化,则执行此进程,如果clk出现上升沿,则执行if语句中的几句赋值语句;对s的进行赋值s:=a,所以将a的值立即赋给s;而y<=s+1这句赋值语句紧接着s:=a的后面,所以将此时的s加1然后赋给y;由于变量与信号不同,其作用的范围仅限于进程,所以与例5例6不同,y<=s+1这句赋值语句所执行的是s已经发生变化时(赋值变成新的a)的取值加1后再赋给y。仿真结果如图8所示。

8.jpg

图8 变量时钟边沿赋值(1)

例10:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity mux21 is

              port(clk:in std_logic;

                a,b:in std_logic_vector(3 downto 0);

               y:out std_logic_vector(3 downto 0));

end entity mux21;

architecture one of mux21 is

              begin

              process(clk)

              variable s: std_logic_vector(3 downto 0);

                 begin

                  if clk='1'and clk'event then

                   s:=a;

                   s:=a+b;

                   y<=s+1;

                  end if;

             end process;

end architecture one;

在例10的程序中,如果clk发生变化,则执行此进程,如果clk出现上升沿,则执行if语句中的几句赋值语句;对s的进行赋值s:=a+b,所以将a+b的值立即赋给s;而y<=s+1这句赋值语句紧接着s:=a+b的后面,所以将此时的s加1然后赋给y;由于变量与信号不同,其作用的范围仅限于进程,所以与例5例6不同,y<=s+1这句赋值语句所执行的是s已经发生变化时(赋值变成新的a+b)的取值加1后再赋给y。仿真结果如图9所示。

9.jpg

图9 变量时钟边沿赋值(2)

上述例1~10的程序必须要有use ieee.std_logic_unsigned.all;,否则报错:can’t interpret subprogram call。

文章评论2条评论)

登录后参与讨论

用户1725879 2013-12-3 09:34

是上一篇的姊妹篇,质量没有上一篇高,但是总体感觉还可以!

用户1725882 2013-12-3 09:27

终于看到变量的分析了,上次看到博主的信号的分析感觉着实不错,让人对信号的认识更加清晰了,现在又看到了姊妹篇,不错不错,来顶一个。
相关推荐阅读
1053683568_507245520 2014-03-20 11:19
cadence16.6 软件绘制PCB板
   最近一直在学习cadence的使用,现在就对近来学习做个总结,虽然还没有达到熟练的程度,但是也希望可以给后来者做个借鉴吧。         本人的方向是硬件方向,马上面临着找工作的压力。...
1053683568_507245520 2014-01-03 21:02
【博客大赛】自己定制DPRAM的读写操作
DPRAM的读写操作 下面是本人写的DPRAM的读写操作,自己定制DPRAM,不用altera FPGA 内部自带的IP core,选择的存储器块类型是M9K(对于不同类型的存储器块,当同时对...
1053683568_507245520 2013-12-15 20:51
【博客大赛】我的EDN
我的EDN 每次进入EDN网站,看到大家在踊跃的分享自己的学习经历,经验,以及聊生活谈梦想,都会激发我的热情,激发我对生活的热爱,对未来的幻想,对自己的思索。当我懒惰时,我会进来看看,看看特权...
1053683568_507245520 2013-12-07 11:31
【博客大赛】利用FPGA控制VGA接口来使显示器显示彩条纹(里面包括调试中的查错检查方法)
利用FPGA控制VGA接口来使显示器显示彩条纹 最近一直在调关于通过VGA接口来控制显示器的程序,今天终于调试出结果来了,赶紧上来与大家分享一下。 1、VGA显示原理 常见的彩色显示器...
1053683568_507245520 2013-12-06 11:45
【博客大赛】利用VHDL产生奇分频器
利用VHDL产生占空比为50%的奇倍数分频电路 一般的介绍VHDL语言的书在对分频器进行举例描述的时候,都是举得偶数倍分频的例子,因为那相对来说比较简单(只需要设置一个中间信号变量,然后在分频...
1053683568_507245520 2013-12-06 11:45
【博客大赛】VHDL进程语句的并行执行分析
相信许多人在学习VHDL时,都会对进程如何执行的,以及进程之间的并行执行产生疑问,本文将以下面一个具体的例子来分析单个进程的执行,与进程之间的并行执行。 library ieee; use...
我要评论
2
12
关闭 站长推荐上一条 /2 下一条