第 6章 存储器和可编程逻辑器件数字逻辑器件分类:
1) 标准产品:包括门、触发器、计数器、译码器、数据选择器等等中小规模数字电路。
标准产品的特点是:批量大,成本低,价格便宜,速度快。
是数字系统传统设计中使用的主要逻辑器件。
缺点是:器件密度低,所构成的数字系统规模大,印刷线路板走线复杂,焊点多,使电路的可靠性差,功耗大。
2)由软件配臵的大规模集成电路:如微处理机、单片微型计算机等。
这类电路的特点:器件密度高,逻辑功能可由软件配臵,
用它所构成的数字系统硬件规模小,系统灵活性高。
缺点:工作速度不够高,另外,这类芯片一般要用多片标准集成电路构成外围电路才能工作。
3)专用集成电路( ASIC)
Application Specific Integrated Circuit
ASIC是为满足一种或几种特定功能而设计制造的集成电路芯片,密度高,ASIC芯片能取代由若干个中小规模电路组成的电路板,甚至一个完整的数字系统
ASIC分类,ASIC属用户定制电路。( Custom Design
IC).包括全定制和半定制两种。
全定制( Full custom design IC):半导体生产厂家根据用户的特定要求专门设计并制造。
特点:生产周期长,费用高,风险大。在大批量定型产品中使用。
半定制( Semi- custom design IC):半导体生产厂家设计并制造出的标准的半成品芯片。
半定制电路分类:
㈠ 门阵列 ( Gate Array)
在硅片上预先做好大量相同的基本单元电路,并把它整齐地排成阵列,这种半成品芯片称为 母片 。 母片 可由厂家大批量生产。
当用户需制作满足特定要求的 ASIC芯片时,可根据设计要求选择 母片,由用户或厂家设计出连线版图,再由器件生产厂家经过 金属连线 等简单工艺,制成成品电路。
缺点,用户主动性差,使用不方便。
特点,周期较短,成本较低,风险小。
㈡ 可编程逻辑器件 (PLD)
(Programmable Logic Device)
芯片上的电路和金属引线由半导体厂家做好,其逻辑功能由用户开发实现。
特点:集成度高,速度快,灵活性好,可重复编程。电路设计方便,风险低。
1,PLD器件的连接表示方法固定连接可编程连接 不连接
2,门电路表示法
1 A
A
1
A
AA A
反向缓冲器
A
B
C
&
F
A B C
&
F
与门
A
B
C
≥1
F
A B C
≥1
F
或门
3,阵列图 1
A
1
B
1
C
&
&
&
&
D=BC
E=AABBCC=0
F=AABBCC=0
G=1
6.1 存储器存储器是一种通用大规模集成电路,用来存放程序和数据,
存储器分类,1) 只读存储器 (ROM)
2) 随机存取存储器 (RAM)
6.1.1 ROM (Read-Only Memory)
ROM存放固定信息,只能读出信息,不能写入信息,当电源切断时,信息依然保留,
1,ROM的结构
.
.
.
.
.
.
A0
A1
An-1
地址译码器存储阵列
2n× m
W0
W1
W2n-1
F0 F1 Fm-1
字线 位线地址线
1) 地址译码器为二进制译码器,即全译码结构,(地址线为
n根,译码器输出为 2n根字线,说明存储阵列中有 2n个 存储单元 )
2) 存储阵列输出有 m根位线,说明每个 存储单元 有 m位,即一个字有 m位二进制信息组成,每一位称为一个 基本存储单元,
3) 存储器的容量定义为,字数 × 位数 (2n× m).
一个二极管 ROM的例子
A1 A0 F0 F1 F2 F3
0 0 0 1 0 0
0 1 1 0 0 1
1 0 0 1 1 0
1 1 0 0 1 0
1
A1
1
A0
&
&
&
&
W0
W1
W2
W3
F0 F1 F2 F3 位线字线
① W0~W3为地址译码器的输出 Wi=mi (mi为地址码组成的最小项)
② 当 A1A0=00时,W0=1,F0F1F2F3=0100(一个字);
当 A1A0=01时,W1=1,F0F1F2F3=1001(一个字);
当 A1A0=10时,W2=1,F0F1F2F3=0110(一个字);
当 A1A0=11时,W3=1,F0F1F2F3=0010(一个字)。
③ 将地址输入和 Fi之间的关系填入真值表得:
地址 数据
A1 A0 F0 F1 F2 F3
0 0 0 1 0 0
0 1 1 0 0 1
1 0 0 1 1 0
1 1 0 0 1 0
F0=A1A0
F1=A1A0+A1A0
F2=A1A0+ A1A0
F3=A1A0
ROM实际是一种组合电路结构。
④ 阵列图与阵列:
表示译码器。
或阵列:
表示存储阵列。
存储容量为:
4× 4
地址 数据
A1 A0 F0 F1 F2 F3
0 0 0 1 0 0
0 1 1 0 0 1
1 0 0 1 1 0
1 1 0 0 1 0
1A
1
1A
0
& & & &
≥1
≥1
≥1
≥1
F0
F1
F2
F3m
0m1 m2 m3
2.可编程只读存储器用户可根据需要自行进行编程的存储器,
1) PROM(Programmable Read-Only Memory)
PROM为能进行一次编程的 ROM,PROM的结构和 ROM
基本相同,只是在每个存储管上加一根易熔的金属丝接到相应的位线,
位线字线当在该位上需要存 0时,通过编程,烧断熔丝 ;当需存 1时,
保留熔丝,
编程为一次性的,烧断的熔丝不能再接上,
2)EPROM
(Erasable Programmable Read-Only Memory)
EPROM为可擦除、可重新编程的只读存储器,擦除用专用的紫外线灯照射芯片上的受光窗口,
EPROM器件的基本存储单元采用浮栅雪崩注入 MOS管
(简称 FAMOS管 )电路,
FAMOS
VDD
D S
字线位线原始状态的浮栅不带电荷,FAMOS管不导通,位线上为高电平,当 FAMOS管的源极 S与衬底接地电位,漏极接高电位 (较大 )时,漏极的 PN结反向击穿产生雪崩现象,使 FAMOS导通,位线为低电位,
如用紫外线或者 X射线照射 FAMOS
管,可使栅极放电,FAMOS恢复到截止状态,
一个 EPROM芯片,Intel 2716
VCC VPP OE CE
GND
1 12
1324
CE是片使能端;
OE是数据输出使能端;
VPP是编程写入电源输入端。
容量,2K× 8位受光窗口工作方式读 出未选中待 机编 程禁止编程校验读出
CE OE VPP 数据线 D7~D0的状态
0 0 +5V 读出的数据
× 1 +5V 高 阻
1 × +5V 高 阻
1 +25V 写入的数据
0 1 +25V 高 阻
0 0 +25V 读出校验数据
2716工作方式
3) E2PROM(电可擦可编程只读存储器)
特点:①编程和擦除均由电完成;
②既可整片擦除,也可使某些存储单元单独擦除;
③重复编程次数大大高于 EPROM,
3.PROM的应用
1) 实现组合逻辑函数用 PROM实现组合逻辑函数,实际上是利用 PROM中的最小项,通过或阵列编程,达到设计目的,
F1(A,B,C)=Σm(1,5,6,7)
F2(A,B,C)=Σm(0,1,3,6,7)
F3(A,B,C)=Σm(3,4,5,6,7)
例,用 PROM实现逻辑函数,
1A
& & & &
≥1
≥1
≥1
F1
F2
F3
1B
1C
& & & &
m0 m1 m2 m3 m4 m
5
m6 m7
2) 存放数据表和函数表,例如三角函数、对数、乘法等表格。
3)存放调试好的程序。
* 2),3)是 PROM的主要用途。
6.1.2 随机存取存储器 (RAM)
RAM可以随时从任一指定地址读出数据,也可以随时把数据写入任何指定的存储单元,
RAM在计算机中主要用来存放程序及程序执行过程中产生的中间数据、运算结果等,
RAM按工艺分类,1) 双极型 ; 2) 场效应管型 。
场效应管型分为,1) 静态 ; 2) 动态 。
1,RAM的结构
.
.
.
.
.
.
A0
A1
An-1
地址译码器存 储矩 阵
W0
W1
W2n-1
字线地址线读写 /控制电路读写 /控制 (R/W)片选 (CS) 数据输入 /输出
(I/O)
EN
EN
1
1
I/O
D R/W
当片选信号 CS无效时,I/O对外呈高阻 ;
当片选信号 CS有效时,由 R/W信号决定读或写,根据地址信号,通过 I/O输出或输入,(I/O为双向三态结构 )
2,RAM的存储单元
1) 静态 RAM的基本存储单元
(以六管 NMOS静态存储单元为例 )
Xi
YjI/O I/O
VCC
QQT6
T4
T3 T1
T2
T5
T7T8
位线
Bj
位线
Bj
存储单元
1 1
I/O I/O
Q Q
2) 动态 RAM的基本存储电路动态 RAM的基本存储电路由动态 MOS基本存储单元组成。
动态 MOS基本存储单元通常利用 MOS管栅极电容或其它寄生电容的电荷存储效应来存储信息。
电路结构(以单管动态存储单元为例)
位线数据线
(D)
字选线
T
CS CD
输出电容写信息:字选线为 1,T导通,
数据 D经 T送入 CS,
读信息:字选线为 1,T导通,
CS上的数据经 T送入位线的等效电容 CD,
特点,1)当不读信息时,电荷在电容 CS上的保存时间约为数毫秒到数百毫秒;
2)当读出信息时,由于要对 CD充电,使
CS上的电荷减少。为破坏性读出。
3)通常在 CS上呈现的代表 1和 0信号的电平值相差不大,故信号较弱。
结论,1)需加刷新电路;
2)输出端需加高鉴别能力的输出放大器。
3)容量较大的 RAM集成电路一 般采用单管电路。
4)容量较小的 RAM集成电路一 般采用三 管或四管电路。多管电路结构复杂,但外围电路简单。
3) RAM容量的扩展 VCC A8 R/W
CS GND
1 9
1018
Intel 2114
A9A7
A5 A4A6 A0 A1A3 A2
I/O1 I/O2 I/O3I/O4
① 位扩展
I/O1 I/O2 I/O3 I/O4
A9A0 A1 … CSR/W
I/O1 I/O2 I/O3 I/O4
A9A0 A1 … CSR/W

