3.4  VHDL中的描述语句

    顺序(Sequential)描述语句和并行(Concurrent)描述语句是VHDL程序设计中两大基本描述语句系列。在逻辑系统的设计中,这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。

 

3.4.1  顺序(sequential)描述语句

顺序语句只能出现在进程(Process)和子程序中。在VHDL中,一个进程是由一系列顺序语句构成的额,而进程本身属并行语句,这就是说,在同一设计实体中,所有的进程是并行执行的。然而任一给定的时刻内,在每一个进程内,只能执行一条顺序语句。一个进程与其设计实体的其他部分进行数据交换的方式只能通过信号或端口。如果要在进程中完成某些特定的算法和逻辑操作,也可以通过依次调用子程序来实现,但子程序本身并无顺序和并行语句之分。利用顺序语句可以描述逻辑系统中的组合逻辑、时序逻辑或它们的综合体。

    常用的顺序描述语句有:赋值语句if语句case语句loop语句next语句exit语句子程序调用语句return语句wait语句null语句

       

   1. 变量赋值与信号赋值  

变量赋值与信号赋值的区别在于,变量具有局部特征,它的有效只局限于所定义的一个进程中,或一个子程序中,它是一个局部的、暂时性数据对象(在某些情况下)。对于它的赋值是立即发生的(假设进程已启动),即是一种时间延迟为零的赋值行为。

信号则不同,信号具有全局性特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信(端口本质上也是一种信号)。信号的赋值并不是立即发生的,它发生在一个进程结束时。赋值过程总是有某种延时的,它反映了硬件系统并不是立即发生的,它发生在一个进程结束时。赋值过程总是有某种延时的,它反映了硬件系统的重要特性,综合后可以找到与信号对应的硬件结构,如一根传输导线、一个输入输出端口或一个D触发器等。

变量赋值语句和信号赋值语句的语法格式如下:

变量赋值目标:=赋值源;

信号赋值目标 <= 赋值源;

在信号赋值中,需要注意的时,当在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的时最后一个赋值源的赋值,其前面相同的赋值目标不作任何变化。

例:信号赋值与变量赋值的不同结果

        信号赋值:

        architecture  rtl of sig  is

             signal  a,  b : std_logic;      -- 定义信号

        begin       

             process(a, b)

             begin

                   a <= b ;

                   b <= a ;

             end  process ;

        end  rtl ;                  -- 结果是 a 和 b 的值互换

变量赋值:

       architecture  rtl  of  var  is

       begin

           process

               variable  a,  b : std_logic ;     -- 定义变量

           begin

               a := b ;

               b := a ;

            end  process ;

       end  rtl ;    -- 结果是 a 和 b 的值都等于b 的初值        

 

 

例:变量赋值实现循环语句功能

     process(indicator)

         variable  temp : std_logic ;

     begin

          temp := ‘0’ ;

          for  i  in  0  to  3  loop

               temp := temp  xor  (sig(i)  and  indicator(i)) ;

          end  loop ;

          output <= temp ;

     end  process ;

 

以上语句等效为:

   process(indicator)

        variable  temp : std_logic ;

   begin

        temp := ‘0’ ;

        temp := temp  xor  (sig(0)  and  indicator(0)) ;

        temp := temp  xor  (sig(1)  and  indicator(1)) ;

        temp := temp  xor  (sig(2)  and  indicator(2)) ;

        temp := temp  xor  (sig(3)  and  indicator(3)) ;

        output <= temp ;

   end  process ;

 

 

上一页  下一页  返回