EDA技术第3章:VHDL基础_第1页
EDA技术第3章:VHDL基础_第2页
EDA技术第3章:VHDL基础_第3页
EDA技术第3章:VHDL基础_第4页
EDA技术第3章:VHDL基础_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA技术与VHDL

第3章VHDL基础

3.1VHDL基本语法

3.1.1组合电路描述图3-1mux21a实体

图3-2mux21a结构体

3.1VHDL基本语法3.1.1组合电路描述【例3-1】ENTITYmux21aISPORT(a,b:INBIT;s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINy<=aWHENs='0'ELSEb;ENDARCHITECTUREone;3.1VHDL基本语法3.1.1组合电路描述【例3-2】

ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd<=aAND(NOTS);e<=bANDs;y<=dORe;ENDARCHITECTUREone;

3.1VHDL基本语法【例3-3】

ENTITYmux21aISPORT(a,b,s:INBIT;y:OUTBIT);ENDENTITYmux21a;ARCHITECTUREoneOFmux21aISBEGINPROCESS(a,b,s)BEGINIFs='0'THENy<=a;ELSEy<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREone;

3.1.1组合电路描述3.1VHDL基本语法图3-3mux21a功能时序波形

3.1.1组合电路描述3.1VHDL基本语法3.1.2VHDL结构【例3-4】ENTITYe_nameISPORT(p_name:port_mdata_type;...

p_namei:port_midata_type);ENDENTITYe_name;1.实体表达3.1VHDL基本语法2.实体名3.端口语句和端口信号名4.端口模式“IN”、“OUT”、“INOUT”、“BUFFER”5.数据类型3.1VHDL基本语法6.结构体表达【例3-5】ARCHITECTUREarch_nameOFe_nameIS[说明语句]BEGIN(功能描述语句)ENDARCHITECTUREarch_name;3.1VHDL基本语法7.赋值符号和数据比较符号

IFaTHEN...--注意,a的数据类型必须是booleanIF(s1='0')AND(s2='1')OR(c<b+1)THEN..

8.逻辑操作符BIT、BOOLEAN、STD_LOGICAND(与)、OR(或)、NAND(与非)、NOR(或非)、XOR(异或)、XNOR(同或)和NOT(取反)3.1VHDL基本语法9.条件语句10.WHEN_ELSE条件信号赋值语句赋值目标<=表达式WHEN赋值条件ELSE表达式WHEN赋值条件ELSE...

表达式;z<=aWHENp1='1'ELSEbWHENp2='1'ELSEc;

3.1VHDL基本语法11.进程语句和顺序语句12.文件取名和存盘IF_THEN_ELSE_ENDIF;

PROCESS...ENDPROCESS

“.vhd”

adder_f.vhd

3.2时序电路描述3.2.1D触发器【例3-6】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF1ISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF1ISSIGNALQ1:STD_LOGIC;--类似于在芯片内部定义一个数据的暂存节点

BEGINPROCESS(CLK,Q1)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=D;ENDIF;ENDPROCESS;Q<=Q1;--将内部的暂存数据向端口输出(双横线--是注释符号)

ENDbhv;

图3-4D触发器

3.2时序电路描述3.2.2时序描述VHDL规则

1.标准逻辑位数据类型STD_LOGICBIT数据类型定义:

TYPEBITIS('0','1');--只有两种取值STD_LOGIC数据类型定义:

TYPESTD_LOGICIS('U','X','0','1','Z','W','L','H','-');--有9种取值

3.2时序电路描述2.设计库和标准程序包LIBRARYWORK;LIBRARYSTD;USESTD.STANDARD.ALL;

LIBRARY<设计库名>;USE<设计库名>.<程序包名>.ALL;

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

3.2时序电路描述3.信号定义和数据对象<信号名>'EVENT

4.上升沿检测表式和信号属性函数EVENT5.不完整条件语句与时序电路3.2时序电路描述【例3-7】ENTITYCOMP_BADISPORT(a1,b1:INBIT;q1:OUTBIT);END;ARCHITECTUREoneOFCOMP_BADISBEGINPROCESS(a1,b1)BEGINIFa1>b1THENq1<='1';ELSIFa1<b1THENq1<='0';--未提及当a1=b1时,q1作何操作ENDIF;ENDPROCESS;END;3.2时序电路描述图3-5例3-7的电路图

3.2时序电路描述图3-6例3-8的电路图

【例3-8】...IFa1>b1THENq1<='1';ELSEq1<='0';ENDIF;...

3.2时序电路描述3.2.3时序电路的不同表述【例3-9】...PROCESS(CLK)BEGINIFCLK'EVENTAND(CLK='1')AND(CLK'LAST_VALUE='0')THENQ<=D;--确保CLK的变化是一次上升沿的跳变

