论坛风格切换切换到宽版
发帖 回复
返回列表  提醒:不能用迅雷等P2P下载,否则下载失败标(二级)的板块,需二级才能下载,没二级不要购买,下载不了
  • 681阅读
  • 6回复

[技术文章]FPGA笔记:VHDL语言总结 [复制链接]

上一主题 下一主题
离线feng123456
 

性别:
人妖
发帖
72
金币
31
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看楼主 倒序阅读 使用道具 0楼 发表于: 2021-03-25
ZzSJm+&'  
一、 VHDL是什么? T749@!v`z  
1. 缩写 axt6u)4%7:  
VHDL:Very High Speed Integrated Circuit Hardware Description Language ?d,acm  
0`zm>fh}  
2. 作用 #nt<j2}m  
传统的数字系统设计分为硬件设计、软件设计,VHDL打破了传统的软、硬件设计界限 \["1N-q b  
类似C、C++代替汇编等语言一样,VHDL代替了原理、逻辑状态图 DRS;lJ2  
电子系统设计者和EDA工具之间的桥梁 ZfF`kD\  
EDA工具及 HDL的流行,促使电子系统向集成化、大规模和高速度等方向发展 &ij^FAM  
3. VHDL与原理图描述的比较 jFK9?cLT  
VHDL具有较强的抽象描述能力,可进行系统行为级别的描述。描述更简洁,效率更高; n$A(6]z5O  
原理图描述必须给出完整的、具体的电路结构图,不能进行描象描述。描述繁杂,效率低; (*c`<|)  
VHDL描述与实现工艺无关; p2M?pV  
原理图描述与实现工艺有关 c'm-XL_La  
4. VHDL语言特点 +U c&%Px  
VHDL具有强大的语言结构,系统硬件抽象描述能力强、设计效率高; AF07KA#  
VHDL语言可读性强,易于修改和发现错误; 9'1;-^U1  
VHDL具有丰富的仿真语句和库函数,可进行早期行为仿真,利于大系统的设计与验证; VbY>l' rY  
VHDL设计与硬件电路关系不大; qugPs(uQ  
VHDL设计不依赖于器件,与工艺无关 ]ys4  
移植性好; BBZ)H6TzL  
VHDL体系符合TOP-DOWN和CE设计思想; w2RESpi  
VHDL设计效率高,产品上市时间快,成本低; =[O<.'aG-  
易于ASIC实现 yBD.Cs@  
5. 与其他语言比较 QB oZCLv  
常用硬件描述语言有VHDL、Verilog和ABEL语言。VHDL起源于美国国防部的VHSIC,Verilog起源于集成电路的设计,ABEL则来源于可编程逻辑器件的设计。VHDL语言是一种高级描述语言,适用于行为级和RTL级的描述,最适于描述电路的行为;Verilog语言和ABEL语言是一种较低级的描述语言,适用于RTL级和门电路级的描述,最适于描述门级电路。 < '+R%6  
pU\xzLD  
二、VHDL程序架构 P,+ 0   
VHDL基本结构 V9);kD  
实体(Entity) P+D|_3j  
结构体(Architecture) \5v=pDd4g  
配置(Configuration) ^y;OHo  
库(Library)、程序包(Package) )PanJHtU  
5Rt0h$_J  
1. 实体 Entity Uzm[e%/`  
作用:定义系统的输入输出接口 Jh/M}%@|  
用法格式: Vtc)/OH  
ENTITY <entity_name> IS cC(ubUR  
     Generic Declarations Q?I"J$]&L  
     Port Declarations hBs>2u|z9  
END <entity_name>; (1076-1987 version) 1&>nL`E[3  
END ENTITY <entity_name> ; (1076-1993 version) Iu)(Huv  
1 {?kKpMNNn  
2 WhVmycdv  
3 R*c0NJF  
4 M<|~MR  
5 lpX p )r+  
Generic:确定实体或组件中定义的局部常数。模块化设计时多用于不同层次模块之间信息的传递,可从外部改变内部电路和规模,必须放在端口说明之前 `U?H^,FVA  
Generic ( |4 d{X@`&  
            常数名称:类型 [:= 缺省值]  *<h  
           {常数名称:类型 [:= 缺省值]} V.G9J!?<P  
          ); uk>/I l  
1 Aj)< 8  
2 2+G:04eS,e  
3 IQ27FV|3  
4 BIB>U W  
使用: (J) Rs`_  
\]d*h]Hms  
entity and2 is R4J>M@-0v  
         generic(risewidth: time:= 1 ns;fallwidth: time:= 1 ns);  PtVNG  
         port(a1: in std_logic;a0: in std_logic;z0: out std_loigc); w[$Wpae  
end entity and2; ztxQv5=:,  
1 PezWc18  
2 G5eLs  
3 0m| Gp  
4 "x)pp  
端口声明:确定输入输出端口的数目和类型 j~0ZE -e  
    Port ( m3v* ,~  
                端口名称{,端口名称}:端口模式   数据类型; )9sr,3w  
                      … \gW\Sa ^  
                端口名称{,端口名称}:端口模式   数据类型 S:GUR6g8D  
          ); &Bdt+OQ ;  
1 '[ddE!ta  
2 SO jDtZ  
3 !`S%l1[Z  
4 V{^fH6;[  
5 $vicHuX!  
eg: mWFZg.#?  
i:Ct6[  
port(a1: in std_logic; a0: in std_logic; z0: out std_loigc); ~!+h"%'t  
1 |&pz,"(  
补充 \?ws0Ax  
1.端口模式的分类: mUY:S |  
in 输入型,此端口为只读型。 rM?Dp2  
out 输出型,此端口只能在实体内部对其赋值 nQYS{`hk  
inout 输入输出型,既可读也可赋值 71 m-W#zyA  
buffer 缓冲型,与 out 相似,但可读 }oxaB9r  
{q>4:lsS  
2.buffer、inout对比: OL9C #er  
inout,输入输出双向端口,可读可写 t 6IaRD  
buffer,为缓冲端口,可读可写,但要读入数据时,只允许内部回读内部产生的输出信号,即反馈 F'_8pD7  
buffer,驱动只有一个源,不允许多重驱动,驱动源可以是其它实体的缓冲端口,也可以是设计实体的内部信号源,但不与其它实体的输出端口、双向端口相连 c(=O`%B{  
buffer,仅仅是一个数据缓存器,不能用于IO输出 gkn/E}K#  
8gKR<X.G  
3.数据类型: jW0z|jr  
指端口上流动数据的表达格式,为预先定义好的数据类型,如:bit、bit_vector、integer、real、std_logic、std_logic_vector 等 |JQP7z6j]  
<"Cwy0V kp  
2.结构体 Architecture 3jdB8a]T_  
作用: nR'EuI~(}  
定义系统(或模块)的行为、元件及内部的连接关系,即描述其逻辑功能。 GSb)|mj  
组成部分: 4qXUk:C@m  
-. 说明部分:对数据类型、常数、信号、子程序、元件等元素的说明 xla^A}{  
-. 逻辑功能描述部分:以各种不同的描述风格描述系统的逻辑功能。常见的有行为描述/数据流描述以及结构化描述 !?M_%fNE  
一个设计实体可有多个结构体,代表实体的多种实现方式。各个结构体的地位相同 O]LuL&=s y  
k{w^MOHNg  
3. 语法: Leick 6  
HNyDWD)_  
architecture  结构体名称  of   实体名称  is A,[m=9V  
      [说明语句]内部信号、常数、 12DdUPOi  
                         数据类型、子程序(函数、过程)、 !eoec2h#5  
                         元件等的说明; 5GxM?%\  
begin dw}3B8]  
       [并行处理(功能描述)语句]; d<m>H$\Dm  
