第6章VHDL程序设计

Download Report

Transcript 第6章VHDL程序设计

第6章VHDL程序设计
在硬件电子电路设计领域中,设计自动化工具已被
广大硬件电子工程师所接收,它必将取代人工设计方法,
成为主要设计手段。目前,作为硬件记述语言之一的
VHDL已经成为各家EDA工具和集成电路厂家所普遍认
同和共同推广的标准化硬件记述语言。掌握VHDL语言,
学会用VHDL语言设计硬件电子电路,是系统设计必须
掌握的一项技能。
本书在第5章重点介绍了CPLD器件结构原理,并介
绍了具体系列的CPLD系列芯片,如何基于CPLD器件做
应用设计,VHDL的掌握是设计关键。本章简要介绍
VHDL的基本语法,应用系统开发的手段及开发流程,
具体开发工具软件的使用方法等。
6.1 VHDL简介


目前最主要的硬件记述语言是VHDL和Verilog HDL。VHDL发展
的较早,语法严格,而Verilog HDL是在C语言的基础上发展起来的
一种硬件记述语言,语法较自由。 VHDL和Verilog HDL两者相比,
VHDL的书写规则比Verilog烦琐一些,但verilog自由的语法也容易
让少数初学者出错。国外电子专业很多会在本科阶段教授VHDL,在
研究生阶段教授verilog。从国内来看,VHDL的参考书很多,便于查
找资料,而Verilog HDL的参考书相对较少,这给学习Verilog HDL
带来一些困难。
VHDL的英文全名是VHSIC(Very High Speed Integrated
CircuitHardware Description Language),于1983年由美国国
防部(DOD)发起创建,由IEEE(The Institute of Electrical
and Electronics Engineers)进一步发展,并在1987年作为
“IEEE标准1076”发布。从此,VHDL成为硬件记述语言的业界标准
之一。此后VHDL在电子设计领域得到了广泛应用,并逐步取代了原
有的非标准硬件记述语言。



VHDL作为一个规范语言和建模语言,后期出现了一些支持该语言的行
为仿真器。由于创建VHDL的最初目标是用于标准文档的建立和电路功
能模拟,其目的是在高层次上记述系统和元件的行为。VHDL不仅可以
作为系统模拟的建模工具,而且可以作为电路系统的设计工具;可以利
用软件工具将VHDL源码自动地转化为文本方式表达的基本逻辑元件连
接图,即网表文件。这种方法显然对于电路设计是一个极大的推进。很
快,电子设计领域出现了第一个软件设计工具,即VHDL逻辑综合器,
它可以标准地将VHDL的部分语句记述转化为具体电路实现的网表文件。
VHDL语言具有很强的电路记述和建模能力,能从多个层次对数字系统
进行建模和记述,从而大大简化了硬件设计任务,提高了设计效率和可
靠性。VHDL具有与具体硬件电路无关和与设计平台无关的特性,并且
具有良好的电路行为记述和系统记述的能力,并在语言易读性和层次化
结构化设计方面,表现了强大的生命力和应用潜力。
在CPLD的开发应用中,硬件电路构成的数据必须写入CPLD芯片内部。
对硬件电路构成的设计就要使用相应的工具。VHDL就能很好的实现硬
件设计。本节将详细介绍VHDL的概念及使用。
应用VHDL进行工程设计的优点是多方面的。





1)与其他的硬件记述语言相比,VHDL具有更强的行为记述能力,从而
决定了他成为系统设计领域最佳的硬件记述语言。强大的行为记述能力
是避开具体的器件结构,从逻辑行为上记述和设计大规模电子系统的重
要保证。
2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能
查验设计系统的功能可行性,随时可对设计进行仿真模拟。
3)VHDL语句的行为记述能力和程序结构决定了他具有支持大规模设计
的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高
速的完成必须有多人甚至多个代发组共同并行工作才能实现。
4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综
合和优化,并自动的把VHDL记述设计转变成门级网表。
5)VHDL对设计的记述具有相对独立性,设计者可以不懂硬件的结构,
也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
6.2 VHDL设计基础


一般情况下,一个完整的VHDL语言程序通常被称作一个
设计实体,它是VHDL语言设计中的基本单元。在硬件电
路设计中,设计实体既可以记述像微处理器那样的复杂电
路,也可以记述像门电路那样简单的电路,从而体现了
VHDL语言记述的灵活性。
在一个设计实体中,它通常包括库(library),程序包
(pachage),实体说明(entity declaration),结构
体(architecture body)和配置(configuration)5个
部分,其中实体说明和结构体是设计实体所必需的,而库、
程序包和配置不是必需的,他们一般是根据设计需要来添
加的。这里只讲述实体和结构体。
6.2.1 RTL记述法


对即将开发的系统 (System) 来讲,VHDL能够对系统进行非常抽象的
记述(即描述),一般对实体的逻辑电路设计时通常采用寄存器传输记
述方法 (Register Transfer Level)。
在使用VHDL对实体记述时,设计电路由寄存器(Register)和逻辑
电路连接接续而成。简单用图表示如图6.1所示,图中所有寄存器由相
同时钟驱动动作称为同步电路。
图6.1 RTL记述法顺序框图
6.2.2 VHDL记述的基本构成


由上述RTL记述法,使用VHDL可决定书写的构成、结构。基本构成有
两大部分即实体(entity)和结构体(architecture)。如再加入一些
相应的各种定义,宣言部分即可构成完整的全体构造图,如图6.2所示。
以下对各部分进行详细说明。
实体部是定义设计电路的输入输出条件 (Port定义),位的长短等参数。
结构体部是设计电路的逻辑中心。二者关系及实例如图6.3所示。
1.宣言,定义