ENDIF;ENDPROCESS;【例3-10】...PROCESS(CLK)BEGINIFCLK='1'ANDCLK'LAST_VALUE='0'--同例3-9THENQ<=D;ENDIF;ENDPROCESS;3.2时序电路描述【例3-11】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D:INSTD_LOGIC;Q:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISSIGNALQ1:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFrising_edge(CLK)--必须打开STD_LOGIC_1164程序包

THENQ1<=D;ENDIF;ENDPROCESS;Q<=Q1;--在此,赋值语句可以放在进程外,作为并行赋值语句

END;3.2时序电路描述3.2.3实现时序电路的不同表述【例3-12】...PROCESSBEGINwaituntilCLK='1';--利用wait语句

Q<=D;ENDPROCESS;3.2时序电路描述【例3-13】...PROCESS(CLK)BEGINIFCLK='1'THENQ<=D;--利用进程的启动特性产生对CLK的边沿检测

ENDIF;ENDPROCESS图3-7例3-13的时序波形

3.2时序电路描述【例3-14】...PROCESS(CLK,D)BEGINIFCLK='1'--电平触发型寄存器

THENQ<=D;ENDIF;ENDPROCESS;

图3-8例3-14的时序波形

3.3全加器的VHDL描述3.3.1半加器描述图3-9全加器f_adder电路图及其实体模块3.3全加器的VHDL描述

3.3.1半加器描述图3-10半加器h_adder电路图及其真值表

3.3全加器的VHDL描述3.3.1半加器描述【例3-15】LIBRARYIEEE;--半加器描述(1):布尔方程描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisBEGINso<=NOT(aXOR(NOTb));co<=aANDb;ENDARCHITECTUREfh1;3.3全加器的VHDL描述【例3-16】LIBRARYIEEE;--半加器描述(2):真值表描述方法USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_adderISPORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDENTITYh_adder;ARCHITECTUREfh1OFh_adderisSIGNALabc:STD_LOGIC_VECTOR(1DOWNTO0);--定义标准逻辑位矢量数据类型BEGIN

abc<=a&b;--a相并b,即a与b并置操作

PROCESS(abc)BEGINCASEabcIS--类似于真值表的CASE语句

WHEN"00"=>so<='0';co<='0';WHEN"01"=>so<='1';co<='0';WHEN"10"=>so<='1';co<='0';WHEN"11"=>so<='0';co<='1';WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDARCHITECTUREfh1;3.3全加器的VHDL描述3.3.1半加器描述【例3-17】

LIBRARYIEEE;--或门逻辑描述

USEIEEE.STD_LOGIC_1164.ALL;ENTITYor2aISPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDENTITYor2a;

ARCHITECTUREoneOFor2aISBEGINc<=aORb;ENDARCHITECTUREone;3.3全加器的VHDL描述【例3-18】

LIBRARYIEEE;--1位二进制全加器顶层设计描述

USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_adderISPORT(ain,bin,cin:INSTD_LOGIC;

cout,sum:OUTSTD_LOGIC);ENDENTITYf_adder;ARCHITECTUREfd1OFf_adderISCOMPONENTh_adder--调用半加器声明语句

PORT(a,b:INSTD_LOGIC;co,so:OUTSTD_LOGIC);ENDCOMPONENT;

