综合——硬件描述语言

1. 硬件描述语言的种类

    (1)VHDL
    (2)Superlog
    (3)Verilog
    (4)SystemVerilog
    (5)chisel
    (6)SystemC(高层次)感觉不应该归为HDL
    (7)Cynlib C++(高层次)感觉不应该归为HDL
    (8)C (高层次)感觉不应该归为HDL

     硬件描述语言需要有的功能:
        1. 描述电路的连接
        2. 描述电路的功能
        3. 描述电路的时序
        4. 表达具有并行性

1.1 VHDL的发展与特点

1.1.1 VHDL的起源与发展

    VHDL 全名Very-High-Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言。早在1980年,因为美国军事工业需要描述电子系统的方法,美国国防部开始进行VHDL的开发。1987年,由IEEE(Institute of Electrical and Electro- nics Engineers)将VHDL制定为标准。参考手册为IEEE VHDL语言参考手册标准草案1076/B版,于1987年批准,称为IEEE 1076-1987。应当注意,起初VHDL只是作为系统规范的一个标准,而不是为设计而制定的。第二个版本是在1993年制定的,称为VHDL-93,增加了一些新的命令和属性。1996年,IEEE-1076.3成为VHDL综合标准。第三个版本是VHDL-2008.

1.1.2 VHDL标准

    (1) vhdl初始版本按照IEEE的IEEE 1076-1987 设计。包括范围广泛的数据类型,包括数字(整数 interger 和实数 real)、逻辑(位 bit 和布尔值 boolean)、字符(character )和时间(time),以及bit队列(bit_vector)和称为字符串character的string。
    (2) IEEE standard 1164, 定义了 9种逻辑值定义: 标量 std_logic and 向量 std_logic_vector,解决了87版本种”多值逻辑“问题。作为std_Ulogic其父类型的已解析子类型,std_logic-typed 信号允许对总线结构建模进行多次驱动,由此连接的解析函数可以充分处理冲突的分配。1993 年更新的IEEE 1076使语法更加一致,命名更加灵活,扩展了character类型以允许ISO-8859-1可打印字符,添加了xnor运算符等。
    (3)2000和2002标准做了一下小的调整,添加了类似C++的受保护类型并删除了一些端口映射的限制规则。
    (4)IEEE 标准 1076.2 增加了对真实和复杂数据类型的更好处理。IEEE 标准 1076.3 引入了有符号和无符号类型以促进对向量的算术运算。IEEE 标准 1076.1(称为VHDL-AMS)提供了模拟和混合信号电路设计扩展。
    (5)2006 年 6 月,Accellera的 VHDL 技术委员会(由 IEEE 委派负责该标准的下一次更新)批准了所谓的 VHDL-2006 草案 3.0。在保持与旧版本完全兼容的同时,这个提议的标准提供了许多扩展,使编写和管理 VHDL 代码更容易。主要变化包括将子标准(1164、1076.2、1076.3)合并到主要 1076 标准中、一组扩展的运算符、更灵活的case和generate语句语法、合并 VHPI(VHDL 过程接口)(与 C/C++ 语言的接口) 和 PSL 的一个子集 (属性规范语言)。这些更改应该会提高可综合 VHDL 代码的质量,使测试平台更加灵活,并允许更广泛地使用 VHDL 进行系统级描述。
    (6)2008 年 2 月,Accellera 批准了 VHDL 4.0,也非正式地称为 VHDL 2008,它解决了 3.0 版试用期间发现的 90 多个问题,并包括增强的泛型类型。2008 年,Accellera 向 IEEE 发布了 VHDL 4.0,以进行投票以纳入 IEEE 1076-2008。VHDL 标准 IEEE 1076-2008 于 2009 年 1 月发布。

1.1.3 VHDL修订历史

    IEEE 1076-1987 美国空军对该语言 7.2 版的第一个标准化修订。
    IEEE 1076-1993 (也与ISBN 1-55937-376-8一起发布)。几年的反馈带来了显着的改进。可能是使用最广泛的版本,具有最大的供应商工具支持。
    IEEE 1076-2000。小修订。介绍受保护类型的使用。
    IEEE 1076-2002。 1076-2000 的小修订。放宽 缓冲港    规定。IEC 61691-1-1:2004。 IEC 采用 IEEE 1076-2002。
    IEEE 1076c-2007。引入了 VHPI,即 VHDL 程序接口,它为软件提供了访问 VHDL 模型的方法。VHDL 语言需要稍作修改以适应 VHPI。
    IEEE 1076-2008(以前称为 1076-200x)。主要修订版于 2009-01-26 发布。除其他更改外,该标准合并了 PSL 的一个基本子集,允许对包和子程序进行泛型,并引入了外部名称的使用。
    IEC 61691-1-1:2011。IEC 采用 IEEE 1076-2008。
    IEEE 1076-2019。主要修订。