A0
A1
A9
R/W
CS
I/O1 I/O2 I/O3 I/O4 I/O4 I/O5 I/O6 I/O7
将 2114扩展为 1K× 8位的 RAM
② 字扩展
I/O1 I/O2 I/O3 I/O4
A9A0 A1 … CSR/W
I/O1 I/O2 I/O3 I/O4
A9A0 A1 … CSR/W

A0
A1
A9
R/W
I/O1 I/O2 I/O3 I/O4
1 1-2译码器A10
将 2114扩展为 2K× 4位的 RAM
6.2 可编程逻辑器件( PLD)
PLD是 ASIC的一个重要分支。 PLD包括 PLA,PAL、
GAL和 EPLD,FPGA等。
PLD具有集成度高,速度快,保密性好,可重复编程等特点。
输入输出输入电路与阵列或阵列输出电路
PLD基本结构框图互补输入项 与项 或项反馈项根据 与,或 阵列的可编程性,PLD分为三种基本结构。
1) 与 阵列固定,或 阵列可编程型结构
PROM属于这种结构。
2) 与,或 阵列均可编程型结构
PLA(Programmable Logic Array)属于这种结构。
特点:与阵列规模大,速度较低。
特点:速度快,设计逻辑函数可采用最简结构,芯片内部资源利用率高。但编程难度大,缺乏质高价廉的开发工具。
3) 或 阵列固定,与 阵列可编程型结构
PAL(Programmable Array Logic)属于这种结构。
该结构称为 PAL结构。
特点:速度快,费用低,易于编程。当前许多 PLD器件都采用这种结构。
6.2.1 可编程阵列逻辑 (PAL)
PAL的基本结构
1
1
1
& & & &
≥1
≥1
A0
A1
A2
F1
F0实际产品中,构成输出的乘积项可达 8个,
1,PLA的输出结构
PAL的与阵列结构类同,但输出结构有多种,
1) 组合输出型 (这种结构适用于实现组合逻辑电路 )
① 专用输出结构
O
& ≥1
1
输入项
I
… …
共有三种形式,
高输出有效 ;
低输出有效 ;
互补输出,
本例为低输出有效
② 可编程 I/O结构
I/O&
≥1
1
输入项
I
… …
EN
1
1
2) 寄存器输出型寄存器输出型结构,内含触发器,适应于实现时序逻辑电路,
① 寄存器输出结构
Q
& ≥1
1
输入项
I
… …
EN
1
1
1D
CLOCK EN
② 带 异或门 的寄存器输出结构
Q
& ≥1
1
输入项
I
… …
EN
1
1
≥1
1D=1
CLOCK EN
&