COMPONENTor2aPORT(a,b:INSTD_LOGIC;c:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALd,e,f:STD_LOGIC;--定义3个信号作为内部的连接线。

BEGINu1:h_adderPORTMAP(a=>ain,b=>bin,co=>d,so=>e);--例化语句

u2:h_adderPORTMAP(a=>e,

b=>cin,

co=>f,so=>sum);u3:or2aPORTMAP(a=>d,

b=>f,

c=>cout);ENDARCHITECTUREfd1;3.3全加器的VHDL描述3.3.2CASE语句

1.

CASE语句

CASE<表达式>ISWhen<选择值或标识符>=><顺序语句>;...;<顺序语句>;When<选择值或标识符>=><顺序语句>;...;<顺序语句>;...WHENOTHERS=><顺序语句>;ENDCASE;3.3全加器的VHDL描述2.标准逻辑矢量数据类型

B<="01100010";--B(7)为

'0'B(4DOWNTO1)<="1101";--B(4)为

'1'B(7DOWNTO4)<=A;--B(6)等于

A(2)

SIGNALC:BIT_VECTOR(3DOWNTO0);

B:OUTSTD_LOGIC_VECTOR(7DOWNTO0);或SIGNALA:STD_LOGIC_VECTOR(1TO4)3.3全加器的VHDL描述3.并置操作符

SIGNALa:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd:STD_LOGIC_VECTOR(1DOWNTO0);...a<='1'

'0'

d(1)

'1';--元素与元素并置,并置后的数组长度为4...IFa

d="101011"THEN...–-在IF条件句中可以使用并置符

3.3全加器的VHDL描述3.3.3例化语句

COMPONENT元件名ISPORT(端口名表);

ENDCOMPONENT文件名;COMPONENTh_adderPORT(c,d:INSTD_LOGIC;e,f:OUTSTD_LOGIC);例化名

:元件名

PORTMAP([端口名

=>]连接端口名,...);3.4计数器设计【例3-19】ENTITYCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREbhvOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ<=Q+1;ENDIF;ENDPROCESS;ENDbhv;

3.4计数器设计1.程序说明

表式Q<=Q+1的右项与左项并非处于相同的时刻内,对于时序电路,除了传输延时外,前者的结果出现于当前时钟周期;后者,即左项要获得当前的Q+1,需等待下一个时钟周期。

3.4计数器设计2.数据类型说明

1 十进制整数0 十进制整数35 十进制整数10E3 十进制整数,等于十进制整数100016#D9# 十六进制整数,等于十六进制整数D9H8#720# 八进制整数,等于八进制整数720O2#11010010#二进制整数,等于二进制整数11010010B

Q:BUFFERNATURALRANGE15DOWNTO0;Q:BUFFERINTEGERRANGE15DOWNTO0;

3.4计数器设计3.计数器的其他表述方法

【例3-20】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREbhvOFCNT4ISSIGNALQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQ1<=Q1+1;ENDIF;ENDPROCESS;Q<=Q1;ENDbhv;

3.5一般计数器的VHDL设计方法

【例3-21】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT10;ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='1'THENCQI:=(OTHERS=>'0');--计数器异步复位

ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿

IFEN='1'THEN--检测是否允许计数(同步使能)

IFCQI<9THENCQI:=CQI+1;--允许计数,检测是否小于9ELSECQI:=(OTHERS=>'0');--大于9,计数值清零

ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT<='1';--计数大于9,输出进位信号

ELSECOUT<='0';ENDIF;CQ<=CQI;--将计数值向端口输出

ENDPROCESS;ENDbehav;

3.5一般计数器的VHDL设计方法3.5.1相关语法

SIGNALd1:STD_LOGIC_VECTOR(4DOWNTO0);VARIABLEa1:STD_LOGIC_VECTOR(15DOWNTO0);

...d1<=(OTHERS=>'0');a1:=(OTHERS=>'0');d1<=(1=>e(3),3=>e(5),OTHERS=>e(1));

f<=e(1)&e(5)&e(1)&e(3)&e(1);

3.5一般计数器的VHDL设计方法3.5.2程序功能分析图3-11例3-21的RTL电路(Synplify综合)

3.5一般计数器的VHDL设计方法3.5.2程序功能分析图3-12例3-21的工作时序

3.5一般计数器的VHDL设计方法3.5.3移位寄存器设计【例3-22】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHFRTIS--8位右移寄存器

PORT(CLK,LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);QB:OUTSTD_LOGIC);ENDSHFRT;ARCHITECTUREbehavOFSHFRTISBEGINPROCESS(CLK,LOAD)VARIABLEREG8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFCLK'EVENTANDCLK='1'THENIFLOAD='1'THENREG8:=DIN;--由(LOAD='1')装载新数据