1.1.4 VHDL标准

    1076.1 VHDL 模拟和混合信号 ( VHDL-AMS )
    IEEE 1076.1.1 VHDL-AMS 标准包 (stdpkgs)
    IEEE 1076.2 VHDL 数学包
    IEEE 1076.3 VHDL 综合包 (vhdlsynth) (数字标准)
    IEEE 1076.3 VHDL 综合包 – 浮点 (fphdl)
    IEEE 1076.4 Timing(面向 ASIC 库的 VHDL 倡议:至关重要)
    IEEE 1076.6 VHDL 综合互操作性(2010 年撤回)[11]
    IEEE 1164 VHDL 多值逻辑 (std_logic_1164) 包。

1.1.4 VHDL程序的组成

        VHDL是一种强类型语言,不分大小写,其语法多继承至ADA,其程序的组成如下图所示:


VHDL组成
1.1.4.1 VHDL的数据类型与关键字
保留关键字

        更多VHDL的数据类型与基本操作可以参考硬件描述语言VHDL

1.1.4.2 库的内容

    库是专门用于存放预先编译好的程序包的地方,对应一个文件目录,程序包的文件就放在此目录中,其功能相当于共享资源的仓库,所有已完成的设计资源只有存入某个“库”内才可以被其他实体共享。库的说明总是放在设计单元的最前面,表示该库资源对以下的设计单元开放。库语句格式如下:
        LIBRARY 库名 ;
        常用的库有IEEE库、STD库和WORK库:
    IEEE库:是VHDL设计中最常用的资源库,包含IEEE标准的STD_LOGIC_1164、NUMERIC_BIT、NUMERIC_STD以及其他一些支持工业标准的程序包。其中最重要和最常用的是STD_LOGIC_1164程序包,大部分程序都是以此程序包中设定的标准为设计基础。
STD库:是VHDL的标准库,VHDL在编译过程中会自动调用这个库,所以使用时不需要用语句另外说明。
    WORK库:是用户在进行VHDL设计时的现行工作库,用户的设计成果将自动保存在这个库中,是用户自己的仓库,同STD库一样,使用该库不需要任何说明。

1.1.4.3 包

        程序包是用VHDL语言编写的一段程序,可以供其他设计单元调用和共享,相当于公用的“工具箱”,各种数据类型、子程序等一旦放入了程序包,就成为共享的“工具”,类似于C语言的头文件,使用它可以减少代码的输入量,使程序结构清晰。在一个设计中,实体部分所定义的数据类型、常量和子程序可以在相应的结构体中使用,但在一个实体的声明部分和结构体部分中定义的数据类型、常量及子程序却不能被其他设计单元使用。因此,程序包的作用是可以使一组数据类型、常量和子程序能够被多个设计单元使用。
程序包分为包头和包体两部分。包头(也称程序包说明)是对包中使用的数据类型、元件、函数和子程序进行定义,其形式与实体定义类似。包体规定了程序包的实际功能,存放函数和过程的程序体,而且还允许建立内部的子程序、内部变量和数据类型。包头、包体均以关键字PACKAGE开头。程序包格式如下。调用程序包的通用模式为:USE 库名.程序包名.ALL;

--包头格式:
PACKAGE 程序包名 IS
[包头说明语句]
END 程序包名;
1.1.4.4 实体
实体
1.4.4 结构体

        结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。形式如下:

结构体名 OF 实体名 IS
定义语句法;
BEGIN
功能描述语句法;
END 结构体名称;
  • 行为描述
  • 数据流描述
  • 寄器传输(RTL)
    例:用行为描述方式设计的全加器
ENTITY onebitadder IS
PORT(a,b,cin:IN BIT;
Sum,count:OUT BIT);
END onebitadder;

ARCHITECTURE behavior OF onebitadder IS
BEGIN
PROCESS(a,b,cin)
BEGIN
Sum<= a XOR b XOR cin;
Count<=(a AND b) OR ((a XOR b) AND cin);
END PROCESS;
END behavior;
  • 块语句结构
块结构名:
BLOCK 
端口说明 类属说明
BEGIN
并行语句
END BLOCK 块结构名;
  • 进程语句结构
进程名:
PROCESS(敏感信号表) IS
进程说明
BEGIN
顺序描述语句
END PROCESS 进程名;

1.1.6 IEEE库

    numeric_std
    std_logic_1164std_logic_arith
        std_logic_unsigned
        std_logic_signed
        std_logic_misc

1.1.7 VHDL示例程序

/*
    this is a block comment (VHDL-2008)
*/
-- import std_logic from the IEEE library
library IEEE;
use IEEE.std_logic_1164.all; 

-- this is the entity
entity ANDGATE is
  port ( 
    I1 : in std_logic;
    I2 : in std_logic;
    O  : out std_logic);
end entity ANDGATE;

-- this is the architecture
architecture RTL of ANDGATE is
begin
  O <= I1 and I2;
end architecture RTL;

上述例子是一个与门的输出;

//这是一个计数器的例程
//1.IEEE的lib库引入
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;    -- for the unsigned type

entity COUNTER is
  generic (
    WIDTH : in natural := 32);
  port (
    RST   : in std_logic;//数据类型定义
    CLK   : in std_logic;
    LOAD  : in std_logic;
    DATA  : in std_logic_vector(WIDTH-1 downto 0);
    Q     : out std_logic_vector(WIDTH-1 downto 0));