什么叫程序包(Pakage)?程序包就是运算符,标准函数的集合定义,
符合IEEE的标准。VHDL语言的程序包括两个部分:程序包说明部分和
程序包包体部分。其中程序包说明主要是对数据类型、子程序、常量、
元件、属性和属性指定进行说明,也就是这里所讲的宣言及定义,主要
实现程序包的指定。程序包包体部分由程序包说明指定的过程和函数的
程序体组成,即用来规定程序包的实际功能。宣言及定义是记述时必须
使用的。另外还有别的算术运算符指定。
全体构成图
图6.3 实体和结构体
一般经常使用的标准格式如下所示
必须的Library
library IEEE ;
use IEEE.std_logic_1164.all ; -- 基本函数
算术运算需要的Library
use IEEE.std_logic_unsigned.all ; -- 无符号运算函数
use IEEE.std_logic_arith.all ;
-- 算术运算函数
在以上标准格式中,.all 表示该Library内部所有函数使用可能。
2.实体说明
实体即为该CPLD与外部的输入输出端口的定义,也即为CPLD的端口引脚的信号的
定义。实体说明主要记述的是一个设计的外貌。定义CPLD与外部的端口通常定
义为Port,其标准格式如下所示。在最后行不需 ; ,且最后由 ) ; 结束。
entity < entity 名 > is
port (
<信号名> { ,<信号名> } : <方向> <型> ;
<信号名> { ,<信号名> } : <方向> <型> ;
―――――――
<信号名> { ,<信号名> } : <方向> <型>
);
end < entity 名 > ;
在VHDL的实体书写中,型的指定非常重要。在运算中如果型指定不一致会
出现错误。在VHDL中,虽然型的指定类型非常多,但经常使用的有两
种如下:
std_logic
: 标准逻辑
std_logic_vector (n downto 0) : n+1位宽
另外信号的输入输出方向有以下三种选择
in
: 输入
out
: 输出
inout : 双向
例1:
port (
a,b,c : in std_logic ; a,b 和c为标准逻辑输入口
y : out std_logic );
y为标准逻辑输出口
例2: 配列
port (
a,b : in std_logic_vector (2 downto 0) ;
y : out std_logic_vector (2 downto 0)) ;
另外在实体中还有属性定义 (attribute),以下详细介绍。在Xilinx
Project Navigator中能使用的属性有很多种,如下
attribute PIN_ASSIGN of object : object_type is pin_name ;
attribute LOC of object_list : object_type is
function_block_name ;
attribute KEEP of object_list : object_type is TRUE ;
attribute DONT_OPTIMIZE of object_list : object_type is TRUE ;
attribute FAST/SLOW of object_list : object_type is TRUE ;
attribute BUFG of object_list : object_type is CLK / OE / SR ;
attribute INIT of object_list : object_type is S / R ;
attribute PWR_MODE of object_list : object_type is LOW / STD ;
attribute REG of object_list : object_type is CE / TFF ;
attribute TNM of object_list : object_type is string ;
在属性定义前还必须定义
attribute attribute_name : string ;
关于对Pin端口的配置和其属性定义,可由下例详细说明。
例3: A,B,Y 端口分配至 1,2,3 Pin端口
library ieee ;
use ieee。std_logic_1164.all ;
entity Ex1 is
port (A : in std_logic ;
B : in std_logic ;
Y : out std_logic) ;
attribute pin_assign : string ;
attribute pin_assign of A : signal is "1" ;
attribute pin_assign of B : signal is "2" ;
attribute pin_assign of Y : signal is "3" ;
end
architecture SAMPLE of Ex1 is
begin
Y <= A nand B ;
end SAMPLE ;
T T T
T T T V T
I I I
I I I C I
EE E y b a E E E C E
-------------------------------/6 5 4 3 2 1 44 43 42 41 40 \
TIE | 7
39 | TIE
TIE | 8
38 |
TIE | 9
37 |
GND | 10
36 |
TIE | 11
XC9536-5-PC44
35 |
TIE | 12
34 |
TIE | 13
33 | TIE
TIE | 14
32 | VCC
TDI | 15
31 | GND
TMS | 16
30 | TDO
TCK | 17
29 | TIE
\ 18 19 20 21 22 23 24 25 26 27 28 /
-------------------------------T T T V T G T T T T T
I I I C I N I I I I I
E E E C E D E E E E E
TIE
TIE
TIE
TIE
TIE
结构体
设计实体中的结构体主要用来记述设计的行为和结构,即用来记述设计实体的具体
功能。结构体(Architecture)是CPLD设计的中心工作,它是CPLD内部逻
辑实际动作的设计。一般来说,结构体记述了实体硬件的结构、硬件的类型
和功能、元件的互连关系、信号的传输和变幻以及动态行为等方面。在
architecture内有很多种记述,也有很多规定。其基本的格式如下:
architecture <architecture名> of <entity名> is
<定义文>
begin
<VHDL程序>
end <architecture名> ;
其中定义文对信号signal名、常数、函数component等进行定义。例4说明它的信
号signal定义文。
例4:
library ieee
use ieee.std_logic_1164.all ;
entity Ex2 is
port (A : in std_logic ;
B : in std_logic ;
C : in std_logic ;
D : in std_logic ;
Y : out std_logic) ;
end ;
architecture SAMPLE of Ex2 is
signal S0,S1 : std_logic ;
begin
S0 <= A nand B ;
S1 <= S0 nand C ;
Y <= S1 and D ;
end SAMPLE
在例4中,S0和S1仅为CPLD内部使用的信号,另外可看到信号的定义与
Port的定义一样需设置类型。
6.2.3 VHDL程序的记述方法
VHDL程序的记述方法有两种,即同时处理 (并列处理) 集合和顺
序处理(过程处理) 集合。根据一般开发经验,同时处理文比较适合于简
单的组合逻辑电路的设计,而顺序处理文适合于复杂的组合逻辑电路设
计。以下小节将分别介绍这两者的特点和使用。同时处理 (并列处理)文
的处理与时间无关同时处理。顺序处理则根据程序的次顺进行处理。无
论是书写同时处理还是顺序处理都必须付合书写文法规定。下面先介绍
这些规定。
1. 说明性文字
在定义文中如需书写说明文字时,如下列所示书写2个以上–记号即可
在记号后至行尾书写说明文。用此方法,可从行开头,行中间任何地方
自由地加入说明文。
–– < 英文 说明性文字 >
例 ––Select Clock
––Decimal Counter Block 等
2. 标识名
在书写VHDL程序时,均能对信号等定义名称。标识及定义名称的限制
如下
(1)大小写无区别
(2)最初文字必为英文字
(3)能使用的文字限英文字母,数字等
(4)VHDL专用语使用禁止
3.信号的类型和文字常数的用法
在VHDL中使用的信号种类除1、0外还有不定(X)、高阻(Z)等近10
种类型。在本书中仅使用了1、0、不定(X)和高阻(Z) 等4种。在用文
字列来表示信号的种类时,请参照以下说明。
在采用 X 表示信号不定时,文字常数就有大小写区别。在表示不定信号时请一定使
用大写文字 X。同样,Z也是使用大写文字。如下所示
例
1位信号
′0′ ′1′ ′X′ ′Z′
多位信号
′0000101′ ′XXXXXXXX′′ZZZZ′
6.2.4 信号代入和运算符
VHDL文中进行信号代入时使用 <= 记号。如下例所示信号的代入和代入运算结
果的处理文。
例
clkout <= inclk ;
A <= B + C ;
在实体中定义的输出(out)端口(port)输出信号时,该信号在过程中并非直接输
出,而是使用内部定义的信号进行输出。如下例所示,这样做使得的开发软件工
具能自动在外部信号端口附加缓冲器(Buffer),目的是可获的稳定的输出信号。
Port 名 <= signal名 ;
例 signal_out <= int_sig ;
设计书写VHDL文可使用的运算符有如表6.1所示4种,即逻辑运算符、关系运算
符、算术运算符和连接子。请注意它们的使用特点和限制。
表6.1VHDL运算符集合
分
类
逻辑运算符
关系运算符
算术运算符
连 接 子
记 号
运算内容
not
否定
and
逻辑积
or
逻积和
nand
逻辑积的否定
nor
逻辑和的否定
xor
排它逻辑和
=
等于
/=
不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
+
加
-
减
*
乘
&
连接
备
注
std_logic_vector型时
每位单独运算
std_logic_vector型时
位列进行比较
不使用 /,mod (剩余)
注意乘算术运算
std_logic_vector型时使用
1.算术运算符
在std_logic和std_logic_vector使用时由于没有定义标准,所以算术运算符不能
使用。在此种类型下如要使用算术运算符,需要追加软件运算库如下
use IEEE.std_logic_unsigned.all ;
在追加了以上库(Library)后,矢量(Vector)变量和Scalar (通常的数值)都能
进行各种运算。
2.乘、除运算
实际设计中由于均为逻辑电路,在用除和Mod (剩余) 算术运算时分母均是2幂,所
以除实际上是位移(Bit Shift)动作。于是通常不使用除算术运算符。还有
请注意在使用 * (乘运算),在位较长时单纯的计算会产生很长的逻辑,这在
实际实装时会出现困难,所以在特殊情况外也不使用。
6.2.5 矢量型(Vector)
在使用std_logic_vector Library时,由于是多位幅被称为矢量型。在下例中通
过 (n downto m) 来指定位幅。
例
A,B : in std_logic_vector (7 downto 0) ;
( 定义8位幅外部数据总线 A和B )
signal DA,DB : std_logic_vector (15 downto 0) ;
( 定义 16位幅的内部数据 DA和DB )
在实际运算中由于会对每位进行运算,所以在对不同位幅的数据运算实行时会产
生错误(Error)。但是可以有以下指定位幅运算。例如上例中进行加法运算
时只使用长位幅数据的一部分与短数据匹配也可进行运算。如下例所示:
B <= DB ( 7 downto 0 ) + A
另外也可使用连接算符增加位符使短位符数据匹配长位幅数据,这样处
理后也可进行运算。例上例中A和DB的加算中,由于A的位幅不足,可用
定数的8位幅与A相连接。如下示:
例
DA <= DB + ( "00000000" & A )
也可从数据中取出特定的位进行处理。比如从DB数据中取之最上位,把
该位信号作为外部信号FULL取出。命令如下:
例
FULL <= DA (15)
例
6.2.6进程(Process)
在VHDL语言的基本描述语句中,进程语句是设计人员使用最为频
繁的语句之一。进程的内部语句是顺序描述语句,而进程语句本身是一
种并行描述语句,在VHDL程序描述中如前所述有同时处理和顺序处理。
经常在设计复杂逻辑电路时会使用顺序处理。把顺序处理的处理结果作
为同时处理时经常会使用进程(Process)。进程就作为一个集合体被
看作同时处理式。
CASE
除上所述IF条件分支文以外还有另一种CASE条件分支文。使用 CASE条件
分支文可实现多方向的条件分岐。
其基本记述格式如下所示
CASE记述
case <式> is
when 值 => 顺序处理文 ;
when 值 : 值 : 值 => 顺序处理文 ;
when 值 to 值 => 顺序处理文 ;
―――――――――――
when others => 式 ;
end case ;
如上case所示,虽然全部条件式被同时执行,但同一个值不能多处使用。
下面介绍具体IF和CASE的使用例如下。
例5: 3/8 输出解码器(Demultiplexer如74LS138等)
T T T
T T T V T
I I I
I I I C I
EE E y b a E E E C E
-------------------------------/6 5 4 3 2 1 44 43 42 41 40 \
TIE | 7
39 | TIE
TIE | 8
38 | TIE
TIE | 9
37 | TIE
GND | 10
36 | TIE
TIE | 11
XC9536-5-PC44
35 | TIE
TIE | 12
34 | TIE
TIE | 13
33 | TIE
TIE | 14
32 | VCC
TDI | 15
31 | GND
TMS | 16
30 | TDO
TCK | 17
29 | TIE
\ 18 19 20 21 22 23 24 25 26 27 28 /
-------------------------------T T T V T G T T T T T
I I I C I N I I I I I
E E E C E D E E E E E
图6.4 XC9536 引脚配置
图6.5 内部逻辑图
020
021
022
023
024
025
026
027
028
029
030
031
032
begin
IN_DATA <= C & B & A;
--Binding vector
process( IN_DATA,G1,G2A,G2B ) begin
if( G1='1' and G2A='0' and G2B='0' ) then -- Judgement of gate condition
case IN_DATA is
-- Judgement of input data
when "000" => Y <= "11111110";
when "001" => Y <= "11111101";
when "010" => Y <= "11111011";
when "011" => Y <= "11110111";
when "100" => Y <= "11101111";
when "101" => Y <= "11011111";
when "110" => Y <= "10111111";
when "111" => Y <= "01111111";
033
034
035
when others => Y <= "XXXXXXXX";
end case;
else
036
037
038
039
Y <= "11111111";
end if;
end process;
end SAMPLE;
-- Illegal condition
-- Gate OFF condition

