VHDL语言总结

一、基本结构

1、库、程序包

库存放程序包定义、实体定义、结构定义和配置定义。

库说明语句格式为:

library 库名;
use 库名.程序包名.项目名;

如:IEEE的STD_LOGIC_1164程序包的库说明语句为:

library IEEE;                    --说明使用的库
use IEEE.STD_LOGIC_1164.ALL;     --说明使用的程序包

2、实体设计(实体说明,结构体)

(1)实体说明,语句格式为:

entity 实体名 is
       [generic(类属表);]      
       [port(端口表);]
end entity 实体名;

如:2输入与非门的实体说明语句为:
entity NAND2 is                          --实体名为NAND2
       port(A,B:int STD_LOGIC;           --输入端口为A,B
              C:out STD_LOGIC);          --输出端口为C
end entity NAND2;

(2)结构体,语句格式为:
architecture 结构体名 of 实体名 is
      [说明语句];
begin
      [功能描述语句];
end architecture 结构体名;

如:2输入与非门的结构体语句为:
architecture DATAFLOW of NAND2 is
begin
      C<=A nand B;                      --用逻辑表达式描述输入输出关系
end architecture DATAFLOW;

3、配置

一个实体可以用不同的结构体来描述,在仿真或硬件映射时,具体采用哪个结构体,可以通过配置语句实现。

配置语句格式为:

configuration 配置 of 实体名 is
      配置说明
end configuration 配置名;

如:将2输入与非门的结构体配置给实体说明为:
configuration FIRST of NAND2 is
      for DATAFLOW                      --将结构体DATAFLOW配置给实体NAND2
      end for;
end configuration FIRST;

二、基本语法

1、语言要素

数据对象:

(1)变量定义语法格式为:

variable 变量名 : 数据类型 :=初始值;
如:
variable A : boolean :=false;

(2)信号定义语法格式为:
signal 信号名 : 数据类型 :=初始值;
如:
signal A : std_logic :='0';

数据类型:

bit , integer , boolean , character , string , time

很重要的两个:std_logic(工业标准逻辑型)和std_logic_vector(工业标准逻辑矢量型),后者其实就是多个前者的组合。

运算操作符:


2、语句

时钟信号有效边沿的描述

CLK'event and CLK='1';     --时钟信号CLK变化且变化后CLK=1(即上升沿)
CLK'event and CLK='0';     --时钟信号CLK变化且变化后CLK=0(即下降沿)

when语句

第一种方式:
赋值目标<=表达式 when 复制条件 else
      表达式 when 复制条件 else
      ……
      表达式;

如:2线-4线译码器
architecture A of DECODER4 is
begin
      Y0<='1' when X="00" else '0';
      Y1<='1' when X="01" else '0';
      Y2<='1' when X="10" else '0';
      Y4<='1' when X="11" else '0';
end architecture A;

第二种方式:
with 选择表达式 select
      赋值目标信号<=表达式 when 选择值,
            表达式 when 选择值,
            ……
            表达式 when 选择值;

如:4线-2线编码器
architecture A of ENCODER2 is
begin
      with X select
            Y<="00" when "0001",
               "01" when "0010",
               "10" when "0100",
               "11" when "1000",
               "00" when others;
end architecture A;

if语句

方式一:
if 条件 then
      顺序语句;
end if;

方式二:
if 条件 then
      顺序语句1;
else
      顺序语句2;
end if;

方式三:
if 条件 then
      顺序语句1;
elsif 条件 then
      顺序语句2;
elsif 条件 then
      顺序语句3;
end if;

case语句

case 表达式 is
when 选择值 =>顺序语句1;
when 选择值 =>顺序语句2;
……
[when other => 顺序语句n;]
end case;

如:1线-4线分配器
D0 <='0'; D1<='0';
D2 <='0'; D3<='0';
case SEL is
      when "00" =>D0 <= D;
      when "01" =>D1 <= D;
      when "10" =>D2 <= D;
      when others =>D3 <= D;