ELSEREG8(6DOWNTO0):=REG8(7DOWNTO1);ENDIF;ENDIF;QB<=REG8(0);--输出最低位

ENDPROCESS;ENDbehav;3.5一般计数器的VHDL设计方法3.5.3移位寄存器设计图3-13例3-22的工作时序

3.6数据对象

3.6.1常数

CONSTANT常数名:数据类型

:=表达式

CONSTANTFBT:STD_LOGIC_VECTOR:="010110";--标准位矢类型

CONSTANTDATAIN:INTEGER:=15;--整数类型

3.6数据对象

3.6.2变量

VARIABLE变量名

:数据类型

:=初始值

;VARIABLEa:INTEGERRANGE0TO15;--变量a定义为常数,取值范围是0到5VARIABLEd:STD_LOGIC:=‘1’;--变量a定义为标准逻辑位数据类型,初始值是1

目标变量名

:=表达式

;VARIABLEx,y:INTEGERRANGE15DOWNTO0;--分别定义变量x和y为整数类型VARIABLEa,b:STD_LOGIC_VECTOR(7DOWNTO0);x:=11;y:=2+x;--运算表达式赋值,y也是实数变量a:=b--b向a赋值

a(0TO5):=b(2TO7);

3.6数据对象

3.6.3信号

SIGNAL信号名:

数据类型

:=初始值

目标信号名

<=表达式

AFTER时间量;SIGNALa,b,c,y,z:INTEGER;

...PROCESS(a,b,c)BEGINy<=a+b;z<=c–a;y<=b;ENDPROCESS;

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

信号SIGNAL变量VARIABLE基本用法用于作为电路中的信号连线用于作为进程中局部数据存储单元适用范围在整个结构体内的任何地方都能适用只能在所定义的进程中使用行为特性在进程的最后才对信号赋值立即赋值表3-1信号与变量赋值语句功能的比较

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

【例3-23】

ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)VARIABLEQQ:STD_LOGIC;BEGINIFCLK'EVENTANDCLK='1'THENQQ:=D1;ENDIF;ENDPROCESS;Q1<=QQ;

END;

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

【例3-24】ARCHITECTUREbhvOFDFF3ISSIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQQ<=D1;ENDIF;ENDPROCESS;Q1<=QQ;

END;

3.6数据对象

【例3-25】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISSIGNALA,B:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENA<=D1;B<=A;Q1<=B;ENDIF;ENDPROCESS;

END;3.6数据对象

【例3-26】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)VARIABLEA,B:STD_LOGIC;BEGINIFCLK'EVENTANDCLK='1'THENA:=D1;B:=A;Q1<=B;ENDIF;ENDPROCESS;

END;

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

图3-15例3-26的RTL电路

图3-16D触发器电路

3.6数据对象

【例3-27】

SIGNALin1,in2,e1,

...:

STD_LOGIC;...PROCESS(in1,in2,

...)VARIABLEc1,...:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFin1='1'THEN...–-第

1行

e1<="1010";

–-第

2行

...IFin2='0'THEN...–-第

15+n行

...c1:="0011";

–-第

30+m行

...ENDIF;

ENDPROCESS;【例3-28】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISsignalmuxval:integerrange7downto0;BEGINprocess(i0,i1,i2,i3,a,b)begin

muxval<=0;if(a='1')thenmuxval<=muxval+1;endif;if(b='1')thenmuxval<=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;【例3-29】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISBEGINprocess(i0,i1,i2,i3,a,b)variablemuxval:integerrange7downto0;begin

muxval:=0;if(a='1')thenmuxval:=muxval+1;endif;if(b='1')thenmuxval:=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;图3-16例3-28的RTL电路

图3-17例3-29的RTL电路

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

图3-18例3-28中错误的工作时序

3.6数据对象

3.6.4进程中的信号赋值与变量赋值

图3-19例3-29中正确的工作时序

【例3-30】LibraryIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTIS PORT(CLK,C0:INSTD_LOGIC;--时钟和进位输入

MD:INSTD_LOGIC_VECTOR(2DOWNTO0);--移位模式控制字

D:INSTD_LOGIC_VECTOR(7DOWNTO0);--待加载移位的数据

QB:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--移位数据输出

CN:OUTSTD_LOGIC);--进位输出ENDENTITY;ARCHITECTUREBEHAVOFSHIFTIS SIGNALREG:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALCY:STD_LOGIC;BEGIN PROCESS(CLK,MD,C0)BEGINIFCLK‘EVENTANDCLK=’1‘THEN接下页