例5完成了3位二进制位输入到8输出的解码器设计,其功能如74LS138的集成
芯片。上例仅是一个简单练习,实际使用时 74LS138的使用较经济。图6.4为
引脚配置图,图6.5为内部逻辑图,下面对上述VHDL程序作些具体说明如下。
行
内容
006
输出使用标准逻辑8配置矢量形式(vector)。
本设计使用下降(Downto)顺序排列(7->6->5->4->3->2->1->0)。
也可使用上升顺序(0->1->2->3->4->5->6->7), 即能使用to 形式。
定义使用那种顺序后,在整个设计中,需要时刻意识到这一点不要出错。
015
把输出Y配置给不同的芯片引脚Pin。
019
为进行内部逻辑判定而定义的内部信号。
使用矢量Downto配置定义法。
021
内部定义的信号与输入接续。因输入为1Bit,使用 & 来把C,B和A它们结合起来。
022
Process文中的输入信号指定, IN_DATA数据3 Bits 和 GATE输入(G1,G2A,G2B)。
023
如果GATE条件全 1时, 进入023行命令以下的逻辑处理。
024
-034
根据IN_DATA的条件形成输出(Y)状态逻辑。
035
如GATE有一个为0时的处理。
036
输出(Y)全设置为1的逻辑
6.2.7 同步电路设计
在实际CPLD使用中,基本上采用同步逻辑电路设计。为避免逻辑电路动作的不协
调,同步电路即是与时钟(Clock)同步动作以形成稳定的逻辑电路。根据此点,
在使用VHDL记述时比须要有意识地注意进行同步电路设计。具体在设计中首先
在过程记述内需记述时钟上升沿或下降沿动作记述。它的记述格式如下。
同步电路设计
-- Sycronous Circuit
process ( clk ) begin
if ( clk ′event and clk =′1′ ) then
--- 顺序处理文的记述
-end if ;
end process ;
用例6来具体说明同步电路的设计。例6是4位二进制计数器的VHDL设计记
述,它采用CLK时钟上升沿触发同步动作。此中复位(RESET)信号为非同步
强制复位信号,使输出为全0000。这样做虽能使RESET信号也与CLK时钟同步,
但在无CLK时钟信号时需要用RESET信号复位时采用非同步方式更好。在对计
数器记述时需使用算术运算符所以在最初追加有运算Library。由于计数器的输
出需要通过CPLD 端口输出,在最后有内部输出COUNT_IN记述由
COUNT<=COUNT_IN来输出。另外在外部输出端口还插入有缓冲器电路。
例6:4位二进制计数器
library ieee
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
entity counter is
port ( CLK,RESET : in std_logic ;
COUNT : out std_logic_vector ( 3 downto 0 )
);
end entity ;
architecture RTL of counter is
signal COUNT_IN : std_logic_vector ( 3 downto 0 ) ;
begin
process ( CLK,RESET ) begin
if ( RESET = ′1′) then
COUNT_IN <= "0000" ;
elsif ( CLK′event and CLK =′1′ ) then
COUNT_IN <= COUNT_IN + ′1′ ;
end if
end process
COUNT <= COUNT_IN ;
end RTL ;
例7是移位寄存器的设计,它的设计方法请见如下VHDL记述,该设计为16位的内部移位寄存
器,对外不输出任何信号。
移位寄存器的VHDL记述中,Clock时钟sclk的上升沿时16位寄存器的低15位均前移一位。最
低位是0或1由外部输入数据决定。为完成移位寄存器的设计,VHDL记述中采用了矢量
Slice记述和位的连接子记述。另外,复位信号为1时对移位寄存器的全16位清0。
例7:16位内部移位寄存器VHDL记述例
entity shftreg is
port ( sdata : in std_logic ;
sclk : in std_logic ;
reset : in std_logic ) ;
end entity ;
architecture RTL of shftreg is
signal sn : std_logic_vector ( 15 downto 0 )
begin
-- shift register
process ( sclk,reset ) begin
if ( reset = ′1′ ) then
sn <= "0000000000000000" ;
elsif ( sclk′event and sclk = ′1′) then
sn <= sn(14 downto 0) & sdata ;
end if ;
end process ;
end RTL ;
6.2.8 Component记述
如经常使用的C++,Fortran等程序设计时常用子程序来设计多处
需要完成的相同的功能。在VHDL记述中同样可使用如子程序的部分,
对此可独立设计记述。与很多设计语言一样,这样设计同样可以节省设
计时间,阅读容易,且可靠性好。
在结构体的层次化设计中,采用结构记述方式就是通过条用库中的
元件或者已设计好的模块来完成设计实体功能的记述。在机构体中,功
能记述像网表一样来标识元件(或者模块)和元件(或者模块)之间的
互连。当设计人员引用库中不存在的元件时,必须首先进行元件的创建,
其次将其放在工作库中,接下来便可以通过条用工作库来引用元件。
在VHDL语言中,引用元件或者模块的说明采用Component语句,
它的作用就是在结构体的说明部分说明引用的元件或者模块。
Component记述接构也称构造化记述,下面介绍其定义和记述规定等。
这里需要注意的是,如果所调用的模块在元件库中不存在,设计人
员必须首先进行元件的创建,然后将其放入工作库中,最后通过工作库
来引进该元件。
1.Component定义
为使用Component记述,首先需要对定义Component。在前介绍
architecture定义时,虽说明了需仅定义信号名,在需使用
Component时还需追加定义Component。Component的构造如实
体的构造相同如下。
Component记述构造
component < component名 >
port (
< 信号名 > { ,< 信号名 > } : < 方向 > < 型 > ;
< 信号名 > { ,< 信号名 > } : < 方向 > < 型 > ;
――――――――――――――
< 信号名 > { ,< 信号名 > } : < 方向 > < 型 >
);
end component ;
在此如做以上追加定义后,在后续的VHDL程序记述中中即可用如
Conponent Instance的形式使用。
Component Instance记述
实际使用时用以下的记述文
Label名 : Component名 port map ( 信号名,… ) ;
在此Label名是使用Component时附加名,在结构体定义中必须唯一。在port
map中定义的信号名及顺序均应与Component记述中定义的信号和顺序要
相对应。也就是在相同的Component中可输入完全不同的输入输出信号就会
产生完全不同的设计,其电路结构都可不一样。对Component的使用法如下
例所示。在下例中,half_adder为定义的Component名,使用该
Component设计生成full_adder电路。记述中,U0和U1为两处使用该
Component的Label名。half_adder的处理文由别的VHDL记述文件构成。
Component例
library IEEE
use IEEE.STD_LOGIC_1164.ALL ;
entity fulladder is
port ( A : in std_logic ;
B : in std_logic ;
CRY : in std_logic ;
S : out std_logic ;
CO : out std_logic ;
end fulladder ;
architecture RTL of fulladder is
component half_adder
port ( A,B : in std_logic ;
S,CO : out std_logic
);
end component ;
signal CO0,S0,CO1 : in std_logic ;
begin
U0 : half_adder port map (A,B,S0,CO0) ;
U1 : half_adder port map (S0,CRY,S,CO1) ;
CO <= CO0 or CO1 ;
end RTL
6.2.9 数据的类型及类型变换
1.数据的种类
在VHDL记述中,信号定义 (signal)、变量定义 (variable)、常数
定义 (constance)时均需要指定数据类型。在使用时如采用不同的数据
类型代入时会产生Errors。VHDL使用中有固定的标准数据类型,也有
可以由设计者自己定义制作的数据类型。为使用方便,VHDL也提供数
据类型变换用的函数。
2.VHDL标准数据类型
在表6.2中列有VHDL可使用的标准数据类型。
表6.2 标准数据类型表
数据类型
具体内容说明
Integer
整数32位长,可表示范围 -2147483647~2147483646
Real
浮动小数点
Bit
逻辑数字 0 和 1
Bit_Vector
Bit矢量
Boolean
逻辑 真True 和 假False
Character
ASCII码
Time
时间等物理量类型 fs、ps、ns、us、ms、sec、min、hr
Severity level
文字Message类型 NOTE、WARNING、ERROR、FAILURE
Natural、Positive
Integer的子类型 0=< NATURAL、0<POSITIVE
String
文字列
"010010" "01011010"
3.设计者自定义数据类型
VHDL允许设计者自定义需要使用的数据类型。使用时通常需用type,
subtype等定义。下面逐一介绍它们的使用。
1)型定义 type使用type文来完成新的型定义。它的记述有以下几种。
<列举type>
type 数据型名 is ( 要素,要素,… )
例 一星期为单位的型定义 WEEK
type WEEK is ( SUN,MON,TUE,WED,THU,FRI,SAT )
例 std_logic的定义
该std_logic的定义是最常用的型。关于它的IEEE 的Package中就有如
下型的定义
type std_logic is ( ′U′,′X′,′0′,′1′,′Z′,′W′,′L′,′H′,′-′) ;
<Integer类型时>
用Integer类型range对值的范围进行指定。如不指定,就自动使用32位长,
使的作成的逻辑电路规模庞大。
type 数据型名 is integer range i to j ;
例 BCD型 digit 定义
type digit is integer range 0 to 9 ;
3)配列型
配列是新的型定义的一种。它可把同样型的数据归纳在一起定义作为一种
新的型。它的记述格式如下:
type 数据型名 is array 范围 of 原型名 ;
在上记述格式中,范围指定项有多种型可使用。如不指定型就自动作为
integer指定。
例 type WORD is array (1 to 8) of std_logic ;
type WORD2 is array (integer 1 to 8) of std_logic ;
例 std_logic_vector的型定义。该定义在IEEE的std_logic_1164
中有以下记述定义
type std_logic_vector is array (Natural range <>) of
std_logic ;
<多次元配列> ―― 对多个范围进行组合来指定,它就变成了多次元配
列。
例 2次元配列例
type memarray is array (0 to 5,7 downto 0) of
std_logic ;
例 使用上记所用型的ROM作成
constant ROMDATA : memarray :
= ((′0′,′0′,′0′,′0′,′0′,′0′,′0′,′0′),(′0′,′1′,′1′,′1′,′0′,′0′,′0′,′1′),
(′0′,′0′,′0′,′0′,′0′,′1′,′0′,′1′),(′1′,′1′,′0′,′0′,′0′,′1′,′1′,′0′),
(′1′,′1′,′1′,′1′,′1′,′1′,′1′,′1′),
<配列的多重定义>
在型定义时,由于原型的配列就形成新的配列。此新的配列就称为
配列的多重定义。如下例所示,在std_logic_vector的型中对WAVE型
进行了定义。对WAVE的元型又定义了新的配列ROM。例中采用了该新
ROM型来定义了定数Sine,然后它的初值用 := 以后定义。形成了6 位
长,64个并列的配列。该配列6位的分解能力指定了正弦的1周期的数据
量。
例 多重定义例 Sin正弦
4.型变换
严格来讲,VHDL记述要求使用的型一致。不同型的变量运算,代入均被
视为非法。所以在代入、运算时对不同的型变量需采用型变换。在VHDL中规范
了型的变换文法及型变换函数供设计人员使用。具体使用的型变换函数如表6.3
所示。

表6.3 型变换函数
6.3 设计开发手段和开发流程
基于VHDL的CPLD应用开发是目前广泛采用的硬件开发手段,它采
用软件的方法来记述电子系统的逻辑功能、电路结构和连接关系。
VHDL作为电子设计主流硬件的记述语言,具有很强的电路记述能力,
能从多个层次对数字系统进行建模和记述,从而大大简化了硬件设计任
务,提高了设计效率和可靠性。VHDL支持各种模式的设计方法,这样
设计者可以专心致志于其功能的实现,而不需要对不影响功能的与工艺
有关的因素花费过多的时间和精力。
传统的电子设计技术通常是自下而上的设计方法,即首先确定系统
的最底层的电路模块或元件的结构和功能,然后根据主系统的功能要求,
将其组合成更大的功能模块,使它们的结构和功能满足高层次系统的要
求。依此流程,逐步向上递推,直到完成整个目标系统的设计。由于设
计只能采用系统仿真仪、逻辑分析仪和示波仪进行仿真和调试。因此,
只有在系统设计完成以后才能进行仿真和调试。系统存在的问题只有在
设计后期才能发现。一旦考虑不周,往往需要全部重新设计,使设计周
期大大增加。
对于专用电路的设计,则是根据系统的功能要求,首先从绘制硅片版图开始,
逐级向上完成版图级、门级、RTL级、行为级、功能级,直至系统级的设计。在
这个过程中,任何一级发生问题,通常都不得不返工重来。
在硬件电路设计应用中,自顶向下的设计方法就是在整个设计流程中各设计
环节逐步求精的过程。一个项目的设计过程包括从自然语言说明到VHDL的系统
行为记述、系统的分解、RTL模型的建立、门级模型产生,到最终的可以物理布
线实现的底层电路,就是从高抽象级别到低抽象级别的整个设计周期。后端设计
还必须包括涉及硬件的物理结构实现方法和测试(仍然利用计算机完成)。
应用VHDL进行自顶向下的设计,就是使用VHDL模型在所有综合级别上对
硬件设计进行说明、建模和仿真测试。主系统及子系统最初的功能要求在VHDL
里体现为可以被VHDL仿真程序验证的可执行程序。由于综合工具可以将高级别
的模型转化为门级模型,所以整个设计过程基本是由计算机自动完成的。人为介
入的方式主要是根据仿真的结果和优化的指标来控制逻辑综合的方式和指向。因
此,在设计周期中,要根据仿真的结果进行优化和升级,以及对模型及时的修改,
以改进系统或子系统的功能,更正设计错误,提高目标系统的工作速度,减小面
积耗用,降低功耗和成本等。或者启用新技术器件或新的IP核。在这些过程中,
由于设计的下一步是基于当前的设计,即使发现问题或作新的修改而需从头开始
设计,也不妨碍整体的设计效率。
在CPLD设计应用中,采用自上而下的设计方法,即从系统总体出发,自上
而下地逐步将设计内容细化,最后完成系统设计。
根据系统对硬件的要求,详细编制技术规格书,并根据技术规格书,对系统
的功能进行细化,合理地划分功能模块,并画出系统的功能框图。它包括如下设
计阶段。
1.提出设计说明书,即用自然语言表达系统项目的功能特点和技术参数等。
2.建立VHDL行为模型,这一步是将设计说明书转化为VHDL行为模型。在这一
项目的表达中,可以使用满足IEEE标准的VHDL的所有语句而不必考虑可综合
性。这一建模行为的目标是通过VHDL仿真器对整个系统进行系统行为仿真和性
能评估。
3.VHDL行为仿真。这一阶段可以利用VHDL仿真器(如ModelSim)对顶层系
统的行为模型进行仿真测试,检查模拟结果,继而进行修改和完善。这一过程与
最终实现的硬件没有任何关系,也不考虑硬件实现中的技术细节,测试结果主要
是对系统纯功能行为的考察,其中许多VHDL的语句表达主要为了方便了解系统
在各种条件下的功能特性,而不可能用真实的硬件来实现。
4.VHDL-RTL级建模。如上所述,VHDL只有部分语句集合可用于硬件功能行为
的建模,因此在这一阶段,必须将VHDL的行为模型表达为VHDL行为代码(或
称VHDL-RTL级模型)。
5.前端功能仿真。在这一阶段对VHDL-RTL级模型进行仿真,称为功能仿真。尽
管VHDL-RTL级模型是可综合的,但对它的功能仿真仍然与硬件无关,仿真结果
表达的是可综合模型的逻辑功能。
6.逻辑综合。使用逻辑综合工具将VHDL行为级记述转化为结构化的门级电路。
在ASIC设计中,门级电路可以由ASIC库中的基本单元组成。
7.测试向量生成。这一阶段主要是针对ASIC设计的。FPGA设计的时序
测试文件主要产生于适配器。对ASIC的测试向量文件是综合器结合含有
版图硬件特性的工艺库后产生的,用于对ASIC的功能测试。
8.功能仿真。利用获得的测试向量对ASIC的设计系统和子系统的功能
进行仿真。
9.结构综合。主要将综合产生的表达逻辑连接关系的网表文件,结合具
体的目标硬件环境进行标准单元调用、布局、布线和满足约束条件的结
构优化配置,即结构综合。
10.门级时序仿真。在这一级中将使用门级仿真器或仍然使用VHDL仿真
器(因为结构综合后能同步生成VHDL格式的时序仿真文件)进行门级
时序仿真,在计算机上了解更接近硬件目标器件工作的功能时序。对于
ASIC设计,被称为布局后仿真。在这一步,将带有从布局布线得到的精
确时序信息映射到门级电路重新进行仿真,以检查电路时序,并对电路
功能进行最后检查。这些仿真的成功完成称为ASIC sign off。接下去的
工作就可以将设计提供给硅铸造生产工序了。
11.硬件测试。这是对最后完成的硬件系统(如ASIC或FPGA)进行检
查和测试。
与其他的硬件记述语言相比,VHDL具有较强的行为仿真级与综合
级的建模功能,VHDL能远离具体硬件,基于行为记述方式的硬件记述
语言恰好满足典型的自顶向下设计方法,解决现代电子设计应用中出现
的各类问题。
作为一个基于PIC的应用系统,外围电路采用CPLD实现,就必然涉及对
CPLD的设计方法、CPLD内部存储器的编程问题及CPLD的开发工具等。这其中
一个合理的CPLD的开发顺序犹为重要。由于从最初的系统PIC,CPLD的功能分
担考虑到最终对CPLD编程写入均可在CPLD的综合开发软件环境中实现,这个
CPLD 综合开发环境,(有MAXPlusII、WebPACK 3.1WP1.X版)。根据软
件环境,对于CPLD的开发,总结了以下如图6.6所示开发顺序,这里以供参考。
图6.6 CPLD开发顺序流图
6.4 开发工具(WebPack)的使用法
本节中从简单的模块实例出发介绍Xilinx公司的CPLD开发环境
(Xilinx Project Navigator)的使用。其开发环境功能很多,且新版本
的开发软件也在不断出现,但基本使用是相同的。在此仅介绍它的最基
本的功能使用。
使用开发环境软件
Projector Navigator : Release Version : WebPACK 3.1 WP1.X
Application Version : build + D–20+0
JTAG Programmer : Release Version : WebPACK 3.1 WP1.X
Application Version : D.20
6.4.1 Xilinx Project Navigate启动
首先使用启动开发Software Xilinx Project Navigate,后进入以下
Windows窗口,如图6.7所示。在该窗口中有多个小窗口,如Sourses
in Project (表示 Device芯片名,Sourse模式名等),Processes for
Current Sourse (各种功能选择窗口),右侧的HDL Editor
workspace window (表示Sourse码窗口)及最下面的Transcript
window (处理过程Log窗口)。
这里以10输入与逻辑电路设计为例讲解软件工具的使用。其设计的
逻辑电路外部图如图6.7所示。
图6.7 10输入与逻辑电路
图6.8 Xilinx Project Navigate启动界面
5.6.2 目标项目(Projector)的生成
如开发综合环境MPLAB IDE一样,设计开发项目由Projector来综合管理各
种设计作业。在此基础上即可在设计CPLD的设计开发的各环节。
1.项目子目录生成
在进行设计开发前事先生成存放文件的子目录。这样以后使用会更加方便。
子目录名生成如 C:/MP_XLINX/Project/Test/test/,在其中存放相关文件,
具体如图6.9所示。
图6.9 Project子目录生成
1.项目生成方法
可使用下方法生成新的Project。首先打开File后选New Project后,会弹
出Project 文件File生成窗口6.10如下。在此窗口中,有Project name和
Project存放子目录场所选择,使用Device芯片及使用语言选项等设置。在完
成相应设置后,在Project Navigator主菜单窗口中的Sourse in Project小
窗口中表示如下。
图6.10 项目生成
2.项目标题的登录
在主菜单窗口如图6.11中选择Sourse到Properties或在上窗口的
Untitled处用鼠标双激后弹出以下登录窗口。在上登录窗口中设定title为test
后,在主菜单窗口中的Sourse Project小窗口中Untitled变为test。窗口显
示如下图6.12。
图6.11 项目标题的登录
图6.12 Project Title设置完成后的窗口
6.4.3 源文件的生成
在主菜单中选Sourse到New选择或菜单中第二行第5个Mark用鼠标双激后
弹出Sourse类型设置窗口如图6.13所示。在此表示的窗口中请选择 VHDL
Module。如使用其它种开发语言时请选择相应语言。在输入完File Name文件
名后,确认存储Location后请选 Next选项。
图6.13
源文件生成界面
在上设置窗口中完成选Next选项后,弹出以下Define VHDL Sourse设置
窗口如图6.14所示。
图6.14 VHDL源程序定义窗口
在以上设置窗口中的Entity Name和Architecture Name 中输入相应名。
此时就能指定各Port端口。在的例中将在VHDL记述文中指定Port端口。所以在
此设置窗口中不设定后选Next选项。选后弹出以下窗口,在此窗口中显有的各
种设置。请确认好自己的设置无误后请选择Finish后退出。此时在Project
Navigator的主菜单窗口中的右小窗口HDL Editor workspace window中出现
可书写的Sourse码输入窗口。
另外可在主菜单中View菜单中设置对各小窗口的显示状态进行表示或非表
示控制。
图6.15 源文件信息窗口
图6.16 主菜单窗口

在以上主菜单窗口图6.16中的各项目小窗口大小均可按需要设置。如果需要扩
大Sourse code窗口可选择View项的Project Workspace点激后扩大。也可点
激主菜单窗口的第二行第12个标志(mark)来实现。如想把Sourse Code窗
口扩大到占满全屏时可点激该小窗口的右上角的最大最小设置Mark来实现。在
想恢复元窗口格式时可使用主菜单中Window选项菜单。Casecade选项可使各
小窗口重叠表示。
图6.17 程序工作窗口
Tile Horizontally选项可示各小功能窗口上下并列表示。Tile Vertically选
项可使各功能小窗左右并列表示。图6.17为设置完成后的程序工作窗口。关于
以上源代码(Sourse code)窗口中的VHDL记述内容的具体说明如下:
因为本示例是要设计10 输入的AND逻辑电路。作为设计VHDL记述实体和结构
体的记述请见下VHDL记述中深色记述部分。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_STD_LOGIC_UNSIGNED.ALL;
entity test is
port (
a,b,c,d,e,f,g,h,i,j : in std_logic;
y
: out std_logic);
end test;
architecture behavioral of test is
begin
y <= a and b and c and d and e and f and g and h and i and j;
end behavioral;
6.4.4程序记述的检查
在开发软件中还有对源代码(Sourse Code)中VHDL记述检查功能。它能
自动完成对书写的VHDL文的文法错误等进行检查。在需要开启该功能时,在
Process for Current Sourse窗口中请选择Synthesize下的Check Syntax选
项用鼠标双激后即开始对书式进行检查。如检查无误,在Check Syntax处出现
绿色的Check标志。同时在下部状态表示窗口中表示有Done: completed
successfully。详细如图6.18所示。
图6.18 记述的检查界面
在未保存文件时如实施书式检查也会弹出文件保存设置窗口如图6.19。在点
激Ok后即可保存源代码窗口中设计的VHDL程序记述。
如在以上书式Check中发现书式错误,在Process for Current Sourse窗口,
如图6.20所示中的Check Syntax有红色X标志。同时在下部的状态窗口中最下
部有Done: failed with exit code : 0001表示。错误例如下:
图6.19 程序记述的界面保存窗口
图6.20 检查出错信息窗口
具体记述中那里出现错误在状态窗口中也有明确的表示。如下所示
ERROR : (VHP__0162)。C:\MP_xilinx\Project\Test\test\test。vhd
Line 10。
Read symbol END,expecting ';'。
表示在第10行出现书式错误。如果用鼠标双激
会在源代码(Sourse Code)窗口的左侧表示错误标志如下。在对VHDL记述
修正后该错误标志也不会消失。只有在关该文件后重开该文件后才会消失,这点
请注意。
图6.21 检查出错信息窗口
6.4.5 编译
在完成VHDL记述设记后需要把源文件转换为CPLD能用的文件。在很多软
件设计时通常被称为编译,在此CPLD设计被称为Fighting。它的目标是生成
CPLD硬件目标文件。具体操作只需在Process for Current Sourse窗口中表
示的Fitter (见图6.22) 用鼠标双激即可。Fighting处理的状态可由图5.54所示
的小窗口显示。
图6.22 编译窗口
Fighting进行状态窗口
图6.23 编译进度窗口
如上述Fighting结果OK时Fitter处会出现绿色Check标志。另外在下部窗
口中最后行显有 Done : completed successfully。
Fighting结果确认
对复杂的逻辑电路设计时需要检查确认多种结果。在简单设计中仅确认它的
端口配置情况。具体操作需在Process for Current Sourse窗口中表示的
Fitter配置下的Fitter Report处用鼠标双击即可激活Report窗口。在此窗口中
对示例显有以下端口配置图6.24。
***************************Device Pin Out***************************
Device : XC9536-5-PC44
T T T
T T T V T
I I I
I I I C I
EE E y b a E E E C E
-------------------------------/6 5 4 3 2 1 44 43 42 41 40 \
TIE | 7
39 | TIE
TIE | 8
38 | h
TIE | 9
37 | e
GND | 10
36 | c
TIE | 11
XC9536-5-PC44
35 | d
TIE | 12
34 | f
TIE | 13
33 | TIE
TIE | 14
32 | VCC
TDI | 15
31 | GND
TMS | 16
30 | TDO
TCK | 17
29 | TIE
\ 18 19 20 21 22 23 24 25 26 27 28 /
-------------------------------T T T V T G T T T T T
I I I C I N I I I I I
E E E C E D E E E E E
图6.24 端口配置图
从上端口配置图看到端口配置比较乱,那是因为在VHDL记述中未进行引脚
端口指定,由开发软件自动配置的结果。
6.4.6 CPLD芯片写入
通过上面几步基本完成了VHDL记述设计,源文件的编译。这时就可对写入
CPLD芯片的数据。在对CPLD写入时需要通过电缆把计算机与CPLD写入器相连
接。同时启动写入程序。
在Process for Current Sourse窗口中表示有Create Programming File
选项配下的Launch JTAG Programmer处用鼠标双击即可。这样即作成需要写
入CPLD的JEDEC文件,同时开启JTAG Programmer窗口如下(图6.25以及
图6.26)
图6.25 CPLD芯片写入窗口1
6.5 应用实例:电子揭示牌用7 Bits×16 Bits Latch寄存
器
在本节中简要介绍电子揭示牌用的7 Bit位×16 Bits位的Latch寄存器。
它一般用于LED点灯/消灯用的输出保持电路。Latch寄存器本身有很多种标
准逻辑IC,如4034等 (8 Bits Universal Bus Register)。8 Bits×16
Bits的Latch寄存器如使用如上4034标准逻辑集成芯片则需要16片4034
ICs,这样在电路设计及电路体积考虑上均较麻烦。在此使用了2片XC9572PC84即可完成相同的功能。它的逻辑电路功能请见图6.27所示。可以看到一
片CPLD完成7 Bits×8 Bits Latch寄存器功能,二片组合即完成7
Bits×16 Bits Latch寄存器功能。设计的Latch寄存器的状态动作表请见表
6.4所示。
注:CLK脉冲下降沿有效
表 6.4 动作状态表
由上表所示,Latch寄存器的输出使用了4位二进制编码(S0,S1,S2,
S3)选择输出。且输入时中由H高电平到L低电平时有效。整个电路由二片CPLD
组成,如图6.27中的A电路和B电路。
以下将介绍电路A和B的内部等价电路和它们的CPLD VHDL记述设计。
图6.28 Latch寄存器A的等价电路
6.5.1Latch 寄存器A设计
Latch 寄存器A的等价电路如图6.28,下面将针对其VHDL记述设计、设计
说明、引脚配置图进行说明。
VHDL记述设计
Latch 寄存器A的VHDL记述设计如下:
2.VHDL记述设计说明
VHDL记述设计说明
行号
解释
009
指定std_logic Libray。
012
-016
指定输入/输出口PORT。
017
-028
指定输入/输出口PIN。
032
033
定义内部逻辑运算使用的寄存器。
因为VHDL限制,在ENTITY部不能使用而指定的输出(
OUT)。
与输出相同指定了7BITS的配列。
034
与Case文结构不一致时(指定SIDE B)所指定的
DUMMY信号。
036
-043
把内部运算寄存器与输出寄存器相连接。
045
检出CLK时钟从高电平1到低电平0的变化。
「CLK='0' and CLK'event」文是表示CLK从'1'到'0'变
化检出的VHDL记述。
046
-056
如检出CLK的下降沿,生成Case文的逻辑。
根据选择信号(S),记录相应在LATCH寄存器的输入
数据。
如SIDE B情况下,记录在DUMMY寄存器的数据。
且"when others"文不能省。
3. Latch寄存器A的CPLD Pin配置
Latch寄存器A引脚配置示意图如下
***************************Device Pin Out***************************
Device : XC9536-5-PC84
q q q
q q q q q q q q q q q q q
q q
0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0
5 5 5
4 4 4 4 4 4 4 3 3 3 3 3 3
3 2
< < < G < < < < < < < < < < < < < V < < c
4 5 6 N 0 1 2 3 4 5 6 0 1 2 3 4 5 C 6 6 l
> > > D > > > > > > > > > > > > > C > > k
-------------------------------/11 10 9 8 7 6 5 4 3 2 1 84 83 82 81 80 79 78 77 76 75 \
q05<2> | 12
74 | s<0>
q05<3> | 13
73 | VCC
q05<1> | 14
72 | s<1>
q05<0> | 15
71 | q02<5>
GND | 16
70 | s<2>
q06<6> | 17
69 | q02<4>
q06<5> | 18
68 | s<3>
q06<4> | 19
67 | q02<3>
q06<3> | 20
66 | din<0>
q06<2> | 21
XC9572-15-PC84
65 | q02<2>
VCC | 22
64 | VCC
q06<1> | 23
63 | q02<1
q06<0> | 24
62 | din<1>
q07<6> | 25
61|q02<0>
q07<5> | 26
60| GND
GND | 27
59 | TDO
TDI | 28
58 | din<2>
TMS | 29
57 | TIE
TCK | 30
56 | din<3>
q07<4> | 31
55 | q01<6>
q07<3> | 32
54 | din<4>
\ 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 /
-------------------------------------------------------------q q q q q V q q q G q q q q q q G q d q d
0 0 0 0 0 C 0 0 0 N 0 0 0 0 0 0 N 0 i 0 i
7 7 0 7 0 C 0 0 0 D 0 0 1 1 1 1 D 1 n 1 n
< < < < <
< < <
< < < < < <
< < < <
1 2 0 0 1
3 2 4
6 5 1 0 3 2
4 6 5 5
> > > > >
> > >
> > > > > >
> > > >
Legend : NC = Not Connected,unbonded pin
TIE = Tie pin to GND or board trace driven to valid logic level
VCC = Dedicated Power Pin
GND = Dedicated Ground Pin
TDI = Test Data In,JTAG pin
TDO = Test Data Out,JTAG pin
TCK = Test Clock,JTAG pin
TMS = Test Mode Select,JTAG pin
PROHIBITED = User reserved pin
6.5.1Latch 寄存器B设计
Latch 寄存器B的等价电路如图6.29,以下将针对其VHDL记述设计、
设计说明、引脚配置图进行说明。
图6.29 Latch寄存器B的等价电路图
1.
Latch寄存器B的VHDL记述设计
Latch 寄存器B的VHDL记述设计如下:
2.VHDL记述设计说明
VHDL记述设计说明
行号
解释
009
指定std_logic Libray。
012
-016
指定输入/输出口PORT。
017
-028
指定输入/输出口PIN。
032
033
定义内部逻辑运算使用的寄存器。
因为VHDL限制,在ENTITY部不能使用而指定的输出(OUT)
。
与输出相同指定了7BITS的配列。
034
与Case文结构不一致时(指定SIDE B)所指定的DUMMY信
号。
036
-043
把内部运算寄存器与输出寄存器相连接。
045
检出CLK时钟从高电平1到低电平0的变化。
「CLK='0' and CLK'event」文是表示CLK从'1'到'0'变化检
出的VHDL记述。
046
-056
如检出CLK的下降沿,生成Case文的逻辑。
根据选择信号(S),记录相应在LATCH寄存器的输入数
据。
如SIDE B情况下,记录在DUMMY寄存器的数据。且
"when others"文不能省。
3. Latch寄存器B的CPLD Pin配置
Latch寄存器B引脚配置示意图如下:
**************************** Device Pin Out
****************************
Device : XC9572-15-PC84
q q q
q q q q q q q q q q q q q
q q
1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1
1 1
3 3 3
2 2 2 2 2 2 2 1 1 1 1 1 1
1 0
< < < G < < < < < < < < < < < < < V < < c
4 5 6 N 0 1 2 3 4 5 6 0 1 2 3 4 5 C 6 6 l
> > > D > > > > > > > > > > > > > C > > k
-------------------------------------------------------------/11 10 9 8 7 6 5 4 3 2 1 84 83 82 81 80 79 78 77 76 75 \
q13<2> | 12
74 | s<0>
q13<3> | 13
73 | VCC
q13<1> | 14
72 | s<1>
q13<0> | 15
71 | q10<5>
GND | 16
70 | s<2>
q14<6> | 17
69 | q10<4>
q14<5> | 18
68 | s<3>
q14<4> | 19
67 | q10<3>
q14<3> | 20
66 | din<0>
q14<2> | 21
XC9572-15-PC84
65 | q10<2>
VCC | 22
64 | VCC
q14<1> | 23
63 |
q10<1>
q14<0> | 24
62 |
din<1>
q15<6> | 25
61
|q10<0>
q15<5> | 26
60 | GND
GND | 27
59 | TDO
TDI | 28
58 |
din<2>
TMS | 29
57 | TIE
TCK | 30
56 | din<3>
q15<4> | 31
55 |
q09<6>
q15<3> | 32
54 |
din<4>
\ 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 /
- -----------------------------------------------------------q q q q q V q q q G q q q q q q G q d q d
1 1 0 1 0 C 0 0 0 N 0 0 0 0 0 0 N 0 i 0 i
5 5 8 5 8 C 8 8 8 D 8 8 9 9 9 9 D 9 n 9 n
< < < < <
< < <
< < < < < <
< < < <
Legend : NC = Not Connected,unbonded pin
TIE = Tie pin to GND or board trace driven to valid
logic level
VCC = Dedicated Power Pin
GND = Dedicated Ground Pin
TDI = Test Data In,JTAG pin
TDO = Test Data Out,JTAG pin
TCK = Test Clock,JTAG pin
TMS = Test Mode Select,JTAG
pinPROHIBITED = User reserved pin