end  [architecture] 结构体名称; s(9rBDoY(8  
1 @Lv_\^2/}  
2 +VCo=oA  
3 $i] M6<Vxn  
4 M<m64{m1  
5 d7zE8)DU7  
6 tf79Gb>  
7 C$;s+ALy[  
注:同一实体的结构体不能同名。定义语句中的常数、信号不能与实体中的端口同名。 ?vNS!rY2&  
Y6DiISl  
使用方式: |MrH@v7S  
@Iatlz*W  
entity test1 is H)fo4N4ii  
    port(sig,count:in bit; b!P;xLcb  
            out1,out2:out bit); &t:MWb;  
end test1; HON[{Oq  
SLB iQd.  
architecture Behavioral of test1 is Vta;ibdeqW  
    signal sig:bit; s'=]a-l~  
    constant const:bit:='1'; >c>ar>4xF  
begin Q>*K/%KD  
     ,$[lOFs  
end Behavioral; ne*aC_)bT  
1 x G"p .  
2 % 7:  
3 XArLL5_L  
4 yYtki  
5 !_#js  
6 nu -wQr  
7 DcDGrRuh  
8 7U0):11X#  
9 =S +:qk  
10 #!@ ]%4  
11 ~WLsqP5Y~a  
eg: lV="IP^7  
hlEvL  
architecture art2 of nand is NtL?cWct  
begin (o=iX,@'2  
      c<=‘1’ when (a=‘0’) and (b=‘0’) else 3=I Q  
            ‘1’ when (a=‘0’) and (b=‘1’) else Q+N @j]'  
            ‘1’ when (a=‘1’) and (b=‘0’) else |@|D''u>6  
            ‘0’ when (a=‘1’) and (b=‘1’) else K_.x(Z(;4  
            ‘0’; IrM3Uh  
end architecture art2; T^SOq:m&  
KWMH|sxO=  
1 5%/%i}e~(  
2 ~vS.Dr  
3 (U<wKk"  
4 t|_g O!w8  
5 !4fL|0  
6 }c:0cl  
7 |.yRo_  
8 h2K  
9 c6.|; 4  
4.库 Libraty 程序包 Package s5@^g8(+C  
程序包定义: #+ =afJ  
已定义的常数、数据类型、元件(调用)说明、子程序的一个集合。 ~Q\[b%>J  
GM~jR-FZ  
库定义:多个程序包构成库 Pr'py  
KDk^)zv%!  
两者目的:方便公共信息、资源的访问和共享 5j %jhby?  
程序包的结构包括:程序包说明(包首)和程序包主体(包体) c-{]H8$v  
W X9BS$}0  
程序包说明 K;O\Pd  
l-rI|0D#  
语法: g}7%3D  
package 程序包名 is aqgSr|  
{包说明项} .v'8G)6g  
end 程序包名; Z_/03K$q  
Ns{4BM6j  
包说明项: R lu;l  
use 语句(用来包括其它程序包) u)ItML  
类型说明、子类型说明、常量说明; lU3wIB  
信号说明、子程序说明、元件说明 n&lLC&dL  
(程序包体仅用于子程序的描述,只有在程序包中要说明子程序时,程序包体才是必须的 /);6 j,x  
J<D =\  
UlR7_   
eg: (;0]V+-  
NaIVKo  
package seven is +=v|kd  
           subtype segments is bit_vector(0 to 6); ;+\;^nS3d  
           type bcd is range 0 to 9; 2*N# %ZUX  
end seven; ]b)(=-;>  
library work; ?IWS  
use work.seven.all; dx#N)?  
entity decoder is 6$Y1[  
     port(input: in bcd; Oi RqqD  
             drive: out segments); G1BVI:A&S  
end decoder; ,wjL3c  
architecture art of decoder is mvnK)R_  
begin b`' ;`*AN+  
with input select ) PtaX|U  
            drive<=B“1111110” when 0, 1JY4E2Q  
                         B“0110000” when 1, 1'iRx,  
                         B“1101101” when 2, IdM ;N  
                         B“1111001” when 3, #&^+hx|  
                         B“0110011” when 4, Wp ]u0w  
                         B“1011011” when 5, 1E(pJu'K  
                         B“1011111” when 6, U]d+iz??b  
                         B“1110000” when 7, b /)UN*~  
                         B“1111111” when 8, /V^S)5r  
                         B“1111011” when 9, tpS F[W  
                         B“0000000” when others; |2 Dlw]d  