CASEMDISWHEN"001"=> REG(0)<=C0;REG(7DOWNTO1)<=REG(6DOWNTO0);CY<=REG(7);--带进位循环左移

WHEN"010"=> REG(0)<=REG(7);REG(7DOWNTO1)<=REG(6DOWNTO0);--自循环左移

WHEN"011"=> REG(7)<=REG(0);REG(6DOWNTO0)<=REG(7DOWNTO1);--自循环右移

WHEN"100"=> REG(7)<=C0;REG(6DOWNTO0)<=REG(7DOWNTO1);CY<=REG(0);--带进位循环右移

WHEN"101"=>REG(7DOWNTO0)<=D(7DOWNTO0);--加载待移数

WHENOTHERS=>REG<=REG;CY<=CY;--保持

ENDCASE;ENDIF;ENDPROCESS; QB(7DOWNTO0)<=REG(7DOWNTO0);CN<=CY; --移位后输出ENDBEHAV;3.6数据对象

3.6.4进程中的信号赋值与变量赋值

图3-20例3-30中带进位循环左移仿真波形(MD="001")

3.7IF语句概述

IF条件句

Then

顺序语句

ENDIF;

1IF条件句

Then

顺序语句ELSIF条件句

Then顺序语句...ELSE

顺序语句ENDIF

4IF条件句

Then顺序语句

ELSE

顺序语句

ENDIF;

2IF条件句

ThenIF条件句

Then...ENDIFENDIF

3【例3-31】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcontrol_stmtsISPORT(a,b,c:INBOOLEAN;output:OUTBOOLEAN);ENDcontrol_stmts;ARCHITECTUREexampleOFcontrol_stmtsISBEGINPROCESS(a,b,c)VARIABLEn:BOOLEAN;BEGINIFaTHENn:=b;ELSEn:=c;ENDIF;output<=n;ENDPROCESS;

ENDexample;

【例3-32】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcoderISPORT(din:INSTD_LOGIC_VECTOR(0TO7);output:OUTSTD_LOGIC_VECTOR(0TO2));ENDcoder;ARCHITECTUREbehavOFcoderISSIGNALSINT:STD_LOGIC_VECTOR(4DOWNTO0);BEGINPROCESS(din)BEGINIF(din(7)='0')THENoutput<="000";ELSIF(din(6)='0')THENoutput<="100";ELSIF(din(5)='0')THENoutput<="010";ELSIF(din(4)='0')THENoutput<="110";ELSIF(din(3)='0')THENoutput<="001";ELSIF(din(2)='0')THENoutput<="101";ELSIF(din(1)='0')THENoutput<="011";ELSEoutput<="111";ENDIF;

ENDPROCESS;

ENDbehav;

3.7IF语句概述

输入输出din0din1din2din3din4din5din6din7

output0output1output2

xxxxxxx0

000

xxxxxx01

100

xxxxx011

010

xxxx0111

110

xxx01111

001

xx011111

101

x0111111

011

01111111

111表3-28线-3线优先编码器真值表

注:表中的“x”为任意,类似VHDL中的“-”值。

3.8进程语句归纳

3.8.1进程语句格式

PROCESS语句结构的一般表达格式如下

[进程标号:]PROCESS[(敏感信号参数表

)][IS][进程说明部分]BEGIN

顺序描述语句

ENDPROCESS[进程标号];

3.8进程语句归纳

3.8.2进程结构组成

进程说明部分顺序描述语句部分敏感信号参数表3.8进程语句归纳

3.8.3进程要点

1.

PROCESS为一无限循环语句

2.

PROCESS中的顺序语句具有明显的顺序/并行运行双重性

PROCESS(abc)BEGINCASEabcISWHEN"0000"=>so<="010";WHEN"0001"=>so<="111";WHEN"0010"=>so<="101";...WHEN"1110"=>so<="100";WHEN"1111"=>so<="000";WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;

3.8进程语句归纳

3.进程必须由敏感信号的变化来启动

4.进程语句本身是并行语句

3.8.3进程要点

5.信号是多个进程间的通信线