算术运算反馈结构
A
≥1
1
输入项
B
… …
EN
1
1
1D=1
CLOCK EN
&
≥1&
≥1
≥1
≥1
≥1
A
A
A+B
A+B
A+B
A+B
输出
≥1
EN
1
1
1D
CLK
EN
&
≥1
EN
1
1
1D&
1
1
1
IN1
IN8
OUT1
OUT8
… … …
PAL16R8
0
63
0 31
PAL的结构代码组合型寄存器型类型 代码
H
L
P
C
XP
S
R
X
RP
RS
V
含 义高有效输出低有效输出可编程输出极性互补输出异或门、可编程输出极性积项共享寄存器型输出带异或门寄存器型输出带可编程极性寄存器型带积项共享寄存器型通用型实 例
PAL10H8
PAL10L8
PAL16P8
PAL16C1
AmPAL22XP10
PAL20S10
PAL16R8
PAL16X4
PAL16RP8
PAL20RS10
AmPAL22V10
用 PAL实现 2× 2乘法器(输入 A1A0和 B1B0分别为两位二进制数,输出为结果 F3F2F1F0的反码。
逻辑方程为:
F3=A1+A0+B1+B0
F2=A1+B1+A0B0
F2=A0+B0
F1=A1A0+B1B0+A1B1+A0B0+A1A0B1B0
设计采用 PAL16L8
2)PAL应用举例
≥1
EN
1
1
1
&
1A1
F1
PAL16L8
0
0 31
1A0
1B1
1B0
F1=A1A0+B1B0+A1B1
+A0B0+A1A0B1B0
以实现 F1为例
3) PAL器件的性能特点
㈠ 逻辑功能由用户定义,用可编程方法代替常规 设计方法;
㈡ 编程容易,开发简单,简化了系统设计和布线 过程;
㈢ 器件密度大,可代替多片中小规模标准数字集成电路,
比用常规器件节省空间;
㈣ 器件传输延迟小,工作频率高,有利于提高系统的工作速度;
㈤ 具有可编程的三态输出,管脚配臵灵活,输入输出管脚数量可变;
㈥ 具有加密功能,有利于系统保密;
㈦ 采用多种工艺制造,可满足不同系统不同场合的各种需要。
6.2.2 通用阵列逻辑 (GAL)
GAL器件继承了 PAL,PROM等器件的优点,克服了原有 PAL器件的不足,是现代数字系统设计的理想器件,
1,GAL基本结构
GAL基本结构和 PAL大致类似,只是在输出结构上作了重要改进,
OLMC
EN
1
1
11
&
1
&
1
1
1
2
9
19
… … …
GAL16V8
0
63
0 31
OLMC
EN
1 12
OE
(12)
(19)
11
OLMC
结构
1
0
S
≥1
=1
PT
MUX
& ≥1
32
10
S1
S1
XOR(n)
AC0
AC1(n)
3
2
1
0
S1
S0
Vcc
TS
MUX
F
MUX
1
0
S O
MUX 1
EN
AC0
AC1(n)
C1
1D
来自与门阵列来自邻级输出
(m)
Q
CK OE
CK OE
1反馈
I/O(n)
乘积项数据选择器三态数据选择器输出数据选择器反馈数据选择器
AC0,AC1(n)及 XOR(n)均为 GAL器件片内控制字中的结构控制位。结构控制字共有 82位,不同的控制内容,可使
OLMC被配臵成不同的功能组态。
控制字的内容是在编程时由编程器根据用户定义 的管脚及实现的函数自动写入的。
2.GAL的主要特点
⑴ 通用性强
⑵ 100%可编程’
⑶ 速度高,功率低
⑷ 100%可测试
6.2.3 PLD的开发过程
1) 逻辑设计
2)器件选择
3) 编制 JEDEC文件
4) 编程
5) 测试
6) 加密
6.3 VHDL语言
6.3,1 VHDL基本结构与语法
VHDL,VHSIC Hardware Description Language
VHSIC,Very High Speed Integrated Circuit
VHDL由美国国防部制定,以作为各合同商之间提交复杂设计文档的一种标准方案。
1987年被采纳为 IEEE1076标准
1993年被采纳为 IEEE1164标准
VHDL在语法和风格上类似与高级编程语言,如
C语言。但包含有许多硬件特有的结构。
VHDL广泛用于:
电路的文档记录设计描述的逻辑综合电路仿真
6.3.1.1 VHDL的组成一个 VHDL设计由若干个 VHDL文件构成,每个文件主要包含三个部分的一个或全部:
1.程序包 ( Package )
2.实体 ( Entity)
3.结构体 (Architecture)
一个完整的 VHDL设计必须包含一个实体和一个与之对应的结构体,也可以对应多个结构体,
程序包、实体和结构体作用示意图
VHDL设计
VHDL文件程序包 ( Package)
声明在设计或实体中将用到的常量,数据类型,
元件及子程序等实体 (Entities)
声明到其它实体及其它设计的接口,即定义本设计的输入 /输出端口,
结构体 (Architectures)
定义实体的实现,即电路的具体描述,
例:一个具有 异步清零、进位输入 /输出的四位二进制加法计数器 的 VHDL代码。
二进制计数器
nreset
ci
clk
co
32
10 qcnt
library ieee; --库,程序包调用
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY cntm16 IS --实体
PORT
( ci,IN std_logic;
nreset,IN std_logic;
clk,IN std_logic;
co,out std_logic;
qcnt,buffer std_logic_vector(3 downto 0)
--此处无 ‘ ;‘号
);
END cntm16;
ARCHITECTURE behave OF cntm16 IS --结构体
BEGIN
co<=?1‘ when (qcnt=?1111‘ and ci=?1‘) else?0‘;
PROCESS(clk,nreset) --进程 ( 敏感表 )
BEGIN
IF(nreset=?0‘) THEN
qcnt<=?0000‘;
ELSIF(clk‘EVENT AND clk=?1‘) THEN
if(ci=?1‘) then
qcnt<=qcnt+1;
end if;
END IF; --end if_reset
END PROCESS;
END behave;
6.3.1.2 实体 ( Entity)
实体的格式如下:
entity<entity_name 实体名 > is
port
<port list for your design,列出设计的输入 /输出信号端口 >
end<entity_name>;
以上述的四位计数器为例,则该计数器的实体部分如下
ENTITY cntm16 IS --实体
PORT
( ci,IN std_logic;
nreset,IN std_logic;
clk,IN std_logic;
co,out std_logic;
qcnt,buffer std_logic_vector(3 downto 0)
--此处无 ‘ ; ’ 号
);
END cntm16;
信号名 端口类型端口模式由此看出,实体 ( ENTITY) 类似于原理图中的符号
( Symbol),它并不描述模块的具体功能 。 实体的通信点是端口 ( PORT),它与模块的输入 /输出或器件的引脚相关联 。 上述实体对应的原理图符号如下:
nreset
ci
clk
co
qcnt[3..0]
cntm16
每个端口必须定义,
信号名,端口信号名在实体中必须是唯一的 。
信号名应是合法的标识符 。
属性,它包括
( MODE),决定信号的流向类型 ( TYPE),端口所采用的数据类型
● IN 信号进入实体但并不输出;
● OUT 信号离开实体但并不输入;并且不会在内部反馈使用;
● INOUT 信号是双向的 ( 既可以进入实体,
也可以离开实体 ) ;
● BUFFER 信号输出到实体外部,但同时也在实体内部反馈 。
BUFFER ( 缓冲 ) 是 INOUT( 双向 ) 的子集,但不是由外部驱动端口 模式 ( MODE)有以下几种类型:
端口模式可用下图说明,( 黑框代表一个设计或模块 )
IN OUT BUFFER INPUT
● integer 可用作循环的指针或常数,通常不用于
I/O信号;
例如:
SIGNAL count,integer range o to 255
count<=count+1
● bit 可取值 ‘ 0‘或 ‘ 1‘
● std_logic 工业标准的逻辑类型,取值 ‘ 0‘,‘ 1‘,
‘ X‘ 和 ‘ Z‘ --由 IEEE std 1164标准定义
● std_logic_vector std_logic的组合,工业标准的逻辑类型端口类型 ( TYPE) 定义端口的数据类型,包括以下几种:
6.3.1.3 结构体 ( Architecture)
所有能被仿真的实体都有一个结构体描述,结构体描述实体的行为功能 。 即设计的功能 。 一个实体可以有多个结构体,一种结构体可能为行为描述,而另一种结构体可能为设计的结构描述或数据通道的描述 。 结构体是
VHDL设计中最主要的部分,它一般有一些子部分构成,
如下图所示:
结构体 ( Architecture)
声明区 ( Declarations)
信号声明:声明用于该结构体的类型,常数,元件,子程序。
并发语句信号赋值计算结果,并赋值给信号过程调用调用一个预先定义好的算法元件例化调用另一个实体所描述的电路。即元件调用过程 定义一个新算法实现电路功能。在过程中赋值顺序语句。语句按放臵的顺序执行。
结构体的一般格式如下:
Architecture<architecture_name 结构体名 > of
<entity_name> is
--结构体声明区域
--声明结构体所用的内部信号及数据类型
--如果使用元件例化,则在此声明所用的元件
begin –以下开始结构体,用于描述设计的功能
--concurrent signal assignments 并行语句信号赋值
--processes 进程(顺序语句描述设计)
--component instantiations 元件例化
end<architecture_name>;
ARCHITECTURE behave OF cntm16 IS
BEGIN
co<=?1‘ when (qcnt=?1111‘ and ci=?1‘) else?0‘; --并行赋值语句
PROCESS(clk,nreset) --进程 ( 敏感表 )
BEGIN
IF(nreset=?0‘) THEN --顺序语句
qcnt<=?0000‘;
ELSIF(clk‘EVENT AND clk=?1‘) THEN
if(ci=?1‘) then
qcnt<=qcnt+1;
end if;
END IF; --end if_reset
END PROCESS;
END behave;
上述四位计数器的结构体如下:
6.3.1.4 程序包 ( Package) 与 USE语句下面是一个程序包的例子:
--包头说明
PACKAGE Logic IS
TYPE Three_level_logic IS (?0‘,?L‘,?Z‘);
CONSTANT Unknown_Value:Three_level_logic:=?0‘;
FUNCTION Invert (input:Three_level_logic)
RETURN Three_level_logic;
END Logic;
--包体说明
PACKAGE BODY Logic IS
--如下是函数的子程序体
FUNCTION Invert (input:Three_level_logic)
RETURN Three_level_logic;
BEGIN
CASE input IS
WHEN?0‘=>RETURN?1‘;
WHEN?1‘=>RETURN?0‘;
WHEN?Z‘=>RETURN?Z‘;
END CASE;
END Invert;
END Logic;
6.3.1.5 库 (Library)
库是专门存放预先编译好的程序包的地方,这样它们就可以在其它设计中被调用。
例如在上述计数器设计中开始部分有:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ieee 是 ieee 标准库的标志名,两个 USE语句使得以下设计可使用程序包 std_logic_1164,std_logic_unsigned中预定义的 全部 内容。
以下是 IEEE两个标准库? std‖与? ieee‖中所包含的程序包的简单解释:
库名 程序包名 包中预定义内容
std standard VHDL类型,如 bit,bit_vector
ieee std_logic 1164 定义 std_logic,std_logic_vector

