EDA文档.docx
《EDA文档.docx》由会员分享,可在线阅读,更多相关《EDA文档.docx(22页珍藏版)》请在冰豆网上搜索。
EDA文档
以大规模可编程逻辑器件为设计载体,以硬件描述
语言为系统逻辑描述的主要表达方式,以计算机、大规
模可编程器件的开发软件及实验开发系统为设计工具,
自动完成用软件方式描述的电子系统到硬件系统的逻辑
编译、逻辑化简、逻辑分割、逻辑综合及优化、布局布
线、逻辑仿真,直至完成对于特定目标芯片的适配编译
、逻辑映射、编程下载等工作,最终形成集成电子系统
或专用集成芯片的一门多学科融合的新技术。
利用EDA技术进行电子系统的设计,具有以下几个特点:
1用软件的方式设计硬件;
2用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的;
3设计过程中可用有关软件进行各种仿真;
4系统可现场编程,在线升级;
5整个系统可集成在一个芯片上,体积小、功耗低、可靠性高
1.3EDA技术的主要内容
1、大规模可编程逻辑器件;
2、硬件描述语言;
3、软件开发工具;
4、实验开发系统。
可编程逻辑器件(简称PLD)是一种由用户编程来实现某种逻辑功能的新型逻辑器件。
它不仅速度快、集成度高,能够完成用户定义的逻辑功能外,还可以加密和重新定义编程,其允许编程次数可多达上万次。
PLD主要分为FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)两大类。
两者显著的优点是开发周期短、投资风险小、产品上市快、市场适应能力强、硬件升级方便。
把电子设计抽象层次的一种表示转化为另一种校低层次表示的过程。
它可分为以下几个层次:
1、自然语言到VHDL语言算法描述,即自然语言综合;
2、从算法描述到寄存器传输级描述(从行为级到结构级),即行为综合;
3、从寄存器传输级到逻辑门级描述,即逻辑综合;
4、从逻辑门级到版图级表示,即版图综合或结构综合。
●目前流行多种网表文件格式,其中最通用的是EDIF格式的网表文件。
Xilinx的XNF网表文件格式也很流行,一般只在使用Xilinx的FPGA/CPLD时才会用到XNF格式。
●VHDL文件格式也可以用来描述电路网络,即采用VHDL语法描述各级电路互连,称之为VHDL网表,它描述的电路与生成的EDIF/XNF等网表文件一致。
●VHDL网表文件采用VHDL语法,只是其中的电路描述采用了结构描述方法,即首先描述了最基本的门电路,然后将这些门电路用例化语句连接起来。
用EDA技术设计电路可以分为不同的技术环节,每一个环节中必须有对应的软件包或专用的EDA工具独立处理。
EDA工具大致可以分为以下5个模块。
☐设计输入编辑器
☐仿真器
☐HDL综合器
☐适配器(或布局布线器)
☐下载器
简单PLD现在已被大规模、超大规模集成电路工艺制造的复杂可编程逻辑器件CPLD和现场可编程门阵列FPGA取代。
简单PLD被取代的原因:
1、阵列规模较小,资源不够用于设计数字系统。
2、片内寄存器资源不足,且寄存器的结构限制教多,难于构成丰富的时序电路。
3、I/O不够灵活,限制了片内资源的利用率。
4、编程不便,需要专用的编程工具。
CPLD由五个主要部分:
逻辑阵列块、宏单元、扩展乘积项、可编程连线阵列和I/O控制块。
查找表
◆一个N输入查找表(LUT,LookUpTable)可以实现N个输入变量的任何逻辑功能;
◆一个N输入的查找表,需要用2的N次幂个SRAM单元;
◆I/O引脚由I/O单元IOE来驱动,IOE位于行列的末端,IOE引脚可以设置为输入输出或双向引脚。
◆每个I/O单元包括一个双向I/O缓冲器和一个可作为输入/输出的寄存器。
◆IOE具有多种特性:
JTAG编程支持、摆率控制、三态缓冲、漏极开路输出等。
◆每个IOE的时钟、时钟使能、清除和输出使能控制均由I/O控制信号网络提供,称为周围控制总线,采用高速驱动能使通过器件的偏移最小。
◆周边控制总线还有两个专用时钟信号,每个IOE可以使用这两个专用时钟信号中的任意一个用于时钟以及时钟使能的控制
TDI测试数据输入测试指令和编程数据的串行输入引脚。
数据在TCK的上升沿移入
TDO测试指令和编程数据的串行输出引脚,数据在TCK的下降沿移出。
如果数据没有被移出时,该引脚处于高阻态
TMS测试模式选择控制信号输入引脚,负责TAP控制器的转换。
TMS必须在TCK的上升沿到来之前稳定。
TCK测试时钟输入时钟输入到BST电路,一些操作发生在上升沿,而另一些发生在下降沿
TRST测试复位输入低电平有效,异步复位边界扫描电路(在IEEE规范中,该引脚可选)
目前,常见的大规模可编程逻辑器件的编程工艺有三种:
(1)基于电可擦除存储单元的EEPROM或Flash技术;
编程后掉电信息不丢失,编程次数有限,编程速度不快。
(2)基于SRAM查找表的编程单元;
掉电后信息丢失,上电必须重新配置,配置次数为无限。
(3)基于反熔丝编程单元。
一次性可编程。
CPLD编程和FPGA配置可使用专用的编程设备,也可以使用下载电缆。
信号SIGNAL变量VARIABLE
基本用法用于作为电路中的信号连线用于作为进程中局部数据存储单元适用范围在整个结构体内的任何地方都能适用只能在所定义的进程中使用行为特性在进程的最后才对信号赋值立即赋值
◆有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。
◆状态机的结构模式相对简单。
◆状态机容易构成性能良好的同步时序逻辑模块。
◆状态机的VHDL表述丰富多样。
◆在高速运算和控制方面,状态机更有其巨大的优势。
◆就可靠性而言,状态机的优势也是十分明显的
状态机的基本操作有两种:
(1)状态机内部状态转换。
状态机经历一系列状态,下一状态由状态译码器根据当前状态和输入条件决定。
(2)产生输出信号序列。
输出信号由输出译码器根据当前状态和输入条件决定。
用输入信号决定下一状态也称为“转移”。
一般有限状态机的设计
从一个状态转移到另一个状态称为控制定序,而决定下一状态所需的逻辑称为转移函数。
用VHDL设计的状态机有多种形式:
⏹信号输出方式:
Mealy型、Moore型
⏹结构:
单进程、多进程
⏹状态表达式:
符号化、确定状态编码
⏹编码方式:
顺序编码、一位热码编码、其他编码
为了能获得可综合的,高效的VHDL状态机描述,建议使用枚举数据类型来定义状态机的状态,并使用多进程方式来描述状态机的内部逻辑。
一般情况下,可使用两个进程来描述,一个进程描述时序逻辑,包括状态寄存器的工作和寄存器状态的输出;另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以及状态转换值的输出。
必要时还可引入第三个进程完成其他的逻辑功能。
信号输出方式
moore
☐同步输出状态机;
☐输出为当前状态的函数;
☐在输入变化后,必须等待时钟的到来,时钟使状态发生变化时才导致输出变化。
Mealy
☐异步输出状态机;
☐输出为当前状态和所有输入信号的函数;
☐输出在输入变化后立即发生,不依赖时钟的同步。
☐
Mooore状态机
☐Moore状态机的输出只与有限状态自动机的当前状态有关,与输入信号的当前值无关。
☐Moore有限状态机在时钟脉冲的有效边沿后的有限时延后,输出达到稳定值。
☐即使在一个时钟周期内输入信号发生变化,输出也会在一个完整的时钟周期内保持稳定值而不变。
☐输入对输出的影响要到下一个时钟周期才能反映出来。
☐Moore有限状态机最重要的特点就是将输入与输出信号隔离开来。
mealy状态机
◆Mealy有限状态机的输出不单与当前状态有关,而且与输入信号的当前值有关。
◆输入信号可能在一个时钟周期内任意时刻变化,这使得Mealy有限状态机对输入的响应发生在当前时钟周期,比Moore有限状态机对输入信号的响应要早一个周期。
◆因此,输入信号的噪声可能影响输出信号。
(1)
architecturebeh2ofmux2is
begin
withsel_0select
q<=aafter10nswhen‘0’;
bafter10nswhenothers;
endbeh2;
1、不可以综合,因为after10ns这个语句只能用于仿真,不能进行综合
(2)process(a,b)
begin
c1<=nota;
c2<=aandb;
endprocess;2、可以综合
(3)process(clk)begin
if(clk’eventandclk=‘1’)then
q<=d;
else
q<=a;
endif;
endprocess;3、不可以综合,if(clk’eventandclk=‘1’)then描述不能有else项
例2:
设计一异步复位、60进制计数器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt60is
port(clk,rst:
instd_logic;
m60:
outstd_logic_vector(5downto0));
endcnt60;
architecturecnt60ofcnt60is
signalcnt60:
std_logic_vector(5downto0);
begin
process(clk,rst)
begin
ifrst='1'thencnt60<=(others=>'0');
elsifclk'eventandclk='1'then
ifcnt60=59then
cnt60<=(others=>'0');
else
cnt60<=cnt60+1;
endif;
endif;
endprocess;
m60<=cnt60;
endcnt60;
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
entitychkis
port(din:
inSTD_LOGIC;
clk,clr:
inSTD_LOGIC;
d:
inSTD_LOGIC_VECTOR(7downto0);
check_out:
outSTD_LOGIC);
endchk;
architecturechkofchkis
signalq:
integerrange0to8;
begin
process(clk,clr)
begin
ifclr='1'thenq<=0;
elsifclk'eventandclk='1'then
caseqis
when0=>ifdin=d(7)thenq<=1;elseq<=0;endif;
when1=>ifdin=d(6)thenq<=2;elseq<=0;endif;
when2=>ifdin=d(5)thenq<=3;elseq<=0;endif;
when3=>ifdin=d(4)thenq<=4;elseq<=0;endif;
when4=>ifdin=d(3)thenq<=5;elseq<=0;endif;
when5=>ifdin=d
(2)thenq<=6;elseq<=0;endif;
when6=>ifdin=d
(1)thenq<=7;elseq<=0;endif;
when7=>ifdin=d(0)thenq<=8;elseq<=0;endif;
whenothers=>q<=0;
endcase;
endif;
endprocess;
process(q)
begin
ifq=8thencheck_out<='1';
elsecheck_out<='0';
endif;
endprocess;
endchk;为一个序列检测电路,当检测到输入din为预设值d时,check_out输出为1,否则为0。
1.libraryieee;
2.useieee.std_logic_1164.all;
3.entityterminal_countis
4.port(clock,reset,enableinbit;
5.data:
instd_logic_vector(7downto0);
6.equals,term_cntoutstd_logic;);
7.endterminal_count;
8.architecturebheofterminal_countis
9.begin
10.process
11.signalcount:
std_logic_vector(7downto0);
12.begin
13.ifdata=countthen
14.equals='1'
15.endif;
16end.process;17.process(clk)
18.begin
19.ifreset='1'then
20.count<="111111111";
21.elseifclock'eventandclock='1'then
22.count<=count+1;
23.endif
24.endprocess;
25.term_cnt<=countwhenenable=‘1‘else‘z';
26.endterminal_count
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityterminal_countis
port(clock,reset,enable:
inbit;
data:
instd_logic_vector(7downto0);
equals,term_cnt:
inoutstd_logic_vector(7downto0));
endterminal_count;
architecturebheofterminal_countis
signalcount:
std_logic_vector(7downto0);
begin
process(data)
begin
ifdata=countthen
equals<=“11111111”;
endif;
endprocess;
process(clock)
begin
ifreset='1'then
count<="11111111";
elsifclock'eventandclock='1'then
count<=count+1;
endif;
endprocess;
term_cnt<=countwhenenable<=‘1’else"ZZZZZZZZ“;
endbhe;
正确程序
例5:
分析下面程序,画出x,y,dout功能仿真波形,并说出该程序的功能。
libraryieee;
useieee.std_logic_1164.all;
entityxdouis
port(din:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
dout:
outSTD_LOGIC
);
endxdou;
architecturebheofxdouis
signalx,y:
std_logic;
begin
process(clk)
begin
ifclk'eventandclk='1'then
x<=din;
y<=x;
dout<=xandy;
endif;
endprocess;
endbhe;
1、试编写“01111110”序列发生器的VHDL语言程序。
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
useIEEE.STD_LOGIC_unsigned.all;
entityrplcontis
port(clk,rst:
inSTD_LOGIC;
zo:
outSTD_LOGIC);
endrplcont;
architecturebhvofrplcontis
signalcount:
std_logic_vector(2downto0);
signalz:
std_logic;
begin
process(clk,rst)
begin
ifrst='1'thencount<="000";
elsifclk'eventandclk='1'then
ifcount=7thencount<="000";
elsecount<=count+1;
endif;
endif;
endprocess;
process(count)
begin
casecountis
when"000"=>z<='0';
when"001"=>z<='1';
when"010"=>z<='1';
when"011"=>z<='1';
when"100"=>z<='1';
when"101"=>z<='1';
when"110"=>z<='1';
whenothers=>z<='0';
endcase;
endprocess;
process(rst,clk)
begin
ifrst='1'thenzo<='0';
elsifclk'eventandclk='1'then
zo<=z;
endif;
endprocess;
endbhv;
2、编写8位二进制数求补电路的VHDL程序。
设电路的输入为A[7:
0]、输出为B[7:
0],其中A、B的最高位为符号位。
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
useIEEE.STD_LOGIC_unsigned.all;
entityneg8is
port(A:
inSTD_LOGIC_VECTOR(7DOWNTO0);
B:
outSTD_LOGIC_VECTOR(7DOWNTO0);
endneg8;
architectureoneofneg8is
signalBB:
std_logic_vector(7downto0);求补码:
需要判断符号位
正数的补码=原码,
负数的补码=原码按位取反加1。
begin
process(A)
BB<=NOTA;
B<=BB+1;求补运算规则:
作为一种运算,不考虑符号位,强调的是将二进制数按位取反加1这样一个过程,将符号位作为数值位一同运算。
endprocess;
endone;
3、编写8位二进制数据比较器的VHDL源程序。
设电路的两个8位二进制输入为A[7:
0]和B[7:
0],当A[7:
0]>B[7:
0]时,输出GT=1,当A[7:
0]
0]时,输出LT=1,当A[7:
0]=B[7:
0]时输出EQ=1。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycomp8is
port(a:
instd_logic_vector(7downto0);
b:
instd_logic_vector(7downto0);
gt,lt,eq:
outstd_logic);
endcomp8;
architectureoneofcomp8is
begin
process(a,b)
begin
ifa>bthenlt<='0';gt<='1';eq<='0';
elsifaelselt<='0';gt<='0';eq<='1';
endif;
endprocess;
endone;
4、编写带复位和预置控制的10进制加法计数器的VHDL源程序。
预置数据输入端为D[3:
0],计数输出端为Q[3:
0],时钟输入为CLK,复位输入为CLR,当CLR=0时,Q[3:
0]=0000。
LDN是预置控制输入端,LDN=0时,Q[3:
0]=D[3:
0],ENA是使能控制输入端,ENA=1时,计数器计数,ENA=0时,计数器保持不变。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,CLR,ENA,LDN:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT10;
ARCHITECTUREbehOFCNT10IS
SIGNALCQI:
STD_LOGIC_VECTOR(3DOWNTO0):
=“0000”;
BEGIN
PROCESS(CLK,CLR,ENA,LDN)
BEGIN
IFCLR=‘0'THENCQI<=“0000”
ELSIFCLK'EVENTANDCLK='1'THEN
IFLDN=‘0'THENCQI<=D;
ELSE
IFENA=‘1’THEN
IFCQI<9THENCQI<=CQI+1;
ELSECQI<=“0000’;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
Q<=CQI;
ENDPROCESS;
COUT<=CQI(0)ANDCQI(3);
ENDbhv;
第7章作业
1、设计一个111序列检测器电路,其功能是连续输入三个或三个以上的1时,电路输出为1,其余情况下输出为0。
要求:
画出其状态转移图,并编写VHDL程序实现上述功能。
st0:
初始状态,电路还未收到一个有效1。
st1:
收到一个1后的状态
St2:
连续收到两个1后的状态。
st3:
连续收到三个1个后的状态。
libraryIEEE;
useIEEE.STD_LOGIC_1164.all;
entit