包括三部分:可编程逻辑块(CLB,Configurable Logic Block)、I/O模块(IOB,I/O Block)、可编程互连资源(PIR,Programmable Interconnect Resource) (1)、可编程逻辑块CLB:
是实现用户功能的基本单元,它们通常规则地排列成一个阵列 主要由逻辑函数发生器、触发器、数据选择器等部分组成。
逻辑函数发生器: CLB中的逻辑函数发生器都是基于查找表结构。
查找表结构(LUT,Look-up Table):LUT本质上就是一个RAM。 每一个LUT可以看成一个有4位地址线的16x1的RAM。 当用户通过描述了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
(2)、IOB:主要完成芯片上逻辑与外部封装脚的接口,它通常排列在芯片的四周;主要由输入触发器、输入缓冲器和输出触发器/锁存器、输出缓冲器组成。 每个IOB控制一个引脚,它们可以被配置为输入、输出或双向I/O功能。
( 3)、PIR: 可编程互连资源(PIR)包括各种长度的连线线段和一些可编程连接开关, 它们将各个CLB之间或CLB、 IOB之间以及IOB之间连接起来,构成特定功能的电路。这些金属线段带有可编程开关,通过自动布线实现FPGA内部的CLB和CLB和IOB之间的连线。 连线有三种互连结构:单长线、双长线、长线。
2.3.3 CPLD与FPGA的异同
(1)、相同点:输入/输出单元; 逻辑块阵列;互连资源 (2)、CPLD与FPGA的差别:
? CPLD是阵列式结构,基于乘积项技术, FPGA是单元式结构,基于查找表技术;
? CPLD器件的关键技术是E2PROM和快闪存储器工艺 , FPGA通常采用CMOS SRAM工艺;
? CPLD拥有上电即可工作的特性, FPGA需要一个加载过程
? CPLD的内连续性的布线结构使其时序延迟具有均匀性和可预测性, FPGA具有的分段式布线结构使其时序延迟具有不可预测性;
? CPLD 比较适合于实现各种组合逻辑, FPGA比较适合于含有时序逻辑较多的电路
2.3.4 Altera 公司生产的PLD器件
主要产品分为CPLD和FPGA两大类型
CPLD 基本结构单元是乘积项,在工艺上采用E2PROM编程单元。 FPGA 类型器件采用SRAM编程单元。
2.3.5 PLD器件的发展趋势
(1)向大规模、高集成度方向进一步发展 (2)向低电压、低功耗的方向发展 (3)向高速可预测延时的方向发展 (4)向功能丰富型发展
(5)向模数混合可编程方向发展 边界扫描测试技术:
边界扫描测试技术主要解决芯片的测试问题。
11 / 16
标准的边界扫描测试只需要四根信号线,能够对电路板上所有支持边界扫描的芯片内部逻辑和边界管脚进行测试。应用边界扫描技术能增强芯片、电路板甚至系统的可测试性。
3. Verilog HDL 语言
3.1 Verilog HDL 基础 3.1.1 词法
Verilog HDL程序是由各种符号流构成的,我们把它们称之为词法。 Verilog HDL 中的词法类型包括:
(1) 间隔符与注释符; (2) 数值; (3) 字符串;
(4) 标识符、关键字; (5) 运算符。 一、间隔符与注释符
间隔符包括空格符、制表符(tab)、换行以及换页符。
Verilog HDL有两种注释形式,单行注释以两个字符“//”起始,以新的一行作为结束;而段注释则是以/*起始,以*/结束。 二、数 值 Verilog HDL的数值由以下四个基本的值组成:0—代表逻辑0或假状态
1—代表逻辑1或真状态 x—逻辑不定态 z—高阻态
在程序运行中,其值不能改变的量称为常量。整型数、实型数 1).整型数及其表示: +/-<位宽>' <基数> <数值>
a、数值常量不能将下划线“_” 其放于数值的首位。 b 、在’和进制之间,数值之间不允许出现空格。
c、如果定义的位宽比实际的位数长,通常在左边补0,但如果数的最左边一位为x或z, 就相应的用x或z在左边补位。 d、数值常量中的“z”可以用“?”来代替。 2).实型数及其表示:
Verilog中的实数可以用十进制表示法与科学计数法两种格式来表示
如果采用十进制格式,小数点两侧都必须至少有一位数字,否则为非法表示形式。 ☆实数可以转化为整数,根据四舍五入的原则。 三、字符串
在Verilog中,字符串大多用于显示信息的命令中。
字符串常量是用双引号括起来的字符序列串,它必须包含在同一行中,不能分成多行书写。 字符串变量是寄存器型变量。 四、标识符、关键字 标识符:
用户为程序描述中的Verilog 对象所起的名字。 模块名、端口名和实例名都是标识符。
12 / 16
? 标识符必须以英语字母a-z, A-Z起头,或者用下横线符 _ 起头。其中可以包含数字、 $符和下横线符。
? Verilog 是大小写敏感的。 【特殊标识符】:
‘$’ 符号表示 Verilog 的系统任务和函数 特殊符号 “#” 常用来表示延迟
关键字:是Verilog语言内部的专用词,所有的关键词都是小写的。
3.1.2 数据类型
连线型数据相当于硬件电路中的各种物理连接,代表的是物理连接线。
寄存器型数据一般对应的是具有状态保持作用的电路,如触发器、寄存器、锁存器。 它的特点是输出能保持其值,直到它被赋于新的值。
? 对于端口信号,输入端口只能是net类型。输出端口可以是net类型,也可以是register类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句,assign 连续赋值语句),则为net类型。
? 内部信号类型与输出端口相同,可以是net或register类型。
parameter 用来定义常量,即用来定义一个标识符代表一个常量。主要用于定义延迟时间和变量宽度。
3.1.3运算符
按所带操作数的个数区分,运算符可分为3类:单目运算符、双目运算符、三目运算符。
按功能分:算术运算符、关系运算符、等式运算符、逻辑运算符、位运算符、 缩位逻辑运算符、移位运算符、并接运算符等。
(1)算术运算符用于进行数值运算,+、–、*、/、%。 (2)逻辑运算符: &&(逻辑与)、||(逻辑或)、!(逻辑非) (3)位运算:将两个操作数按对应位分别进行逻辑运算: ~(非)(按位取反); &(与); |(或); ^(异或);^~,~^(同或); ~&(与非); ~|(或非) (4) 关系运算符>(大于);>= (大于等于) ;< (小于);<= (小于等于)。 (5) 等式运算符:= =(相等);!=(不相等);= = =(全等);!= =(不全等)。 (6)缩位运算符:缩位运算符将一个矢量缩减为一个标量。 &(与);|(或);^(异或);^~(同或);~&(与非);~|(或非)。 (7)移位运算符A<
3.2 Verilog HDL中的模块 3.2.1 模块
13 / 16
模块是Verilog HDL语言的基本描述单位,它用于描述某个电路的功能或结构,以及它与其它模块通信的外部端口。
module <模块名> (<端口列表>) 端口说明 (input,output,inout) 数据类型说明(wire reg)
逻辑功能或结构构成定义(门元件例化、assign数据流always块行为描述、调用其它模块) endmodule
每个模块实现特定的功能;模块可以进行层次嵌套。
Verilog HDL程序一行可以写多条语句,也可以一条语句分成多行书写,每条语句以分号结束, endmodule语句后面不必写分号。
3.2.2 Verilog HDL 数字设计中模块中功能的基本描述方式
(1)、结构描述方式: 描述电路是由哪些基本元件组成,以及相互连接关系。 内置门级元件(12个逻辑门and or xor not 等 )、用户自己定义的模块。 门元件的调用调用格式:门元件名称 实例名 (端口列表) 多输入门的端口列表: (输出、输入1、输入2、输出3…….); 对于三态门输入、输出端口:输出,输入,使能控制端); 对于buf和not输入、输出端:(输出1,输出2,输出3,输入); (2)、数据流描述方式: 以“assign”关键字开头的连续赋值语句 。 连续赋值语句的语法为: assign #延时量 变量名 = 赋值表达式; (3)、行为描述方式: 行为描述指电路输入输出信号间的逻辑关系。 (4)、混合设计描述方式: 行为功能主要使用过程语句来描述。
3.3 Verilog HDl 行为语句 3.3.1 过程语句
(1)initial 过程语句
作用与特点: initial语句主要用于初始化和波形生成,initial 过程块中的语句顺序执行且仅执行一次。 语法格式: initial begin 语句1; 语句2; ..... 语句n; end 变量一定被声明为reg型。
(2)always 过程语句
特点:always语句后跟着的语句是否执行,则要看它的触发条件是否满足,如满足则运行该语句一次,如不断满足则不断地循环执行。
语法格式:always @ (敏感信号表达式 ) 块语句
3.3.2 块语句
14 / 16
串行块begin_end
串行块(顺序块)有以下特点:
1) 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。 2) 每条语句的延迟时间是相对于前一条语句执行结束的时间而言的。 3) 直到最后一条语句执行完,程序流程控制才跳出该语句块。 顺序块的格式如下: begin 或 语句1; begin:块名 语句2; 块内声明语句 ; ..... 语句1; 语句n; 语句2; end ......
语句n;
3.3.3 赋值语句 end
(1) 连续赋值语句
以关键字assign 开头的为连续赋值语句,主要用于对wire型变量进行赋值。 (2) 过程赋值语句
用在过程语句当中,一般用于对reg型变量进行赋值。 过程赋值有阻塞赋值和非阻塞赋值两种方式。 阻塞赋值方式 赋值符号为“=”。 阻塞赋值语句执行的过程是:首先计算右端赋值表达式的取值,然后立即将计算结果赋值给“=”左端的被赋值变量。如果在一个块语句中,有多条阻塞赋值语句,在前面的赋值语句没有完成之前,后面的语句就不能被执行。
非阻塞赋值方式 赋值符号为“ < =”。
非阻塞赋值方式的特点是:在整个过程块结束时才完成赋值操作。一齐赋值。
3.3.4 条件语句
(1)If-else语句 (1) if(表达式) 语句;
(2) if(表达式) 语句1 ; else (2)case 语句 语句2;
case 语句有三种表示方式: 1) case(表达式)
1)在case语句中,控制表达式与分支表达式的值之间的比较是一种全等比较(===),必须保证两者的对应位全等。
2) casez与casex语句是case语句的两种变体,在casez语句中,z被认为是无关值。在casex语句中,值x和z都被认为是无关位。
3)可以用? 字符来代替字符x或z,表示无关位。
15 / 16
(3) if(表达式1) 语句1;
else if(表达式2) 语句2; else if(表达式3) 语句3; ........
else if (表达式m) 语句m; else 语句n;