《EDA技术》复习精华
VHDL部分:
前言
EDA:电子设计自动化(E lectronic D esign A utomation) 。
EDA技术包含 4个基本条件:
①大规模可编程逻辑器件——设计载体;②硬件描述语言——主要表达手段;
③软件开发工具——设计工具;④实验开发系统——下载及硬件验证工具。
第一章 电子系统及电子系统设计概论
1.任何一个由两个或两个以上相互作用部件组成的物体都可以称为系统。而由电子元器件 及相关装置组成的能实现某些特定功能的电子电路称之为电子系统。按所处理的信号分,有 模拟电子系统、数字电子系统和模拟数字混合的电子系统。
2.EDA 技术伴随着计算机、集成电路、电子系统设计的发展, 经历了 CAD(计算机辅助设计)、 CAE(计算机辅助工程设计)和 EDA(电子设计自动化)三个发展阶段。
3.必须知道的几个名词:
VLSI:超大规模集成电路
PLD:可编程逻辑器件(Programmable Logic Device)
CPLD:复杂可编程逻辑器件(Complex PLD)
FPGA:现场可编程门阵列(Field Programmable Gate Array)
HDL:硬件描述语言(Hardware Description Language)
VHDL:超高速集成电路硬件描述语言(Very high speed integrated circuit HDL) IEEE:美国电子与电气工程师协会
4.数字电子系统设计的流程
主要有 3种设计流程:自顶向下设计法,自底向上设计法和混合式设计法。
自顶向下设计法:这是 EDA 的理想境界的方法,是 EDA 工具高度发展的结果。自顶向下设计 法其设计过程是分层次的,先作顶层设计(概念设计、总体框图,抽象级别较高的层次的设 计),再作底层设计(子系统、子电路,接近物理实现的较低层次的设计)。在每一个层次上, 大体都有描述、划分、综合和验证等四种类型的操作。
5.硬件描述语言(HDL)是设计者和 EDA工具的交互界面,设计者通过 HDL描述自己的设计 对象。硬件描述语言可以是文本、图形或二者的结合。
6.EDA 软件应当包含以下几个模块:设计输入子模块、 设计数据库子系统、 分析验证子系统、 综合子系统、布局布线子系统和划分子系统。
第四章 硬件描述语言 VHDL
VHDL 的特点:
①支持从系统级至门级电路的多层次描述;支持结构描述、行为描述、数据流描述以及混 合描述,但目前暂不具备描述模拟电路的能力。
②支持自底向上以及自顶向下的设计;支持层次化、模块化设计;支持函数、过程及自定 义程序包和库,以便分解大型设计,实现设计共享。
③支持组合逻辑电路和时序电路;支持延时功能,使硬件描述更准确。
④使用类属语句进行参数化设计,使通用器件设计成为可能。
⑤支持断言语句,报告系统信息和错误信息,使仿真调试更方便。
⑥数据类型丰富,安全性好,既有预定义数据类型,又可自定义数据类型。
注:下面所说的格式中,带中括号“[ ]”的表示可省,带尖括号“< >”的表示必须有。
一、VHDL 程序基本结构
★★一个完整的 VHDL 文本通常包括库、标准程序包的使用,实体,结构体,自定义程序包 和配置等 5个部分。其中对于我们初学者,前三者一般是必须的,后面两个一般不需要。★ ★★补充!!!
我们只要知道电路的逻辑功能(输出与输入的关系)就能编程,不必知道电路内部是如何连 接的!⊙﹏⊙b 汗。。这么简单~囧
1.VHDL 文本,以库(Library )的描述开始
例(一般都这个格式):library ieee?
use ieee.std_logic_1164.all?
2.实体 Entity
实体说明的一般格式如下:
entity 实体名 is --实体名可以随便取
port(端口表);
end 实体名;
实体说明主要描述对象的输入和输出端口,并不描述其具体逻辑功能。文件名必须与实体 名相同,即“实体名.vhd ” 。
例如JK 触发器的实体说明部分为
entity jkff is port(j,k:in std_logic? clk:in std_logic? q,nq:out std_logic)?
end jkff?
端口说明 port (…)的一般格式为
port(端口名:端口模式 数据类型;
端口名:端口模式 数据类型);
其中端口模式有输入(in)、输出(out)、缓冲(buffer)、双向(inout)和不指定方向(linkage)等 5 种模式。其中后面两种一般不常用,缓冲(buffer)允许数据流出端口及内部反馈,如计数器 的输出端,既要输出,又要在内部进行反馈,这时必须用 buffer 模式。
总之,实体Entity 确定了一个设计对象的名称及外部端口。
3.结构体 Architecture
结构体紧跟在实体后面,用于说明设计对象的具体逻辑功能,是程序的核心。所有结构体都 必须附属于某个实体,结构体不能离开实体单独存在。
结构体的一般格式如下:
architecture 结构体名 of 实体名 is
[定义语句?] --这里可定义信号(signal)、元件(component)等,但不能定义变量!
begin --结构体开始
[并行语句?]--主要描述实体的逻辑功能,并行语句后面再详细介绍,最常用的并
行语句是进程语句 process
end 结构体名;
二、VHDL 的基本数据类型及运算操作符 J K clk
JKFF Q NQ
1.标识符(★★★补充!!!)
2.数据对象:常量、变量、信号和文件四种类型。
①常量:constant 常量名:数据类型[:=值];
例如 constant n:integer:=8?--定义常量 n,它是整数类型,值为 8
②变量:variable 变量名:变量名[:=初值];
变量只能定义且使用于进程和子程序中,它是一个局部量。变量常用来存储中间数据, 以便实现程序的算法。对变量的赋值立即实现,与 VB、C 语言中一样。给变量赋值用冒号 等于号,即 变量名:=值;
变量定义及幅值举例:
variable i:integer:=2?--定义变量 i,整型,初值为 2
variable a:std_logic_vector(2 downto 0);--变量 a,标准逻辑位矢量,位长为3,降序排列 a:=“001”?--对变量a 赋值,a=001,即相当于a2a1a0=001
a(2):=’0’?a(1 downto 0):= “01”? --对变量a 分段赋值,即 a2=0,a1 a0=01
③信号★★★
信号与变量的区别★★!!!!
3.数据类型
①整型(integer) 例:
singal a,b,c:integer?
a<=12?b<=34_567?c<=8E2?--“34_567”中的下划线“_”相当于我们常见的逗号“,”,起分隔作用
-------------------------------------------------------------------------------------------------------------
singal a,b,c:integer range 0 to 10000?
a<=10#97#E2?--a=(97)10×10 2 =9700
b<=8#175#? --b=(175)8=1×8 2 +7×8 1 +5×8 0 =125
c<=16#E#E1?--c=(E)16×16 1 =224
整数的数制表示法:★★★补充!!!
例如:8#172.5#E3=(172.5)8×8 3 =(1×8 2 +7×8 1 +2×8 0 +5×8 -1 )×8 3 =62784
、布尔型(boolean),了解即可
②实数类型(real)
③位数据类型(bit) 此类数据类型只存在’0’和’1’两种状态,例:
signal a:bit;--定义信号a 为位类型,即a 只存在’0’和’1’两种状态
④位矢量(bit_vector) 其实就是由 bit 类型组成的数组,偏偏叫位矢量,⊙﹏⊙b汗。。
d0,d1,d2:in bit_vector(7 downto 0)?
d0<=B“1100_1001”?--代入二进制数
d1<=X“F4”?--代入16进制数F4
d2<=O“27”?--代入八进制数27
⑤另外还有字符(character)、字符串(string)、时间(time)等数据类型,略之。
用户自定义数据类型,略之~现有的都用不好了,还自定义个毛啊。考试貌似也没考,我就 不罗嗦了~
★在 IEEE 库中的 std_logic_1164 程序包中预定义了两种非常重要的数据类型:
‘Z’
‘1’ 、
‘0’、
①标准逻辑位(std_logic)数据类型: 它里面共含有 8 种值, 我们常见的有 4 个,
(高阻)、 ‘X’ (未知)★★★补充!!!不准!!!★★★
②标准逻辑位矢量(std_logic_vector):它实际是一个由 std_logic构成的数组。
例:signal d:std_logic_vector(3 downto 0)
要使用这两种数据类型,必须有 use ieee.std_logic_1164.all?这句,这是我们最常用的两种数 据类型,所以习惯性地就写上去了。
★信号最为常用的属性是’event 属性。例如 clk(std_logic类型)的’event 属性:
clk’event and clk=’1’ --时钟上升沿
clk’event and clk=’0’ --时钟下升沿
此外,VHDL还预定义了两个函数,利用它们也可以很方便地检测信号的变化状态: rising_edge(clk) --时钟上升沿
falling_edge(clk) --时钟下升沿
4.常用的运算符
①逻辑运算符:与and,或 or,非 not,与非 nand,或非 nor,同或 xnor,异或 xor
②连接符(并置运算符):&
例:设a(2 downto 0),b(3 downto 0)
a=“100”?
b=‘1’&a? --则 b=1100
③关系运算操作符:等于=、不等于/=、小于<、大于>、小于等于<=、大于等于>=;
其余运算符皆不必叼它,很少用,o(╯□╰)o
三、VHDL中的顺序语句
顺序语句总是包含在进程(process)内部,主要实现功能的算法,其执行顺序严格与书写 顺序一致。顺序语句包括:变量赋值语句、信号赋值语句、if、case、loop、next、exit、null、 wait 等语句。
1.变量赋值语句:变量的说明和赋值只能在进程或子程序中
2.信号赋值语句既可用于并行语句,又可用作顺序语句。
信号赋值有δ延迟,不立即兑现(★★★见书!!!),且不允许在进程或子程序中定义新 的信号!
3.if语句: if 条件 then <顺序语句?>
[elsif 条件 then 顺序语句?] --注意是 elsif不要写成 elseif
[else 顺序语句?]
end if?
注:不完整的 if语句,其综合效果可实现时序逻辑电路。
4.case语句: case 表达式 is
when表达式值=>顺序语句;
[when表达式值=>顺序语句?]
[when others=>顺序语句?]
end case?
在实际应用中,case语句常用来描述编码器、译码器等逻辑电路。
5.loop语句
第一种: [loop标号:]for 循环变量 in 范围 loop
<顺序语句?>
end loop?
例:loop1:for i in 3 downto 0 loop
sum:=sum+1?
end loop? 第二种:[loop标号:] while <条件> loop
<顺序语句?>
end loop?
例:loop2:while(i<=9) loop
i:=i+1?s<=s+1?
end loop?
6.next 语句
next[loop标号][when条件];
next 语句作用于 loop语句内部,它可以有条件或无条件的终止当前循环,并开始下一次 循环。若 loop 标号缺省,则 next 语句作用于当前最内层循环,否则转到指定的循环。不理
解的话看书。
7.exit 语句
exit[loop标号][when条件];
exit 与 next 的区别是,exit 是有条件或无条件的终止整个循环体,亦即退出循环。 8.null 语句
null?
null 语句表示无任何动作,执行该语句只是使流程走到下一步。
四、VHDL中的并行语句
VHDL 的结构体由一条或多条并行语句构成,并行语句相互之间并行执行,其执行顺 序与书写次序无关。VHDL 的基本并行语句有:Process 进程语句、并行信号赋值语句、 Component/Port map元件声明/例化语句、Block块语句、Generate生成语句。
1.进程语句 Process
设计中可包含多个并行的进程,进程之间、进程与并行语句之间并行执行。进程语句 由敏感信号表、顺序语句等要素构成。
[进程标号:]process(敏感信号表) --敏感信号表中的信号发生改变则触发该进程执行
[说明区?]--一般用于定义变量
begin--进程开始
<顺序语句?>--即上面所说的 if、case、loop等所有顺序语句
end process[进程标号]?
含有进程的描述法又叫行为描述法(behavioral)。
2.并行信号赋值语句
一条并行信号赋值语句,总是能够与实现同样功能的一个进程等价。并行信号赋值语句 中出现的所有信号都是敏感信号,都有一个隐式的 wait 语句与其对应。并行信号赋值语句 可直接出现在结构体中。
并行信号赋值语句有三种形式:简单信号赋值语句、条件信号赋值语句和选择信号赋值 语句。
条件信号赋值语句:
例(注意格式): s<=a when(x>3)else
b when(x<3) else
c?
--------------------------------------------------------------------------------------------------------
y<=‘1’when(a=b)else ‘0’? --当a=b时,y=1,否则 y=0
选择信号赋值语句:
例(注意格式): with x select
y<=a when 3, --即当 x=3 时,y=a,注意末尾是逗号
b when 4, --即当 x=4 时,y=b,注意末尾是逗号
c when others?
3. 元件声明/例化语句
这么来解释吧,例如,假设我们已经设计好了一个实体 3-8 译码器,如果要求利用两片 3-8 译码器来构成 4-16 译码器,那么这个 3-8译码器就可称为是元件。元件声明就是将已设 计好的实体(本例中是 3-8译码器)定义为一个元件,元件例化就是调用这个元件。
(一般写在结构体的定义说明区)
元件声明语句:
component 元件名
port(…);--其实就相当于把已设计好的实体端口表再抄一遍,囧
end component;
元件例化语句: (由于它是并行语句,故可直接写在结构体里,不写在 process 里) 元件标号:元件名 port map(信号映射)?
信号映射用来指明元件与实体如何连接。信号映射有两种方式:一种是位置映射,一种是名 称映射。我们常用的是位置映射,即直接把实体中的信号写在元件端口表对应的位置。具体 看书!!!★★★!!!
4. 另外还有块语句 Block,生成语句 Generate,我就不罗嗦了,没的意思~囧
5. 程序包由两部分组成:程序包声明和程序包体。其中程序包体部分,一般用于存放对函 数和过程的具体描述。函数和过程的区别,见书!!!★★★
6. VHDL主要有三种描述方式:行为描述、数据流描述和结构化描述。
设计实例:
1.带有异步置位/复位功能的JK触发器。
Protel 99 SE部分:
1.PCB 布线是指元件器排列与连线走向。
2.Protel 99 SE 原理图文件的格式为*.Sch。
3.原理图设计时,按空格键可使元件器旋转 90°。
4.网络表中有关元器件的定义是:以“[”开始,以“]”结束。
5.原理图设计时,按下 Q 键可实现英制和公制的转换。
6.原理图设计时,按下“E+M+M”快捷键可实现移动功能。
7.在 Protel 99 SE 中,网络表文件的类型是*.net。
8.Protel 中的飞线是指:预拉线,只是表征着电路元器件之间的连接关系。
9.原理图设计时,按下X 键可使元器件水平旋转180°,按下 Y 键可使元器件垂直旋转 180°.
10. Protel 99 SE 的元件属性中,Lib Ref、Footprint、Designator、Part Type分别代表什么意 思?
答:Lib Ref:元件图形符号名称; Footprint:元件封装名称;
Designator:元件标号; Part Type:元件主要规格类型。
11.简要说明原理图设计的一般步骤。
答:①设置图纸大小 ②设置环境 ③放置元件 ④原理图布线
⑤编辑与调整 ⑥输出报表 ⑦存盘打印。
12.简要说明印刷电路板设计的一般步骤。
答: ①绘制原理图 ②启动 PCB 编辑器并设置参数 ③定义板框 ④装入网络表和元件封装库
⑤元件布局 ⑥自动布线 ⑦手工调整 ⑧DRC 检查 ⑨编辑丝印层 ⑩文件保存与输出。
13.放置元件有哪几种方法?
答:①利用工具按钮放置电气元件 ②利用菜单命令Place→Part 放置电气元件
③利用原理图信息窗口放置电气元件
14.印刷电路板主要由焊盘、过孔、安装孔、导线、元器件、接插件、填充、电气边界等组 成,各组成部分的主要功能如下:
焊盘:用于焊接元器件引脚的金属孔;
过孔:用于连接各层之间元器件引脚的金属孔;
安装孔:用于固定印刷电路板;
导线:用于连接元器件引脚的电气网络铜、膜;
接插件:用于电路板之间连接的元器件;
填充:用于地线网络的敷铜,可以有效的减小阻抗;
电气边界:用于确定电路板尺寸,所有电路板上元器件不能超过该边界。
15.简要介绍一下印刷电路板(PCB)的分类。
答:印刷电路板常见的板层结构有单层板、双层板和多层板三种。
单层板:即只有一面敷铜而另一面没有;
双层板:即两个面都敷铜的电路板,通常一面为顶层,另一面为底层?
多层板:即包含多个工作层面的电路板。
16.印刷电路板的主要工作层面有哪些?
答:信号层、防护层、丝印层、内部层等。
信号层:主要用来放置元器件或布线;
防护层: 主要用来确保电路板上不需要镀锡的地方不被镀锡, 从而保证电路板运行的可靠性; 丝印层:主要用来在印刷电路板上印上元器件的轮廓、编号或其他文本信息;
内部层:主要用来作为信号布线层。
17.在 PCB 设计中,选取元件的方法有哪些?
答:①直接选取 ②画框选取 ③用菜单命令选取
18.执行自动布线的方法主要有哪几种?
答: ①全局布线 ②指定网络布线 ③指定两连接点布线 ⑤指定元件布线 ⑥指定区域布线 19.在 PCB 设计中,DRC 电气规则检查主要有实时检查和分批检查两种方式。