end entity COUNTER;

architecture RTL of COUNTER is

begin
  process(all) is
  begin
    if RST then
      Q <= (others => '0');
    elsif rising_edge(CLK) then
      if LOAD then
        Q <= DATA;
      else
        Q <= std_logic_vector(unsigned(Q) + 1); --Addition is unsigned, converted back to std_logic_vector
      end if;
    end if;
  end process;

end architecture RTL;

1.2 Verilog语言介绍

1.2.1 Verilog的发展

  • Verilog-95:随着当时VHDL的日益成功,Cadence 决定使该语言可用于开放标准化。Cadence 将 Verilog 转移到Open Verilog International (OVI)(现称为Accellera)组织下的公共领域。Verilog 后来提交给IEEE,成为 IEEE 标准 1364-1995,通常称为 Verilog-95。
  • Verilog-2001:Verilog-95 的扩展被提交回 IEEE,以弥补用户在原始 Verilog 标准中发现的缺陷。这些扩展成为称为 Verilog-2001 的 IEEE标准 1364-2001。Verilog-2001 是 Verilog-95 的重大升级。首先,它增加了对(2 的补码)有符号网络和变量的显式支持。以前,代码作者必须使用笨拙的位级操作来执行有符号操作(例如,简单的 8 位加法的进位位需要明确描述布尔代数以确定其正确值)。Verilog-2001 下的相同功能可以通过内置运算符之一更简洁地描述:+、-、/、、>>>。generate-endgenerate 构造(类似于 VHDL 的 generate-endgenerate)允许 Verilog-2001 通过正常的决策运算符(case-if-else)控制实例和语句的实例化。使用 generate-endgenerate,Verilog-2001 可以实例化一组实例,并控制各个实例的连接性。几个新的系统任务改进了文件 I/O。最后,添加了一些语法以提高代码的可读性(例如,always、@、命名参数覆盖、C 风格的函数/任务/模块头声明)。Verilog-2001 是大多数商业EDA软件包支持的 Verilog 版本。
  • Verilog 2005:Verilog 2005(IEEE标准 1364-2005)包含一些小的更正、规范说明和一些新的语言特性(例如 uwire 关键字)。Verilog 标准的一个单独部分Verilog-AMS试图将模拟和混合信号建模与传统 Verilog 集成。

1.2.2 Verilog的关键字与基本语法介绍

  • verilog标识符
        标识符可以是一组字母、数字、下划线和$符号的组合,且标识符的第一个字符必须是字母或者下划线。另外,标识符区分大小写。

  • verilog关键字
    always, and, assign,begin,buf,bufif0,bufif1,case,casex,casez,cmos,deassign, default,defparam,disable,edge,else,end,endcase,endmodule,endfunction,endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function,highz0, highz1, if,initial, inout, input,integer,join,large,macromodule,medium,module, nand,negedge,nmos,nor,not,notif0,notifl, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pullup, pulldown, rcmos, reg, releses, repeat, mmos, rpmos, rtran, rtranif0,rtranif1,scalared,small,specify,specparam,strength,strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg,vectored,wait,wand,weak0,weak1,while, wire,wor, xnor, xor

    常用关键字含义

  • verilog操作符

    verilog操作符

  • verilog数据类型
            Verilog的数据类型可以分为线网(wire)、寄存器(reg)、向量(数组)、整数(integer)、实数(real)、时间(time)、存储器、参数(parameter)、字符串(向量)。更多Verilog数据类型请移步verilog数据类型

  • verilog语法与例程

//简单的计数器功能
module Div20x (rst, clk, cet, cep, count, tc);
// TITLE 'Divide-by-20 Counter with enables'
// enable CEP is a clock enable only
// enable CET is a clock enable and
// enables the TC output
// a counter using the Verilog language

parameter size = 5;
parameter length = 20;

input rst; // These inputs/outputs represent
input clk; // connections to the module.
input cet;
input cep;
output [size-1:0] count;
output tc;
reg [size-1:0] count; // Signals assigned
                      // within an always
                      // (or initial)block
                      // must be of type reg
wire tc; // Other signals are of type wire
// The always statement below is a parallel
// execution statement that
// executes any time the signals
// rst or clk transition from low to high
always @ (posedge clk or posedge rst)
  if (rst) // This causes reset of the cntr
    count <= {size{1'b0}};
  else
  if (cet && cep) // Enables both  true
    begin
      if (count == length-1)
        count <= {size{1'b0}};
      else
        count <= count + 1'b1;
    end
// the value of tc is continuously assigned
// the value of the expression
assign tc = (cet && (count == length-1));
endmodule
...
reg a, b, c, d;
wire e;
...
always @(b or e)
  begin
    a = b & e;
    b = a | b;
    #5 c = b;
    d = #6 c ^ e;//一个简单的time delay 例程
  end

更多了解请移步Verilog说明,verilog基本语法

参考文献

1.硬件描述语言的现状与发展
2.VHDL维基百科
3.1076-2008
4.硬件描述语言
5.VHDL学习笔记
6.verilog维基百科

你可能感兴趣的:(综合——硬件描述语言)