end case;

wait语句

wait;                    --无限等待
wait on 敏感信号表;      --敏感信号变化时结束等待,执行后面语句
wait until 条件;         --直到条件满足时结束等待,执行后面语句
wait for 时间表达式;     --直到等待时间到时结束等待,执行后面语句

如:等待时钟的D触发器
process                                 --使用wait on语句时,process语句中不说明CLK
begin
      wait on CLK;                      --直到敏感信号CLK变化时,执行后面语句
      if(CLK='1')then                   --CLK上升沿触发
            Q<=D after 10ns;            --上升沿到来10ns后,寄存
            QN<=not D after 10ns;
      end if;
end process;

loop语句

第一种方式:
[标号]:for 循环变量 in 循环变量取值范围 loop
      顺序描述语句;
end loop[标号];

如:求1~9之和
     SUM:=0;
ADDS:for I in 1 to 9 loop
           SUM:=I+SUM;
     end loop ADDS;

第二种方式:
[标号]:while 循环条件 loop
      顺序描述语句;
end loop [标号];

如:求1~9之和
     I:=1;
     SUM:=0;
ADDS:while (I<10) loop
           SUM:=I+SUM;
           I:=I+1;
     end loop ADDS;

next语句

next [标号] [when 条件];

如:
LP1:while (I<10) loop
LP2:      while (J<20) loop
                next LP1 when (I=J);   --当I=J时,跳到LP1执行,否则向下执行,相当于C语言的goto语句
          end loop LP2;
    end loop LP1;

exit语句

exit [标号] [when 条件];

功能与next类似,不过当标号为缺省值时,表示跳出本层loop

assert语句

assert 条件 [report 输出信息] [severity 级别];

如:
assert (Z='1') report "CONTROL ERROR" severity ERROR;

null语句

空操作,如:null;

generate语句


3、源码分析(4位乘法器,采用的是Booth算法)

library IEEE;                                  --包含IEEE库

use IEEE.STD_LOGIC_1164.ALL;                   --包含IEEE库中这些包的所有项目

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity yuanfan is                               --实体yuanfan的说明

Port ( ai,bi : in std_logic_vector(3 downto 0); --实体的端口表:ai,bi为两个四位输入,即乘数与被乘数

       done  : out std_logic;                               --标识该乘法运算正常是否完成

       clk   : in std_logic;                                --脉冲信号输入端口,为了调试方便,在后面没用到它

       op    : out std_logic_vector(7 downto 0));           --为八位输出,即计算结果

end yuanfan;

architecture Behavioral of yuanfan is           --实体yuanfan的结构体

begin

   process(ai,bi,clk)

       variable a,b,m : std_logic_vector( 3 downto 0);

       variable cp: std_logic_vector( 1 downto 0);

       variable t: std_logic;

       variable counter: integer;               --记录着运算步骤

       begin

            counter:=0;

            t:='0';

            a:=ai;                              --被乘数赋值于a

            b:=bi;                              --乘数赋值于b

            m:="0000";                          --初始化m,最后记录着乘积的高四位

            cp:=b(0)&'0';

            done<='0';

            while counter<4 loop                --4位乘法器,运算4次即跳出循环

                 case cp is

                 when "10"=> m:=m-a;

                 when "01"=> m:=m+a;

                 when others=>m:=m;

            end case;

            t:=b(0);

            b:=m(0)&b(3 downto 1);              --随着b的每一位计算之后被移除,部分积高四位的朝b向右移进,最后b会保存着乘积的低四位

            m:=m(3)&m(3 downto 1);              --部分积为补码算术移位

            cp:=b(0)&t;

            counter:=counter+1;

            end loop;

         op<= m&b;

         done<='1';

    end process;

end Behavioral;



你可能感兴趣的:(VHDL语言总结)