end architecture art; /W;;7k  
1 iw%DQ }$  
2 CwAl-o  
3 a^N/N5-Z  
4 G:UdU{  
5 @<P [z[  
6 GIp?}tM  
7 IkupW|}rc  
8 m&2m' =(  
9 {.ph)8  
10 /dO&r'!:  
11 ~0`Pe{^*  
12 HHdc[pJ0D  
13 3Xy>kG}  
14 db`<E <  
15 9P]TIV.  
16 Z@>>ZS1Do  
17 SngV<J>zR  
18 :geXplTx  
19 *op7:o_  
20 cWm.']  
21 YWTo]DJV  
22 E-RbFTVBA  
23 %j'lWwi  
24 L\"$R":3{d  
25 (7"qT^s3  
库: YO=;)RA  
STD库:包含的程序包为standard,定义最基本的数据类型,如bit,bit_vector ,boolean,integer,real,and time,其中的bit为二值系统(只有‘0’、‘1’) :x_l"y"  
IEEE库:定义了四个常用的程序包 8`*(lKiL  
std_logic_1164 (std_logic types & related functions) Vi]D](^!  
std_logic_arith (arithmetic functions) d;f,vN(  
std_logic_signed (signed arithmetic functions) ar{Yq  
std_logic_unsigned (unsigned arithmetic functions) T_r[#j  
SN11J+  
库及程序包的使用: |^FDsJUN  
i cZQv]  
库及程序包的说明应放在实体单元前面 1 %*X,E  
library 库名; library ieee;  X(bb1  
use 库名.程序包名.项目名 use ieee.std_logic_1164.all; H94$Xi"Bd  
use 库名.程序包名.All; use ieee.std_logic_unsigned.conv_integer; 7I HWj<  
uH`ds+Hp  
库及程序包的作用范围:仅限于所说明的设计实体(每一个设计实体都必须有自己完整的库及程序包说明语句) kG%<5QH  
]TGJ|X  
三、VHDL语言要素 }L@YLnc%  
1.四类语言要素: bju0l[;=  
数据对象(Data Object) ]RxNSr0e  
变量(Variable) <F&S   
物理含义: &%^[2^H8"  
暂存某些值的载体,常用于描述算法 jJ9|  
局部量,定义于process、function、procedure |>VHV} 4)<  
具体说明: =uD2j9!"7  
变量说明格式 cZ5[A  T  
variable 变量名:数据类型 约束条件:= 表达式; |GIT{_JE  
如:variable a, b : bit; h$lY,7  
variable count : integer range 0 to 255 := 10; g-6!+>w*>e  
局部量,只能在进程和子程序中定义、使用,其作用范围仅局限于定义变量的进程和子程序中。 7/Ew(X8Fs  
变量的初值可用于仿真,但综合时被忽略 wd u>3Ch"y  
|]Ockg[  
常量(Constant) 7 0KZXgBy_  
物理含义: _oR6^#5#  
电源、地、恒定逻辑值等 GlVq<RG*  
全局量,可定义于上面两种场合 zS.7O'I<'  
常量说明: #E>f.:)  
对某一个常量名赋予一个固定的值 75<E0O  
constant 常数名:数据类型:= 表达式; e;Q~P]x  
constant data: bit_vector(3 downto 0):=“1010” i^j{l_-JE  
constant width: integer: = 8; / Z \zB  
constant x: new_bit: = ‘x’; nQ8EV>j2  
常量数据类型必须与表达式的数据类型一致 0\u_ \%[  
常量是全局量,其作用范围取决于常量被定义的位置。 iPxSVH[  
ARslw*SJ  
信号(Signal) IhUuL0  
物理含义: |IZG `3  
是硬件连接线,端口 ;0 @"1`  
全局量,定义于architecture、package、entitiy K&Zdk (l)  
具体说明: tw^V?4[Miu  
电子硬件系统运行的基本特性 UT"L5{c  
各部分电路工作的并行特性;  Zuwd(q  
信号传输过程中的延时特性; YAsvw\iseK  
多驱动源的总线特性; I9B B<~4o  
时序电路中触发器的记忆特性 hX_;gR&R  
信号是电子系统内部硬件连接和硬件特性的抽象表示: ,v(G2`Z  
signal 信号名:数据类型 约束条件:= 表达式; C!v0*^i  
如:signal s2 : std_logic_vector(15 downto 0); 4ajBMgD]KG  
综合时初值被忽略 0p! [&O  
信号是全局量,可在结构体、实体、块中 说明和使用信号 N/]TZu~k z  
在进程和子程序中只能使用信号,不能说明信号 y=-d*E  
信号与端口的区别:信号本身无方向,可读可写;端口是一种有方向的隐形信号 7M5HIK6_  
c~@I1M  
数据类型(Data Type) J>x)J}:;  
VHDL是一种强数据类型语言 )6Z)z;n]aW  
设计实体中每一个常数、信号、变量、函数以及设定的各种参量都必须事先说明数据类型 350y6pVh  
同类型才能互相传递和作用 B7va#'ne4{  
*F2obpU  
操作数(Operands) LTG/gif[u  
操作对象常量或变量 0A\o8T.12  
3)I v8mA  
操作符(Operator) 1 BVivEG  
分类: 'Zk&AD ~  
dc"Vc 3)  
逻辑操作符(Logical Operator) d7P| x  
6种:and、or、nand、nor、xor、not 7J##IH+z35  
操作数类型必须相同,可为如下类型:bit、bit_vector、std_logic、std_logic_vector、boolean,数组操作数的维数、大小必须相同 .GLotc  
t4 h5R  
关系操作符(Relational Operator) eRC@b^~  
zI(b#eUF  
用于比较相同父类的两个操作数,返回boolean值 #2|sS|0<  
6 种:=、/=、<、<=、>、>= si0jXue~j\  
e$ E=n  
算术操作符(Arithmetic Operator) SC"=M^E  
\Ui8Sgeei  
加操作符“+”、减操作符“-” qky{]qNW  
串联(并置)操作符“&”:通过连接操作数来建立新的数组。操作数可以是一个数组或数组中的一个元素 9 bGN5.5  
D6c4tA^EO  
重载操作符(Overloading Operator) X2T)]`@  
"?n~ /9`  
仅有一个操作数的操作符,包括:“+”、“-” DYbkw4Z,  
乘除操作符 O>)8< yi$  
用于整数类型:“*”、“/”、“mod”、“rem” i$"B  
综合的限制:“/ ”、“mod”、“rem” 三种操作符的右操作数必须为 2 的正整数次幂,即 2n。实际电路用移位实现 "P'W@  
A rem B 余数运算符,利用操作数A决定结果的正负号;A mod B 取模运算符,利用操作数B决定结果的正负号 Jc:*X4-'  
VI[ikNpX  
四、VHDL顺序语句 mp%i(Y"vp  
执行顺序与书写顺序一致,与传统软件设计语言的特点相似 4:5CnK  
#Z(8 vA^@  
顺序语句只能用在进程与子程序中 OV Iu&6#  
OT\[qaK  
可描述组合逻辑、时序逻辑 -E?h^J&U  
Z#nj[r!l}  
常用的顺序描述语句: [uW{Ap~2  
赋值语句; if语句;case语句;loop语句; 0 B>{31)  
next语句;exit语句;子程序;return语句; jvCk+n[  
wait语句;null语句 .pr-  ^  
?RA^Y N*9  
注明: Dm"GCV  
Hq< Vk.Nk  
变量赋值和信号赋值 2Cj?k.Zk  
赋值标识符的不同 b:Wl B[5  
变量:= 表达式; N@)tU;U3O  
信号 < = 表达式 % )?$82=2  
硬件实现的功能不同 83Bp_K2\  
信号代表电路单元、功能模块间的互联,代表实际的硬件连线 gNo.&G [  
变量代表电路单元内部的操作,代表暂存的临时数据; r[JgCj+$&  
有效范围的不同 [#$z.BoEo  
信号:全局量,程序包、实体、结构体 ie=tM'fb  
变量:局部量,进程、子程序 b_z;^y~  
赋值行为的不同 >jq~5HN  
信号赋值延迟更新数值 $:t;WXc.<  
变量赋值立即更新数值 V2V^*9(wu@  
信号的多次赋值 Zii<jZ.)<  
一个进程:最后一次赋值有效 |*e >hk  
多个进程:多源驱动,线与、线或、三态 GadQ \>  
五、VHDL并发语句 `$fwLC3j  
Cn[`]  
htq#( M  
常用的并发描述语句有:进程(process)语句、块(block)语句、顺序描述语句的并行版本、并行过程调用语句、元件例化语句、生成语句 Kisd.~u8j  
m("! M~1  
进程(process)语句最具VHDL语言特色。提供了一种用算法描述硬件行为的方法: K9;pX2^z9  
进程与进程,或其它并发语句之间的并发性 ?6; +.h\  
进程内部的顺序性 ]b-Z;Nce  
进程的启动与挂起 a)`b;]+9  
进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。如果有 wait 语句,则不允许有敏感信号表。 &w- QMj M>  
块语句 &zynfj#o  
块语句将一系列并行描述语句进行组合,目的是改善并行语句及其结构的可读性。可使结构体层次鲜明,结构清晰 @c9VCG D  
并行信号赋值语句包括三种 (B}+uI{  
简单并行信号赋值 (sq4  
条件信号赋值 '@3hU|jO!  
选择信号赋值 ?*tb|AL(R  
赋值目标必须是信号,与其它并行语句同时执行,与书写顺序及是否在块语句中无关,每一信号赋值语句等效于一个进程语句,所有输入信号的变化都将启动该语句的执行 Z1wN+Y.CA  
———————————————— "nf.kj:>  
版权声明:本文为CSDN博主「Jeck xu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 4Sfv  
原文链接:https://blog.csdn.net/qq_45396672/article/details/111186803


评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

一般

差劲
离线15221663365

性别:
人妖
发帖
388
金币
27
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 1楼 发表于: 2021-03-25
      


离线sunjq

性别:
帅哥
发帖
2418
金币
3603
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 2楼 发表于: 2021-03-25


在线bidezhi7777

性别:
帅哥
发帖
13253
金币
303
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 3楼 发表于: 2021-03-25
    


离线luchonghui74

性别:
人妖
发帖
4711
金币
3657
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 4楼 发表于: 2021-03-25
谢谢你的分享!


离线zoudzy

性别:
帅哥
发帖
490
金币
487
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 5楼 发表于: 2021-03-25


离线mj8abcd

性别:
帅哥
发帖
10527
金币
4759
提示:会员销售的附件,下载积分 = 版块积分 + 销售积分       只看该作者 6楼 发表于: 2021-03-25
  


快速回复
限150 字节
 
上一个 下一个