版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VHDL的程序结构和软件操作
1-1VHDL程序的基本结构include“stdio.h”;include“math.h”;intmain(void){inta,b,c;a=8;b=9;c=a+b;returnc;}Librarystd;Usestd.standard.all;Entityand2isPort(a,b:inbit;c:outbit);Endand2;Architecturea1ofand2isBeginc<=aandb;Enda1;VHDL程序C程序1-1VHDL程序的基本结构(1)LIBRARY和PACHAGE声明区;(2)ENTITY定义区;(3)ARCHITECTURE定义区;(4)CONFIGURATION定义区。Library(库)是用于存放预先编译好的Package(程序包)。Package(程序包)中定义了基本的常数,数据类型,元件及子程序等。
作用:声明在实体和结构体定义中将用到的数据类型、元件或子程序等。声明格式:
Library
库名;
Use
库名.PACKAGE名.All;(1)LIBRARY和PACKAGE声明区
作用:
ENTITY(实体)用于定义电路的外观,即I/O端口的类型和数量。定义格式:Entity
实体名
is
Port(a:
inbit;
b:inbit;
c:outbit);End
实体名;(2)ENTITY定义区端口名数据类型端口模式(2)ENTITY定义区标识符的定义原则:(1)标识符由字母、数字和下划线组成,a7_;(2)在标识符不区分大小写,ab和AB是一样的;(3)第一个字符必须是字母,即a666;(4)不允许有两个连续的下划线,a__b错误;(5)末尾不能是下划线,mname_错误;(6)标识符不能和关键字相同,如Entity,is等。端口模式(MODE)有以下几种类型:
IN;OUT;INOUT;BUFFER
端口模式可用下图说明:(黑框代表一个设计或模块)
INOUTBUFFERINOUT(2)ENTITY定义区(3)ARCHITECTURE定义区
定义了实体的实现。即电路的具体描述,说明电路执行什么动作或实现功能。定义格式:
Architecture结构体名
of实体名
is
[声明语句;(内部信号、变量、常数,元件,子程序声明)]Begin并行描述语句;End
结构体名;(4)CONFIGURATION定义区
一个完整VHDL电路设计必须有一个实体和对应的结构体,即实体和结构体对构成一个完整的VHDL设计。一个实体可对应一个结构体或多个结构体,即一个实体可以有不同的描述方式。作用:当实体有多个结构体时,系统默认实体选用最后一个结构体,利用CONFIGURATION语句可以任意选择采用哪一个结构体。
(4)CONFIGURATION定义区定义格式:Configuration配置名
of实体名
isfor选用的结构体名endfor;endconfiguration配置名;二输入与门电路设计范例
abc电路真值表abc000100010111二输入与门电路设计范例Librarystd;Usestd.standard.all;Entityand2is
Port(a:inbit;b:inbit;c:outbit);Endand2;--实体定义结束。
双减号--为VHDL程序的注释符,类似C语言中的//注释符。二输入与门电路设计范例ArchitectureNaofand2isBegin
c<=’0’whena=’0’andb=‘0’else’0’whena=’1’andb=‘0’else’0’whena=’0’andb=‘1’else‘1’;符号<=为信号直接赋值符。
EndNa;--结构体NaArchitectureNbofand2is
Beginc<=aandb;--and
为逻辑与操作EndNb;
--结构体Nb二输入与门电路设计范例Configurations1ofand2isfornaendfor;endconfigurations1;--结构体配置结束。1-2Max+plusⅡ系统的操作
Max+plusⅡ开发工具是美国Altera公司自行设计的一种软件工具,其全称为MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、时序分析、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如CPLD或FPGA芯片),作成ASIC芯片。它是EDA设计中不可缺少的一种工具。
下面我们介绍利用Max+plusⅡ
系统如何实现如下操作:(1)如何编写VHDL程序(使用TextEditor);(2)如何编译VHDL程序(使用Compiler);(3)如何仿真验证VHDL程序(使用WaveformEditor,Simulator);(4)如何进行芯片的时序分析(使用TimingAnalyzer);(5)如何安排芯片脚位(使用FloorplanEditor);(6)如何下载程序至芯片(使用Programmer)。1-2Max+plusⅡ系统的操作(1)如何编写VHDL程序a.打开文本编辑器;File/new/Texteditorfileb.编写VHDL程序;c.保存文件,<1>文件名和定义的实体名必须相同,<2>文件扩展名为VHD,<3>文件存盘的目录不应是根目录或桌面,建议存放在Max2work或Maxplus2目录,或其子目录
。(2)如何编译VHDL程序a.打开需要编译的文件;b.设置工程到目前打开的文件;
File/Project/SetProjecttoCurrentFile,c.打开编译器;点击主菜单MAX+plusⅡ/Compiler选项。
d.选定VHDL源文件的版本
;Interfaces/VHDLNetlistReaderSettings…e.打开编译器进行编译。(3)如何仿真验证VHDL程序a.打开波形编辑器(WaveformEditor);b.确定仿真持续时间(File/EndTime);c.将输入输出端口名选入波形编辑器;d.编辑输入信号波形;e.保存仿真波形文件
;f.打开仿真器MAX+plusⅡ\Simulator进行仿真。在仿真结束后打开仿真波形文件(点击右下角的OpenSCF按钮)即可以显示仿真结果。(4)如何进行芯片的时序分析a.选择要下载的器件型号;点击主菜单的Assign/Device项得到Device对话框。在DeviceFamily框中选择芯片系列,在Devices选择框下选择具体的芯片名,最后点击OK按钮。b.再编译一次;c.打开时序分析器(TimingAnalyzer);d.点击Start进行时序分析。(5)如何安排芯片脚位a.打开芯片脚位设置窗口;点击主菜单Assign/Pin/Location/Chip,出现脚位设置对话框;
;b.将实体定义的端口名字和下载芯片的管脚进行具体对应;在NodeName框中输入我们定义的实体端口名字,然后在Pin列表选项框中输入下载芯片的管脚序号,再点击对话框右下角的Add按钮,将所有端口设置完成以后,点击Ok按钮,则实现实体端口和下载芯片的管脚的对应;
c.再编译一次,将生成可以下载的文件(And2.Sof)。(6)如何下载程序至芯片a.将下载电缆与计算机并口相连,然后给芯片通电;b.打开编程器Programmer
;
Options/HardwareSetup,在HardwareType选择ByteBlaster(MV)方式,则在ParallelPort处显示LPT1,单击OK钮返回Programmer窗口。
c.下载方式选择;d.选择下载的芯片类型和要下载的文件(选择JTAG/MutiDevicJTAGChainSetup)。e.点击Configure进行下载,将程序写入芯片中。第二章
数据类型与数据对象的定义2-1数据类型2-2数据对象的定义2-3信号运算符2-4信号属性2-1数据类型在VHDL程序中,我们经常会遇到这样的语句:SignalA:std_logic;VariableB:std_logic_vector(7downto0);ConstantC:integer;数据对象类型数据类型数据对象名
2-1-1逻辑数据类型
(1)布尔代数(Boolean)型;(2)位(Bit);(3)位数组类型(Bit_Vector)在std库的standard程序包中进行定义。typeBIT_VECTORisarray(NATURALrange<>)ofBIT;typeBITis(‘0’,‘1’);typeBOOLEANis(FALSE,TRUE);
(4)标准逻辑型(Std_Logic);
TypeSTD_LOGICis(‘U’,
--Uninialized;未初始化
‘X’,
--Forcingunknown;浮接不定
‘0’,
--Forcing0;低电位
‘1’,
--Forcing1;高电位
‘Z’,
--HighImpedance;高阻抗
‘W’,
--WeakUnknown;弱浮接
‘L’,
--Weak0;弱低电位
‘H’,
--Weak1;弱高电位
‘-’,
--Don’tcare;不必理会
);(5)标准逻辑数组类型(Std_Logic_vector);在ieee库的std_logic_1164程序包中定义。TYPEstd_logic_vectorISARRAY(NATURALRANGE<>)OFstd_logic;
2-1-2数值数据类型(1)整数(Integer);
a.正整数(POSITIVE)
b.自然数(NATURAL)在std库的standard程序包中进行定义。subtypePOSITIVEisrange1toINTEGER’High;TypeINTEGERisrange–2147483648to2147483647;subtypeNATURALisrange0toINTEGER’High;(2)实数(Real)(3)有符号数(Signed)无符号数(Unsigned)在ieee库的std_logic_arith程序包中定义。typeREALisrange–1.7E38to1.7E38;typeUNSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;typeSIGNEDisarray(NATURALrange<>)ofSTD_LOGIC;SIGNED
的最高位为符号位,其余位为数值位,数值位为补码形式。如:符号数”1001”表示-7。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitydataisport(a,b:inunsigned(3downto0);--a,b:insigned(3downto0);c:outstd_logic);enddata;architecturem1ofdataisbeginc<='1'whena<belse'0';endm1;当定义成无符号类型时,若a<=”1000”,b=’0001’,即a=8,b=1则结果c=’0’;当定义成有符号类型时,若a<=”1000”,b=’0001’,则a=-8,b=1,则结果c=’1’。
2-1-3列举和数组数据类型
(1)列举数据类型(EnumeratedTypes)定义格式:Type列举名称is(元素1,元素2,…);(2)数组数据类型(ArrayTypes)定义格式:Type数组名称isArray(range<>)of数据类型;2-1-4数据类型的转换
在VHDL语言里,不同类型的数据信号之间不能互相赋值。当需要不同类型数据之间传递信息时,就需要类型转换函数将其中的一种类型数据转换为另一中数据类型后,再进行信号的传递。例如:SignalY:Std_logic_vector(7downto0);
SignalX:Integerrange0to255;Y<=CONV_STD_LOGIC_VECTOR(X,8);转换函数有两个参数,被转换的对象和转换后的位数。
常用的数据类型转换函数CONV_INTEGER
将数据类型UNSIGNED,SIGNED转换为INTEGER类型.
CONV_UNSIGNED
将数据类型INTEGER,SIGNED转换为UNSIGNED类型.CONV_SIGNED
将数据类型INTEGER,UNSIGNED转换为SIGNED类型. CONV_STD_LOGIC_VECTOR
将数据类型INTEGER,UNSIGNED,SIGNED,STD_LOGIC转换为STD_LOGIC_VECTOR类型.在库ieee的程序包std_logic_arith中定义2-2
数据对象的定义常用的数据对象有三种:常数(Constant)信号(Signal)变量(Variable)
2-2-1常数的定义(1)将数据对象定义为常数,一方面希望该数据对象的值不会被改变;另一方面,为了提高程序的可读性。(2)常数为全局量。(3)常数在程序包说明、实体说明、结构体描述、过程说明、函数调用中使用。(4)常数的定义格式:
Constant
常数名:数据类型:=常数值;
如:ConstantD1:Integer:=3;注意!常数定义的同时进行赋初值。常数的应用示例libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--必需定义+entityexam1is
port(ip:instd_logic_vector(3downto0);op:outstd_logic_vector(3downto0));endexam1;architecturem1ofexam1isconstantnum:integer:=6;beginop<=ip+num;endm1;2-2-2信号的定义(1)“信号”数据对象,代表电路内部信号或连接线路,其在元件之间起互连作用。注意!信号定义的时候尽管可以直接赋初值,但系统往往忽略。建议信号对象定义后再进行赋值。(2)信号为全局量。(3)在实体说明、结构体描述和程序包说明中使用。(4)信号的定义格式:Signal信号名:数据类型;(5)信号赋值的语法格式为:信号名<=表达式;如:SignalS1:Std_logic_vector(3Downto0);S1<=“0000”;2-2-3变量的定义(1)“变量”数据对象,它用于对中间数据的临时存储,并不一定代表电路的某一组件。注意!变量定义的时候尽管可以直接赋初值,但系统往往忽略。建议变量对象定义后再进行赋值。(2)变量为局部量。(3)仅限于进程(Process)或子程序中使用。(4)变量的定义格式:Variable变量名:数据类型;
(5)变量赋值的语法格式为:目标信号值:=表达式;如:VariableS1:Std_logic_vector(3Downto0);S1:=“0000”;libraryieee;useieee.std_logic_1164.all;entitybcvisport(a,b,c:instd_logic;x,y:outstd_logic);endbcv;architecturem2ofbcvisbeginprocess(a,b,c)variabled:std_logic;begin
d:=a;x<=cxord;
d:=b;y<=cxord;endprocess;endm2;ABCXY例一结果:x<=cxorb,y<=cxorbx<=cxora,y<=cxorbarchitecturem1ofbcvissignald:std_logic;beginprocess(a,b,c)begin
d<=a;
--ignoredx<=cxord;
d<=b;y<=cxord;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;Entitycmpisport(cp,ip:instd_logic;--cp为时钟脉冲
op,oq:outstd_logic);--ip为输入信号endcmp;Architecturem1ofcmpissignald:std_logic;beginprocess(cp)variablee:std_logic;beginifcp'eventandcp='1'thend<=ip;op<=d;e:=ip;oq<=e;endif;endprocess;endm1;例二D触发器在进程中,信号赋值只有在过程结束时起作用,而变量赋值是立即进行的。2-2-4信号和变量的比较
(1)信号和变量的对应关系不同:信号代表电路内部信号或连接线路;而变量则不是。
(2)信号和变量声明的位置不同:信号声明在子程序、进程的外部;而变量声明在子程序、进程的内部。
(3)信号为全局量,而变量只在定义它的域中才可见。因此,变量不能在两个进程之间传递信息。
(4)在一个进程中多次为一个信号赋值时,只有最后一个值会起作用;而变量则不同,每次赋值都会改变它的值。(5)赋值不同。在进程中,信号赋值只有在进程结束时起作用,而变量赋值是立即进行的。而且赋值符号不同:信号赋值为“<=”,变量赋值为“:=”。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;一位BCD码的加法器Entitybcdadder
is
Port(a,b:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0));Endbcdadder;ArchitectureNaofbcdadder
is
constantadjnum:integer:=6;--常数定义signalbinadd:std_logic_vector(4downto0);--信号
Beginbinadd<=a+b;--两数相加process(binadd)--对两数和进行处理variabletmp:integerrange0to6;--变量定义beginifbinadd>9thentmp:=adjnum;elsetmp:=0;endif;result<=binadd+tmp;endprocess;EndNa;
2-3信号运算符
VHDL提供了四种类型运算符号:逻辑运算符关系运算符算术运算符连接运算符VHDL运算符——逻辑运算符
and
逻辑与
or
逻辑或
nand
与非
nor
或非
xor
异或
xnor
同或
not
逻辑非上述逻辑运算在库ieee的程序包std_logic_1164中定义。
VHDL运算符——关系运算符
= 等于
/= 不等于
< 小于
<= 小于或等于
> 大于
>= 大于或等于
注:其中‘<=’操作符也用于表示信号的赋值操作。上述运算在库ieee的程序包std_logic_arith中定义。VHDL运算符——算术运算符
+ 加
- 减
* 乘
/ 除
** 乘方
mod 求模
rem
求余
abs 求绝对值
在库ieee的程序包std_logic_arith中定义。
VHDL运算符——连接运算符
&
连接符,将两个数据对象或矢量连接成维数更大的矢量,它可给代码书写带来方便。例如:vabc=a&b&c;如果a=‘1’,b=‘0’,c=‘1’,则vabc=“101”。(1)数值类属性:(数组类型的数据对象)数值类属性有‘left,‘right,‘low,‘high,‘length。其中用符号“‘”隔开对象名及其属性。
left表示数组的左边界;
right表示数组的右边界;
low表示数组的下边界;
high表示数组的上边界;
length表示数组的长度。2-4数据对象属性如:SignalA:std_logic_vector(7downto0);SignalB:std_logic_vector(0to3);则这两个信号的属性值分别为:
A’left=7;A’right=0;A’low=0;A’high=7;A’length=8;B’left=0;B’right=3;B’low=0;B’high=3;B’length=4;left表示数组的左边界;
right表示数组的右边界;
low表示数组的下边界;
high表示数组的上边界;
length表示数组的长度。(2)‘event属性:‘event属性,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为Ture,否则为False。利用此属性可决定时钟信号的变化情况,即时钟是否发生。
2-4数据对象属性(2)‘Event属性:例如:时钟边沿表示
signalclk:in
std_logic;
则clk’event
andclk=’1’表示时钟的上升沿。即时钟变化了,且其值为1。
clk’eventandclk=’0’表示时钟的下降沿。即时钟变化了,且其值为0。此外,还可利用两个函数来表示时钟的边沿。 rising_edge(clk)表示时钟的上升沿
falling_edge(clk)表示时钟的下降沿这两个函数分别在库ieee的程序包Std_logic_1164中定义。2-4数据对象属性
并行语句一般处于进程(PROCESS)的外部。所有并行语句都是并行执行的,即与它们出现的先后次序无关。并行语句有三个特点:a.所有语句的执行是并行的;b.每条语句的执行和其所在的位置无关;c.并行语句的输出仅仅依赖于输入,没有其它的限制条件。第三章
并行赋值语句
第三章
并行赋值语句(1)直接赋值语句:<=赋值运算符(2)条件式信号设置语句:When-Else(3)选择式信号设置语句:With-Select-When(4)Process(进程)语句(5)Block(块)语句(6)函数调用语句(后面章节讲)(7)Component(元件)例化语句(8)For-Generate语句Generic的使用(1)直接赋值语句:<=直接赋值语句的格式:Signal_name<=expression;如:SignalA,B:std_logic_vector(7downto0);A<=”0000000”;B<=”1000000”;我们也可以这样赋值:A<=(others=>’0’);结果信号A的每一位的值都为0。B<=(‘1’,others=>’0’);信号对象的位数很多时,采用others来赋值很方便。<=示例libraryieee;useieee.std_logic_1164.all;Entitytest1IsPort(a,b:instd_logic;c,d:outstd_logic);endtest1;architecturetest1_bodyoftest1isbegin
同时执行d<=aorb;
c<=aandb;endtest1_body;输出仅仅依赖于输入,没有其它的限制条件。
每条语句的执行和其所在的位置无关。
ABCD(2)When-Else条件式信号设置语句它的语法格式为:[label:]Signal_name<=expression1Whenlogic_expression1Else{expression2Whenlogic_expression2Else}expressionn;
例如:f<=’1’whenx1=x2else‘0’;When-Else语句示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2isBeginz<='1'when(x='0'andy='1')else'1'when(x='1'andy='0')else'0';Enda;ZXY(3)With-Select-When选择式信号设置语句[label:]WithexpressionSelectSignal_name<=expressionWhenconstant_value{,{expressionWhenconstant_value};With-Select-When示例Libraryieee;Useieee.std_logic_1164.all;Entityxor2isPort(x,y:instd_logic;z:outstd_logic);Endxor2;Architectureaofxor2issignaltmp:std_logic_vector(1downto0);Begintmp<=x&y;Withtmp
Selectz<=‘1’when“01”,--注意结束为“,”不是“;”'1'when"10",'0'whenothers;Enda;ZXYWhen-else和With-select-When语句的区别
(1)With-select-When语句中When后的constant_value必须是互不相同的;(2)而When-else语句中When后的logic_expression则不需要这样的严格条件;(3)When-else语句中When后的logic_expression的优先权次序为由先到后排列。优先编码器示例Libraryieee;Useieee.std_logic_1164.all;EntitypriorityisPort(r1,r2,r3:instd_logic;f:outstd_logic_vector(1downto0));Endpriority;ArchitectureaofpriorityisBeginf<=‘01'when(r1='1')else'10'when(r2='1')else'11'when(r3='1')else'00';Enda;Ifr1=’1’,f=”01”;Ifr2=’1’andr1/=’1’,f=”10”;Ifr3=’1’andr1/=’1’andr2/=’1’,
f=”11”;如果三个输入都为0,f=”00”。r1r3r2f(4)Process语句(1)一个结构体当中可以有多个Process语句,Process语句是同时执行的并行语句。(2)Process内的语句却是顺序执行的顺序语句。(3)多进程之间的信息通过信号对象来传递。Process语句的格式为:[Processlabel:]Process[(Sensitivitylist)][Variabledeclarations]Begin顺序语句;EndProcess[Processlabel];
(4)Process语句
敏感表(Sensitivitylist)包括进程的一些信号,当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。对于上述电路,我们同样可以采用Process语句来进行描述。Process语句示例architecturem2ofexam1isSignaltmp:std_logic;beginprocessbegintmp<=aandb;endprocess;d<=tmp;processbegine<=tmp
orc;endprocess;endm2;ABDCE(5)Block(块)语句
当我们设计一个比较复杂的电路时,为了使设计简单化,可以将其分为几个部分分别进行设计,每个部分设计完成后,再将其组合成我们需要的电路。这种方法称为模块化设计方法。这样,使得整个设计工作更加容易实现,同时程序代码的维护性、纠错性都能得到提高。采用模块化设计时,当设计一个模块时,我们就要用到Block语句。
语法格式:BlockLabel:Block[数据对象定义部分]Begin<BlockStatementPart>EndBlock;(5)Block(块)语句
libraryieee;useieee.std_logic_1164.all;entityexam1isport(a,b,c:instd_logic;d,e:outstd_logic);endexam1;architecturem1ofexam1isbeginBlock_1:BlockBegind<=aandb;endblock;Block_2:BlockBegine<=(aandb)orc;endblock;endm1;ABDCEBlock语句示例Component(元件)例化语句
(1)Block语句可以使VHDL程序更加模块化、功能化。但这样的做法要求在同一程序中,若是重复使用时,必须重写一次。Block语句解决了这样的重复编写问题。(2)元件也是完整的VHDL设计,作为底层设计,通过元件声明,使之可在其他模块中被调用。(3)元件声明可放在程序包中,也可在某个设计的结构体中声明。
语法格式:Component元件名Port(端口定义);--同元件实现时的实体的port部分EndComponent;元件例化指元件的调用,它的语法格式为:Label:
元件名
PortMap(端口映射);Component(元件)例化语句
元件例化时端口映射或关联有两种方式:a.位置对应方式直接由输入信号和元件信号的对应位置进行映射。即:元件标号:元件名
PortMap(信号A1,信号B1,…);b.名字直接对应我们使用=>映射符号进行输入信号和元件信号之间的映射,那么位置可以不对应。即:
元件标号:元件名
PortMap(元件信号A=>信号A1,元件信号B=>信号B1,…);
注意!元件标号是必需的。Component例化语句
Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityfulladderisPort(Ci:instd_logic;a,b:instd_logic;s:outstd_logic;Co:outstd_logic);Endfulladder;Architecturem1offulladderisSignaltmp:std_logic_vector(1downto0);Begintmp<=('0'&a)+b+ci;s<=tmp(0);co<=tmp(1);Endm1;一位全加器
CibasCoLibraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisPort(Cin:instd_logic;x,y:instd_logic_vector(3downto0);sum:outstd_logic_vector(3downto0);Cout:outstd_logic);Endadder;四位加法器ArchitectureaofadderisSignalc:std_logic_vector(0to4);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);endcomponent;Beginc(0)<=cin;U1:fulladderPortmap(c(0),x(0),y(0),sum(0),c(1));--U1:fulladderPortmap(ci=>c(0),a=>x(0),b=>y(0),s=>sum(0),co=>c(1));U2:fulladderPortmap(c(1),x(1),y(1),sum(1),c(2));U3:fulladderPortmap(c(2),x(2),y(2),sum(2),c(3));U4:fulladderPortmap(c(3),x(3),y(3),sum(3),c(4));Cout<=c(4);Enda;Component例化示例
For-Generate语句For-Generate语句用于生成一组信号赋值或元件例化语句。语法格式:generate_label:
--必须的forindex_variableInrangegenerate
statement;[statement;]endgenerate;则上面的四位加法器可以这样来实现:其它相同,上面四条赋值语句可以这样来代替:Generate_label:ForiIn0to3GenerateBitadder:fulladder
Portmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;For-Generate语句Generic语句
通过引入一个参数n使得我们设计的加法器更加具有通用性,参数n代表加法器中相加的位数,在VHDL中,这样的参数称为Generic(类属)。
通常定义在实体描述和元件声明中。
定义格式:Generic(参数名:数据类型[:=表达式]);例如:Generic(m:integer:=7);Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntityadderisGeneric(n:integer:=4);Port(Cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);Cout:outstd_logic);Endadder;Generic语句示例—N位全加器ArchitectureaofadderisSignalc:std_logic_vector(0ton);ComponentfulladderPort(ci,a,b:instd_logic;s,co:outstd_logic);Endcomponent;Beginc(0)<=cin;Generate_label:ForiIn0ton-1GenerateBitadder:fulladderPortmap(c(i),x(i),y(i),sum(i),c(i+1));Endgenerate;Cout<=c(n);Enda;Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitynadderisPort(Cin1:instd_logic;x1,y1:instd_logic_vector(7downto0);Sum1:outstd_logic_vector(7downto0);Cout1:outstd_logic);Endnadder;带Generic的元件例化—N位全加器ArchitectureaofnadderisComponentadderGeneric(n:integer);--也可在此进行影射Generic(n:integer:=8);Port(cin:instd_logic;x,y:instd_logic_vector(n-1downto0);sum:outstd_logic_vector(n-1downto0);cout:outstd_logic);endcomponent;BeginNadder:adderGenericmap(n=>8)Portmap(cin1,x1,y1,sum1,cout1);Enda;
--若元件声明时已经赋值,则Nadder:adderPortmap(cin1,x1,y1,sum1,cout1);Genericmap(8)
(1)顺序语句每一条语句的执行都是顺序进行的。如同高级编程语言中的命令执行方式,一次一条命令,按书写顺序由上而下执行。(2)顺序语句只能出现在进程和子程序内部。(3)由于顺序语句的次序很重要,因此,顺序语句要与并行语句分割开,这可以通过Process语句来实现。Process语句出现在结构体中,它将其内部的语句进行封装。第四章顺序赋值语句
顺序语句有三个特点:
a.所有语句的执行是顺序进行的;
b.每条语句的执行和其所在的位置有关;
c.顺序语句的输出不仅依赖于输入,而且还受位置的影响。第四章顺序语句(1)Process语句
(2)If-Else语句
(3)Case-When语句
(4)Null语句
(5)For-Loop语句
(6)Waituntil语句
(7)变量赋值语句
(8)Procedure(过程)调用语句
(1)Process语句Process内的顺序语句可以是:[Process-label:]Process[(Sensitivitylist)][Variabledeclarations]--变量声明Begin[waituntilstatement][variableassignmentstatements][ifstatements][casestatements][Procedure调用语句
]EndProcess;(2)If-Else语句Ifexpression1Then
statement1;[statement;][Elsif
expression2Then
statement2;{statement;}Else
statement3;[statement;]]Endif;语法格式:If-Else语句示例例如:IfSel=“01”thenf<=x1;elsif
Sel=“10”thenf<=x2;elsef<=x3;Endif;“IF”语句可嵌套使用,即在一个IF语句中可再调用另一个“IF”语句。注意!必需在Process语句中。
(3)Case-When语句CaseexpressionIsWhenconstant-value1=>
statement1;{statement;}Whenconstant_value2=>
statement2;{statement;]Whenothers=>
statement3;{statement;}Endcase;语法格式:Case-When语句示例CaseSelIsWhen“00”=>f<=x1;When“01”=>f<=x2;When“10”=>f<=x3;Whenothers=>f<=x4;endcase;
以上是四路信号选择器。
(4)Null语句
一般类似Case-when的语句,通常会全部列出每个可能出现的选择信号值,这样后面必须配合有命令语句。不过实际上有些情况,是不做任何处理的,这时就可以将Null语句用上。如:
Casesiswhen2|3|4=>--s=2ors=3ors=4P<=d0;when7=>P<=d1;whenothers=>
null;Endcase;(5)For-Loop语句For-Loop为循环语句,可以使其所包含的顺序语句被循环执行,它类似于并行语句中For-generate生成语句。语法格式为:[loop_label:]Forvariable_nameInrangeLoopStatement;{Statement;}EndLoop;Libraryieee;Useieee.std_logic_1164.all;Entitylpisgeneric(n:integer:=8);Port(din:instd_logic_vector(1ton);Count:outintegerrange0ton);Endlp;Architecturem1oflpisBeginprocess(din)variabletmp:integerrange0ton;begintmp:=0;forjin1tonloopifdin(j)='1'thentmp:=tmp+1;endif;endloop;count<=tmp;endprocess;endm1;统计一个多位信号中1的个数
(6)Waituntil语句
语法格式:Waituntil条件式;Libraryieee;Useieee.std_logic_1164.all;EntitywtisPort(clk,D:instd_logic;Q:outstd_logic);Endwt;Architecturem1ofwtisbeginprocessbeginwaituntilclk='1';Q<=D;endprocess;endm1;Architecturem2ofwtisbeginprocess(clk)beginifclk'eventandclk='1'thenQ<=D;endif;endprocess;endm2;(7)变量赋值语句
由于变量赋值是立即起作用的,所以在进程中变量赋值是顺序语句。例如:Processvariablea,b:integer;begina:=30;b:=40;a:=b;b:=a;endprocess;由于变量的赋值是顺序进行的,所以运行结果是a=b=40。
(8)Procedure调用语句
语法格式:Procedure过程名(输入输出参数表)IS[变量定义语句;]Begin顺序语句;End过程名;
Libraryieee;Useieee.std_logic_1164.all;EntitypdisPort(D1:instd_logic;D2:instd_logic;Do:outstd_logic);Endpd;Architectureaofpdisbeginprocessprocedureand2(a,b:instd_logic;y:outstd_logic)isbeginy:=aandb;endand2;variabletmp:std_logic;beginlabel0:and2(a=>d1,b=>d2,y=>tmp);do<=tmp;endprocess;Enda;二位与的过程
第五章
组合逻辑电路的设计
任一时刻的输出仅仅取决于当时的输入,与电路原来的状态无关,这样的数字电路叫做组合逻辑电路。
5-1常用组合逻辑电路设计
(1)编码器(2)译码器(3)比较器(4)数据选择器(5)三态输出电路
(1)编码器A6A7A5A4A3A2A1A0Y2Y1Y08×3编码器ENA7A6A5A4A3A2A1A0Y2Y1Y00000000100000000010001000001000100000100001100010000100001000001010100000011010000000111libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginProcess(En,A)BeginIfEn='1'thenifA="00000001"thenY<="000";elsifA="00000010"thenY<="001";elsifA="00000100"thenY<="010";elsifA="00001000"thenY<="011";elsifA="00010000"thenY<="100";elsifA="00100000"thenY<="101";elsifA="01000000"thenY<="110";elseY<="111";endif;ElseY<="000";endif;endprocess;endm1;libraryieee;useieee.std_logic_1164.all;entitybmqisport(A:instd_logic_vector(7downto0);En:instd_logic;Y:outstd_logic_vector(2downto0));endbmq;architecturem1ofbmqissignalsel:std_logic_vector(8downto0);beginsel<=En&A;withselselectY<="000"when"100000001","001"when"100000010","010"when"100000100","011"when"100001000","100"when"100010000","101"when"100100000","110"when"101000000","111"when"110000000","000"whenothers;endm1;(2)译码器3×8译码器A6A7A5A4A3A2A1A0Y2Y1Y0ENa.3×8译码器libraryieee;useieee.std_logic_1164.all;entityymqisport(Y:instd_logic_vector(2downto0);EN:instd_logic;A:outstd_logic_vector(7downto0));endymq;architecturem1ofymqissignalsel:std_logic_vector(3downto0);beginsel<=En&Y;withselselectA<="00000001"when"1000","00000010"when"1001","00000100"when"1010","00001000"when"1011","00010000"when"1100","00100000"when"1101","01000000"when"1110","10000000"when"1111","11111111"whenothers;endm1;下面的程序设计为:四位二进制->BCD码,然后将BCD码->七段显示器码。(1)当输入为0~9的数时,其十位数为0,个位数=输入。当输入为10~15的数时,其十位数为1,个位数=输入-10。(2)然后将十位和个位的BCD码转换为七段显示器码。
(2)译码器b.码制转换
注:数码管为共阴极数码管。Libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;EntitybcdisPort(A:instd_logic_vector(3downto0);bcd0,bcd1:outstd_logic_vector(3downto0);seven0,seven1:outstd_logic_vector(6downto0));Endbcd;Architectureaofbcdissignaltmp:std_logic_vector(3downto0);Beginprocess(A)--二进制转换为十进制beginifA<10thenbcd1<="0000";bcd0<=A;seven1<=“0111111”;--十位数显示0tmp<=A;elsebcd1<="0001";bcd0<=A-10;seven1<=“0000110”;--十位数显示1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 33543.2-2017海洋能术语 第2部分:调查和评价》(2026年)深度解析
- 深度解析(2026)《GBT 33486-2017船舶与海上技术 大型游艇 FRP艇结构防火》(2026年)深度解析
- 医疗数据安全成熟度评估:区块链驱动的患者授权机制
- 医疗数据安全意识提升:区块链实践
- 医疗数据安全合规性风险管控机制
- 【9历第三次月考】安徽省六安市金安区六安皋城中学2025-2026学年九年级上学期12月月考历史试题
- 医疗数据安全分级模型与区块链实现
- 西安市庆安初级中学2026届高三数学第一学期期末质量跟踪监视模拟试题含解析
- 2026届黑龙江省哈尔滨第九中学生物高二上期末综合测试模拟试题含解析
- 2026届山东德州市高二数学第一学期期末联考试题含解析
- 矿区尾矿库生态环境综合治理与修复项目修复验收和后期管理方案
- 北师大四年级数学上册《总复习》课件
- 家庭农场的商业计划书(6篇)
- 高处安全作业培训
- 2023-2024学年北京市通州区数学九年级第一学期期末综合测试试题含解析
- 泌尿外科降低持续膀胱冲洗患者膀胱痉挛的发生率根本原因分析柏拉图鱼骨图对策拟定
- 图形创意应用课件
- 浙江省中医医疗技术感染预防与控制标准操作规程
- 胸痛中心联合例会与质控分析会-ACS患者如何更好的管理时间
- 建筑风景速写课件
- 高强度螺栓连接施拧记录
评论
0/150
提交评论