ieee numeric_std 定义了一组基于 std_logic_1164中定义的类型的算术运算符,如,+”,
,-”,SHL,SHR等
ieee std_logic_arith 定义有符号与无符号类型,及基于这些类型上的算术运算。
ieee std_logic_signed 定义了基于 std_logic与 std_logic _
vector类型上的有符号的算术运算
ieee std_logic_unsigne
d
定义了基于 std_logic与 std_logic_
vector类型上的无符号的算术运算
6.3.1.6 VHDL运算符
·算术运算符 (Arithmetic operators)
+ 加
- 减
* 乘
/ 除
** 乘方
mod 求模
rem 求余
abs 求绝对值
·关系运算符
= 等于
/= 不等于
< 小于
<= 小于或等于
> 大于
>= 大于或等于注:其中‘ <=‘ 操作符也用于表示信号的赋值操作逻辑运算符
and 逻辑 与
or 逻辑 或
nand 与非
nor 或非
xor 异或
xnor 同或
not 逻辑 非
·连接运算符 & 连接,将两个对象或矢量连接成维数更大的矢量
6.3.1.7 数据对象在逻辑综合中,VHDL语言常用的数据对象为信号、
常量、变量。
· 信号( Signal)
用于声明内部信号,而非外部信号(外部信号对应为 in,out,inout,buffer),其在元件之间起互联作用,可以赋值给外部信号。
信号也可在状态机中表示状态变量。信号赋值符号为? <=‖。
· 变量
· 常量常量在设计描述中保持某一规定类型的特定值不变 。如利用它可设计不同模值的计数器,模值存于常量中,不同的设计,改变模值仅需改变此常量值。
常量在定义时赋初值,赋值符号为?,= ‖。
变量只在给定的进程中用于声明局部值或用于子程序中。赋值符号为?,= ‖。
下例为一位 DCB码加法计数器 的例子,
Entity bcdadder is
Port(op1,op2,in integer range 0 to 16;
result,out integer range 0 to 31
);
End dcdadder;
Architecture behavior of bcdadder is
constant adjustnum,integer:=6
--定义一常量,整数型,值为 6
signal binadd,integer range 0 to 18;
--定义一个信号,以保存两数二进制相加的和,
Begin
binadd<=op1+op2; --信号赋值
process(binadd)
variable tmp,integer:=0; -- 定义一个变量,并赋初值为 0
begin
if binadd>9 then
tmp:=adjustnum; --变量赋值,立即起作用
else
tnmp:=0;
end if;
result<=binadd+tmp;
end process;
End behavior;
6.3.1.8 VHDL常用语句
·VHDL 常用语句分并行( Concurrent)语句和顺序
( Sequential)语句:
并行语句( Concurrent),
顺序语句( Sequential),
并行语句总是处于 进程 ( PROCESS)的 外部 。
所有并行语句都是并行执行的,即与它们出现的先后次序无关。如 when..else语句顺序语句总是处于 进程 的 内部,并且从仿真的角度来看是顺序执行的。如 if-then-else语句下面先看一下进程:
1,进程 Process
进程用于描述顺序事件并且包含在结构中,一个结构体可以包含多个进程语句。
以下为进程语句的构成:
进程( Process)
声明区 ( Declarations)
内部变量声明:声明用于该进程的类型,常数,元件,子程序顺序语句信号赋值 (<=)
过程调用
null 语句 (空语句,值保持不变 )
wait 语句 (等待时钟信号 )
case 语句
loop语句 (循环 )
if 语句变量赋值 (,=)
next 语句 (跳过剩余循环 )
exit 语句 (退出循环 )
以下为进程语句的语法描述:
end process<optional_label>; --进程结束
<optional_label>,process <sensitivity list 敏感信号表 >
-- 此处声明局部变量,数据类型及其他局部声明
( 用于进程中)
begin --进程开始
--进程中为顺序语句,如:
--signal and variable assignments 信号与变量的赋值
--if and case statements --if-then-else 语句 case-when 语句
--while and for loops
--function and procedure calls 函数,过程调用如上述计数器为例:
PROCESS(clk,nreset)
BEGIN --顺序语句 异步清零
IF(nreset=?0‘) THEN
qcnt<=?0000‘;
ELSIF(clk‘EVENT AND clk=?1‘) THEN
if (ci=?1‘) then
qcnt<=qcnt+1;
end if ; --end if_reset
END IF;
END PROCESS;
2,并行 (Concurrent)语句和顺序 (Sequential)语句
□ 并行 (Concurrent)语句并行语句之间值的更新是同时进行的,与语句所在的顺序无关。并行语句包括:
● 布尔方程
●条件赋值 (如 when—else—语句 )
● 例化语句一、布尔方程四选一的数据选择器的库声明、程序包声明及实体定义如下:
library ieee;
use ieee.std_logic_1164.all;
entity mux4 is port
( s,in std_logic_vector(1 downto 0);
a0,a1,a2,a3,in std_logic;
y,out std_logic);
end mux4;
以 布尔方程 实现的结构体如下:
architecture archmux of mux4 is
begin
y<=((((a0 and not (s(0))) or (a1 and s(0)))) and
not (s(1))) or (((a2 and not s(0))) or (a3 and
s(0))) and s(1));
end archmux;
y=a0s1s0+a1s1s0+a2s1s0+a3s1s0
=(a0s0+a1s0)s1+(a2s0+a3s0)s1
二、条件赋值采用 WITH-SELECT-WHEN实现的结构体
architecture archmux of mux4 is
begin
with s select
y<= a0 when ―00‖,
a1 when ―01‖,
a2 when ―10‖,
a3 when others;
end archmux;
采用 WHEN-ELSE实现的结构体
architecture archmux of mux4 is
begin
y<= a0 when s=―00‖ else
a1 when s=―01‖ else
a2 when s=―10‖ else
a3;
end archmux;
□ 顺序 (Sequential)语句
,IF-THEN-ELSE
最常用的顺序语句是 IF-THEN-ELSE语句和 CASE-
WHEN语句
architecture archmux of mux4 is
begin
process(s,a0,a1,a2,a3)
begin
if s=―00‖ then
y<=a0;
elseif s=―01‖ then
y<=a1;
elseif s=―10‖ then
y<=a2;
else
y<=a3;
end if;
end process;
end archmux;
.CASE-WHENarchitecture archmux of mux4 is
begin
process(s,a0,a1,a2,a3)
begin
case s is
when ―00‖ => y<=a0;
when ―01‖ => y<=a1;
when ―10‖ => y<=a2;
when others => y<=a3;
end case;
end if;
end process;
end archmux;
6.3.1.9 元件及元件例化元件声明是对 VHDL模块的说明,使之可在其它模块中使用,元件声明可放在程序包中,也可以在某个设计的结构体中声明。
元件例化指元件的调用。
元件声明语法:
Component<元件实体名 >
port <元件端口信息,同该元件实现时的实体的 port部分 >;
End component;
--元件例化:
<例化名 >:<实体名,即元件名 >port map(<端口列表 >)
例如:在一 cntvh10设计中调用一个模为 10的计数 器
cntm10和一个七段译码器 decode47。
Library IEEE;
Use IEEE.std_logic_1164.all;
Entity cntvh10 IS --cntvh10为所要设计的电路名,
port
( Rd,ci,clk,in std_logic;
co,out std_logic;
qout,out std_logic_vector(6 downto 0))
end cntvh10;
ci co
nreset qcnt[3..0]
clk
cntm10ci
Rd
clk
co
adr[3..0] decodeout[6..0] qout
decode47
cntvh10
ci
Rd
clk
co
qout
cntvh由 cntm10和 decode47组成,
ARCHITECTURE arch OF cntvh10 IS
--元件声明
Component decode47 is
port
(adr,in std_logic_vector(3 downto 0);
decodeout,out std_logic_vector(6 downto 0));
End Component;
Component cntm10 is
port
(ci,nreset,clk,in std_logic;
co,out std_logic;
qcnt,buffer std_logic_vector(3 downto 0));
end component;
Signal qa,std_logic_vector(3 downto 0); --作为中间量
BEGIN
u1,cntm10 port map(ci,Rd,clk,co,qa);
u2,decode47 port map(decodeout=>qout,adr=>qa);
End arch;
所实现的电路为:
ci co
nreset qcnt[3..0]
clk
cntm10ci
Rd
clk
co
adr[3..0] decodeout[6..0] qout
decode47
顺序相同顺序不同为增加元件例化的灵活性,可定义 参数化元件 。下面定义一个 位数可调 的计数器。
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity cntnbits is
generic(cntwidth:integer:=4); --定义了一个可调参数,初始值为 4
port
( ci,nreset,clk,in std_logic;
co,out std_logic;
qcnt,buffer std_logic_vector(cntwidth-1 downto 0)
);
End cntnbits;
Architecture behave of cntnbits is
Constant allis1,std_logic_vector(cntwidth-1 downto 0):=(others=>?1‘);
Begin
co<=?1‘ when(qcnt=allis1 and ci=?1‘) else?0‘;
process(clk,nreset)
begin
if(nreset=?0‘) then
qcnt<=(other=>‘0‘);
elsif (clk‘event and clk=?1‘) then
if(ci=?1‘) then
qcnt<=qcnt+1;
end if;
end if;
end process;
end behave;
generic(cntwidth:integer:=4); 定义了一个整数 cntwidth,
赋初值为 4,需改变长度仅需改变初值。
元件声明为:
Component cntnbits is
generic(cntwidth:integer:=4);
port
( ci,nreset,clk,in std_logic;
co,out std_logic;
qcnt,buffer std_logic_vector(cntwidth-1 downto 0)
);
End component;;
Constant allis1,std_logic_vector(cntwidth-1 downto 0):=(others=>?1‘);
表示定义一个常量 allis1,用于进位判断,(others=>?1‘)
例化格式为:
<例化名 >:<实体名,即元件名 >
generic map(<实际参数,如确定的总线宽度等 >)
port map(<端口列表 >)
例如,例化为 10位计数器:
U1,cntnbits generic map(10)
port map(ci,Rd,clk,qa); --元件例化在上述的可变位数计数器中,定义了一个常数? allis 1‖用于产生进位输出信号时的判断。它的值为各位都为 ‘ 1‘。
此外,用了 (other= >‘1’)赋值。 (other= >‘1’)表示一个集合,集合中各元素用 ‘,’ 隔开。表示各元素都为 ‘ 1‘ 。
other必须出现在集合的最后。
例,signal:sa:std_logic_vector(7 downto 0);
sa<=(?1‘,?0‘,other=>?1‘)
其结果是给信号 sa赋值? 1011 1111‖。
6.3.1.10 配臵 (configuration)
一个实体可用多个结构体描述,在具体综合时选择哪一个结构体来综合,则由配臵来确定。即配臵语句来安装连接具体设计(元件)到一个实体 —结构体对。配臵被看作是设计的零清单,它描述对每个实体用哪一种行为,它非常象一个描述设计每部分用哪一种零件的清单。
配臵语句举例:
--这是一个两位相等比较器的例子,它用四种不同描 述来实现,既有四个结构体。
ENTITY equ2 IS
PORT (a,b,IN std_logic_vector(1 downto 0);
equ,OUT std_logic);
END equ2;
--结构体一:用元件例化来实现,即网表形式:
ARCHITECTURE netlist OF equ2 IS
COMPONENT nor2
PORT (a,b,IN std_logic;
C,OUT std_logic);
END COMPONENT;
COMPONENT xor2
PORT (a,b,IN std_logic;
C,OUT std_logic);
END COMPONENT;
signal x,std_logic_vector(1 downto 0);
BEGIN
U1,xor2 PORT MAP(a(0),b(0),x(0));
U2,xor2 PORT MAP(a(1),b(1),x(1));
U3,nor2 PORT MAP(x(0),x(1),equ);
END netlist;
--结构体二:用布尔方程来实现:
ARCHITECTURE equation of equ2 IS
BEGIN
equ<=(a(0) XOR b(0) NOR a(1) XOR b(1));
END equation;
--结构体三:用行为描述来实现,采用并行语句:
ARCHITECTURE con_behave of equ2 IS
BEGIN
equ<=?1‘ when a=b else?0‘;
END con_behave;
ARCHITECTURE seq_behave of equ2 IS
BEGIN
process(a,b)
begin
if a=b then equ<=?1‘;
else equ<=?0‘;
end if;
end process;
END seq_behave;
--结构体四:用行为描述来实现,采用顺序语句:
上述实例中,实体 equ拥有四个结构体,netlist、
qeuation,con_behave,seq_behave,若用其例化一个相等比较器 aequb,那么实体究竟对应于哪个结构体呢?配臵语句很灵活地解决了这个问题:
如选用结构体 netlist,则用
CONFIGURATION aequb OF equ2 IS
FOR netlist
END FOR;
END CONFIGURATION;
CONFIGURATION aequb OF equ2 IS
FOR con_behave
END FOR;
END CONFIGURATION;
如选用结构体 con_behave,则用以上四种结构体代表了三种描述方法,
Behavioral (行为描述 )
反映一个设计的功能或算法,一般使用进程 process,用顺序语句表达。
Dataflow (数据流描述 )
反映一个设计中数据从输入到输出的流向,使用并发语句描述。
Structure (结构描述 )
它最反映一个设计硬件方面特征,表达了内部元件间连接关系。使用元件例化来描述。
6.3.1.11 子程序子程序由函数 (FUNCTION)和过程 (PROCEDURE)组成。
函数只能用以计算数值,而不能用以改变与函数形参相关的对象的值。函数的参量只能是方式为 IN的信号与常量,
而过程的参量可以为 IN,OUT,INOUT方式。
过程能返回多个变量,函数只能由一个返回值。
过程和函数常见于面向逻辑综合的设计中,主要进行高层次的数值运算或类型转换、运算符重载,也可用来元件例化。
语法如下:
函数:
FUNCTION <function_name> (parameter types)
RETURN <TYPES> IS
BEGIN
<代码区 >
END <function_name>;
过程:
PROCEDURE <procedure_name 实体名 >
(<port list for the procedure,列出过程的输入 /输出信号端口 >) IS
BEGIN
<代码区 >
END <procedure_name>;
函数举例:此函数返回两数中的较小数
FUNCTION Min(x,y,INTEGER) RETURN
INTEGER IS
BEGIN
IF x<y THEN
RETURN x;
ELSE
RETURN y;
END IF;
END Min;
过程举例:此过程将向量转换成整数类型
USE ieee.std_logic_1164.ALL
PROCEDURE vector_to_int
( z,IN std_logic_vector;
x-flag,OUT BOOLEAN;
q,INOUT INTEGER) IS
BEGIN
q,=0;
x-flag,=false;
FOR I IN z‘ RANGE LOOP
q:=q*2;
IF z(i)/=?0‘ THEN
q:=q+1;
ELSIF z(i)=?0‘THEN
x-flag:=TURE;
END IF;
END LOOP;
END vector_to_int;
6.3.1.12 其他:属性、时钟的表示属性指的是关于实体、结构体、类型、信号的一些特征。比较有用的属性有:值类属性、信号类属性、范围类属性。
● 值类属性值类属性分为’ left,‘right,‘low,‘high,‘length。其中用符号? ’?隔开对象名及其属性。
left 表示类型最左边的值; right 表示类型最右边的值;
low 表示类型中最小的值; high 表示类型中最大的值;
length 表示限定型数组中元素的个数。
sdown,in std_logic_vector(8 downto 0);
sup,in std_logic_vector(0 to 8);
例:
则这两个信号的各属性值如下:
sdown‘left=8; sdown‘right=0; sdown‘low=0;
sdown‘high=8; sdown‘length=9;
sup‘left=0; sup‘right=8; sup‘low=0; sup‘high=8;
sup‘length=9;
● 信号类属性仅介绍一个对综合及模拟都很有用的信号类属性,’ event‘event的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为 Ture,否则为 False。用它可决定时钟边沿是否有效。
例:时钟边沿表示若有如下定义:
signal clk,in std_logic;
clk=?1‘ and clk‘event 和 clk‘event and clk=?1‘ 表示时钟的上升沿。即时钟变化了,且其值为 1,因此表示上升沿。
则:
clk=?0‘ and clk‘event 和 clk‘event and clk=?0‘ 表示时钟的下降沿。即时钟变化了,且其值为 1,因此表示下降沿。
此外,还可利用预定义好的两个函数来表示时钟的边沿。
rising_edge(clk) 表示时钟的上升沿
falling_edge(clk) 表示时钟的下降沿
● 范围类属性
‘range属性,其生成一个限制性数据对象的范围例如:
signal data_bus,std_logic_vector (15 downto 0);
data_bus ‘range =15 downto 0;
6.3.1.13 VHDL的模板下面以 VHDL的两个模板回顾一下 VHDL的结构,
一个是基本结构,一个是详细结构。
其中蓝色字为关键字,<>中内容为对用户不同设计所需填写的内容。
--VHDL Model Template (Overview)
library<library_name>;
use<library_name>,<package_name>.all;
entity<entity_name 实体名 > is
<port list for your design,列出设计的输入 /输出信号端口 >
end <entity_name> ;
architecture<architecture_name结构体名 > of
<entity_name> is
--结构体声明区域
--声明结构体所用的内部信号及数据类型
--如果使用元件例化,则在此声明所用的元件
begin --以下开始结构体,用于描述设计的功能
--concurrent signal assignments并行语句信号赋值
--processes进程(顺序语句描述设计)
--component instantiations元件例化
end<architecture_name>;
--VHDL Model Template (Detailed)
--列出用户定义的库及程序包
library<library_name>;
use<library_name>.<package_name>.all;
--实体描述了用户设计的接口
entity<entity_name>is
generic(<此处定义接口常数,如总线宽度、
预定计数器的计数模值等 >);
port(<列出端口信息 >);
end<entity_name>;
--结构体是描述 /实现的部分
architecture<architecture_name>of<entity_name>is
--结构体声明区域
--声明结构体所用的信号及数据类型,及子程序
--如果使用元件例化,则在此声明所用的元件
--元件声明如下:
component<元件实体名 >
port(<元件端口信息 >);
end component;
begin—结 构体开始,描述设计功能
--用并行语句描述设计的功能
--最常用的并行语句是并行信号赋值,进程,元件例化
--concurrent signal assignment (并行信号赋值的简单形式 ):
<result-signal_name 信号名 ><=<expression 表达式 >;
--process:进程模块
process <sensitivity list 敏感信号表 >
--此处声明局部变量,数据类型及其他局部声明
(用于进程中 )
begin --进程开始
--进程中为顺序语句,如:
--signal and variable assignments 信号与变量的赋值
--if and case statements --if-then-else 语句 case-when
语句
--while and for loops
--function and procedure calls 函数,过程调用
end process;
--元件例化,句法结构,
<例化名 >,<实体名,即元件名 >
generic map (<实际参数,如确定的总线宽度等 >)
port map (<端口列表 >);
end <architecture_name>;
6.3.1.14 常见错误
● 隐含触发器如以下代码:
library ieee;
use ieee.std_logic_1164.all;
entity and2 is port
(a,b,in std_logic;
c,out std_logic);
end and2;
architecture behave of and2 is
begin
process(a,b)
begin
if(a=?1‘ and b=?1‘) then
c<=?1‘;
end if;
end process;
end behave;
设计指原意是设计一个二输入与门,但因? IF‖语句中无? ELSE‖语句,在对此语句逻辑综合时认为
ELSE‖语句中为:? C<=C;‖,既保持不变。因此可能形成的电路如下,
a
b c
利用 MAX+PLUS II软件仿真时,除了? a=1‖及
b=1‖时? c=1‖外,其他时刻 c 的值都不确定。为改正此错误,仅需加上
else
c<=?0‘;
语句即可。
这类错误在利用? IF-THEN-ELSE‖语句设计组合电路时常犯的。
● 时钟处理如以下描述,是为了设计一个带计数使能的计数器,
但其将 falling_edge(clk)和 ci=?1‘放在一起,有些综合器可能会生成错误电路或不能综合。
IF (falling_edge(clk) and ci=?1‘) THEN
qcnt<=qcnt+1;
END IF;
最好如下:
IF falling_edge(clk) THEN
if (ci=?1‘) then
qcnt<=qcnt+1;
end if;
END IF;
此外,对于时钟电路,可省略? else‖语句,它隐含表示? qcnt<=qcnt;‖。可加上此句,但下面的描述则无法综合:
IF (falling_edge(clk)) THEN
qcnt<=qcnt+1;
else
qcnt<=datain;
END IF;
综合时会出现如下的错误信息:
―Else Clause following a Clock edge must hold the
state of signal‖
6.3.1.15 保留字
abs
access
after
alias
all
and
architecture
array
assert
attribute
begin
block
body
buffer
bus
case
component
configuration
constant
disconnect
downto
else
end
entity
exit
file
for
function
generate
generic
guarded
if
in
inout
is
label
library
linkage
loop
map
mod
nand
new
next
nor
null
of
on
open
or
others
process
range
record
register
rem
report
return
select
severity
signal
subtype
then
to
transport
type
units
until
use
variable
wait
when
while
with
xor