VHDL编程基础

[复制链接]

150

主题

445

帖子

1900

积分

审核员

Rank: 9Rank: 9Rank: 9

积分
1900
查看: 3116回复: 1 发表于 2019-9-10 15:49:52   只看该作者
一、 VHDL顺序语句
两大基本描述语句:顺序语句(Sequential Statements)和并行语句(Concurrent Statements)
顺序语句用以定义进程、过程和函数的行为。
特点:每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,但相应的硬件逻辑工作方式未必如此,希望读者在理解过程中要注意区分VHDL语言的软件行为及描述综合后的硬件行为间的差异。
VHDL顺序语句:
           ① 赋值语句;
           ② 转向控制语句;
           ③ 等待语句;
           ④ 子程序调用语句;
           ⑤ 返回语句;
           ⑥ 空操作语句。


1.赋值语句

1)信号和变量赋值
赋值语句有两种,即信号赋值语句和变量赋值语句。
区别:
    ①变量具有局部特征,它的有效性只局限于所定义的一个进程/子程序中,它是一个局部的,暂时性数据对象(在某些情况下)。对于它的赋值是立即发生的(假设进程已启动)。
    ②信号则不同,信号具有全局性特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信(端口本质上也是一种信号)。信号的
      赋值并不是立即发生的,它发生在一个进程结束时。赋值过程总是有某些延时的,它反映了硬件系统的重要特性,综合后可以找到与信号对应的硬件结构。

语法格式:
         变量赋值目标 :=  赋值源;
         信号赋值目标 < =  赋值源;


1)信号和变量赋值
【例】
SIGNAL   SI,S2:STD_LOGIC;
SIGNAL   SVEC :  STD_LOGIC_VECTOR(0TO7);
```
PROCESS(S1, S2) IS
  VARIABLE    V1,  V2: STD_LOGIC;
  BEGIN
     V1:=”1”;         - - 立即将V1置位为1
     V2:=”1”;         - - 立即将V2置位为1
      S1<=”1”;          - - S1被赋值为1
      S2<=”1”;          - - 因S2不是最后一个赋值语句,故不作任何赋值操作
      SVEC(0)<=V1;      - - 将V1在上面的赋值1,赋给SVEC(0)
      SVEC(1)<=V2;      - - 将V2在上面的赋值1,赋给SVEC(1)
      SEVC(2)<=S1;      - - 将S1在上面的赋值1,赋给SVEC(2)
      SVEC(3)<=S2;      - - 将最下面的赋于S2的值”0”,赋给SVEC(2) ,发生在一个进程结束时
      V1:=”0” ;      - - 将V1置入新值0
      V2:=”0”;       - - 将V2置入新值0  
      S2<=”0”;       - - S2最后一次将赋值的”0”将上面准备赋入的”1”覆盖掉
      SVEC(4)<=V1:      - - 将V1在上面的赋值0,赋给SVEC(4)
      SVEC(5)<=V2;      - - 将V2在上面的赋值0,赋给SVEC(5)
      SVEC(6)<=S1;      - - 将S1在上面的赋值1,赋给SVEC(6)
      SVEC(7)<=S2;      - - 将S2在上面的赋值0,赋给SVEC(7)
END   PROCESS;

2)赋值目标
(1)标识符赋值目标及数组单元素赋值目标
   ① 标识符赋值目标:以简单的标识符作为被赋值的信号或变量名
   ② 数组单元素赋值目标:数组类信号或变量名(下标名)
        (见前例)  
(2)段下标元素赋值目标及集合块赋值目标
①段下标元素赋值目标:数组类信号或变量名(下标1  TO/DOWNTO  下标2)
括号中的两个下标必须用具体数值表示,并且起数值范围必须在所定义的数组下标范围内,两个下标的排序方向要符合方向关键词TO或DOWNTO。
【例】
VARIABLE  A,B:STD_LOGIC_VECTOR(1 TO 4);
A(1 TO 2):=“10”;       - - 等效于A(1):=‘1’,A(2):=‘0’
A(4 DOWNTO 1):=“1011“; - - 等效于A(4):=‘1’,A(3):=‘0’,
                                   - -  A(2):=‘1’,A(1):=‘1’

(2)段下标元素赋值目标及集合块赋值目标
  ② 集合块赋值目标,是以一个集合的方式来赋值的。对目标中的每个元素进行赋值的方式有两种,即位置关联赋值方式和名字关联赋值方式。
【例】
SIGNAL A,B,C,D:STD_LOGIC;
SIGNAL S:  STD_LOGIC_VECTOR(1 TO 4)

VARIABLE    E, F:STD_LOGIC;
VARIABLE    G: STD_LOGIC_VECTOR(1 TO 2);
VARIABLE    H:STD_LOGIC_VECTOR(1 TO 4);
S<=(‘0’,‘1’,‘0’,‘0’);
(A,B,C,D)<=S;                    - - 位置关联方式赋值,赋值结果等效于:
                                                                     A<=‘0’;B<=‘1’;C<=‘0’;D<=‘0’;
           …                           - - 其他语句
(3=>E, 4=>F, 2=>G(1), 1=>G(2)):=H;    - - 名字关联方式赋值,赋值结果等效
                 --于:G(2):=H(1); G(1):=H(2); E:=H(3); F:=H(4);



2.转向控制语句
     转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1)IF语句  
     IF语句是一种条件语句,其语句结构如下:
             IF  条件句  THEN
                   顺序语句;
            {ELSIF   条件句  THEN
                   顺序语句;}
             [ELSE
                   顺序语句;]
            END  IF;
注意:IF语句中至少应有一个条件句,条件句必须由布尔表达式构成。
            IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选
            择执行其后的顺序语句。

     转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。

1)IF语句  
例:锁存器
      if (ena = ‘1’)  then
           q <= d;
       end  if;
      综合后生成锁存器(latch)

如:- -描述一个具有2输入与门功能的函数
FUNCTION   AND_FUNC(X,Y:IN  BIT) RETURN  BIT  IS
               BEGIN
                     IF  X=‘1’  AND  Y=‘1’  THEN  RETURN  ‘1’;
                     ELSE   RETURN  ‘0’;
                     END IF;
END  FUNCTION  AND_FUNC;  

如:- -描述二选一电路
architecture  rtl  of  mux2  is
  begin
     process(a, b, sel)
     begin
        if (sel = ‘1’)  then
            y <= a ;
        else
            y <= b ;
        end  if ;
     end  process ;
  end  architecture  rtl ;

转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。

1)IF语句  
例:D触发器

library ieee;
use ieee.std_logic_1164.all;
entity   FD  is   
    port (d,clk: in std_logic;
                   q: out std_logic);
end entity FD;
architecture  one  of  FD  is
    signal sig_save: std_logic;
begin
    process(clk)
        begin
        if  clk'event and clk=‘1' then   sig_save<=d; end if;
        q<=sig_save;
       --q<=not sig_save;
end process;
end architecture one;


43

主题

241

帖子

509

积分

单晶硅锭

Rank: 3Rank: 3

积分
509
发表于 2019-9-10 16:28:18   只看该作者
谢谢分享
快速回复 返回顶部 返回列表