6.一个进程中只允许描述对应于一个时钟信号的同步时序逻辑

3.8进程语句归纳

【例3-33】ENTITYmulISPORT(a,b,c,selx,sely:INBIT;data_out:OUTBIT);ENDmul;ARCHITECTUREexOFmulISSIGNALtemp:BIT;BEGINp_a:PROCESS(a,b,selx)BEGINIF(selx='0')THENtemp<=a;ELSEtemp<=b;ENDIF;ENDPROCESSp_a;p_b:PROCESS(temp,c,sely)BEGINIF(sely='0')THENdata_out<=temp;ELSEdata_out<=c;ENDIF;ENDPROCESSp_b;ENDex;

3.9并行赋值语句概述

【例3-34】SIGNALseiect

INTEGERRANGE15DOWNTO0;...Select<=0WHENs0=’0’ANDs1=’0’ELSE1WHENs0=’1’ANDs1=’0’ELSE2WHENs0=’0’ANDs1=’1’ELSE3;x<=aWHENselect=0ELSEbWHENselect=1ELSEcWHENselect=2ELSEd;

3.10双向和三态电路信号赋值

【例3-36】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_sISport(enable:INSTD_LOGIC;

datain:INSTD_LOGIC_VECTOR(7DOWNTO0);

dataout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtri_s;ARCHITECTUREbhvOFtri_sISBEGINPROCESS(enable,datain)BEGINIFenable='1'THENdataout<=datain;ELSEdataout<="ZZZZZZZZ";ENDIF;ENDPROCESS;ENDbhv;3.10.1三态门设计

3.10双向和三态电路信号赋值

3.10.1三态门设计

图3-218位3态控制门电路

3.10双向和三态电路信号赋值

【例3-36】libraryieee;useieee.std_logic_1164.all;entitytri_stateisport(control:instd_logic;in1:instd_logic_vector(7downto0);q:inoutstd_logic_vector(7downto0);x:outstd_logic_vector(7downto0));endtri_state;architecturebody_trioftri_stateisbeginprocess(control,q,in1)beginif(control='0')thenx<=q;elseq<=in1;x<="ZZZZZZZZ";

endif;endprocess;endbody_tri;3.10.2双向端口设计

3.10双向和三态电路信号赋值

【例3-37】(以上部分同上例)process(control,q,in1)beginif(control='0')thenx<=q;q<="ZZZZZZZZ";elseq<=in1;x<="ZZZZZZZZ";

endif;endprocess;endbody_tri;3.10.2双向端口设计

3.10双向和三态电路信号赋值

3.10.2双向端口设计

图3-23例3-36的仿真波形图

3.10双向和三态电路信号赋值

3.10.2双向端口设计

图3-24例3-37的综合结果

3.10双向和三态电路信号赋值

3.10.2双向端口设计

图3-25例3-37的仿真波形图

3.10双向和三态电路信号赋值

3.10.3三态总线电路设计

【例3-38】

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtristate2ISport(input3,input2,input1,input0:INSTD_LOGIC_VECTOR(7DOWNTO0);enable:INSTD_LOGIC_VECTOR(1DOWNTO0);output:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtristate2;ARCHITECTUREmultiple_driversOFtristate2ISBEGINPROCESS(enable,input3,input2,input1,input0)BEGINIFenable="00"THENoutput<=input3;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="01"THENoutput<=input2;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="10"THENoutput<=input1;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="11"THENoutput<=input0;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;ENDmultiple_drivers;

3.10双向和三态电路信号赋值

3.10.3三态总线电路设计

【例3-39】libraryieee;useieee.std_logic_1164.all;entitytri2isport(ctl:instd_logic_vector(1downto0);datain1,datain2,datain3,datain4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtri2;architecturebody_trioftri2isbeginq<=datain1whenctl="00"else(others=>'Z');q<=datain2whenctl="01"else(others=>'Z');q<=datain3whenctl="10"else(others=>'Z');q<=datain4whenctl="11"else(others=>'Z');endbody_tri;

3.10双向和三态电路信号赋值

3.10.3三态总线电路设计

图3-26例3-38错误的综合结果

3.10双向和三态电路信号赋值

图3-27例3-39正确的综合结果

3.11仿真延时

3.11.1固有延时

z<=xXORyA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论