VHDL例程代码.docx
《VHDL例程代码.docx》由会员分享,可在线阅读,更多相关《VHDL例程代码.docx(196页珍藏版)》请在冰豆网上搜索。
VHDL例程代码
【例3-1】2选1多路选择器程序。
(P31)
LIBRARYIEEE;--IEEE库使用说明语句
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux21IS--实体说明部分
PORT(
a,b:
INSTD_LOGIC;
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC
);
ENDENTITYmux21;
ARCHITECTUREmux21aOFmux21IS--结构体说明部分
BEGIN
PROCESS(a,b,s)
BEGIN
IFs='0'THENy<=a;
ELSE
y<=b;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREmux21a;
【例3-2】有类属说明的2输入与非门的实体描述。
(P33)
ENTITYnand2IS
GENERIC(t_rise:
TIME:
=2ns;
t_fall:
TIME:
=1ns)
PORT(a:
INBIT;
b:
INBIT;
s:
OUTBIT);
ENDENTITYnand2;
【例3-3】n输入与非门的实体描述:
(P33)
ENTITYnand_nIS
GENERIC(n:
INTEGER);
PORT(a:
INSTD_LOGIC_VECTOR(n-1DOWNTO0);
s:
OUTSTD_LOGIC);
ENDENTITYnand_n;
例3-4】半加器的完整VHDL描述,其中x、y为加数与被加数,s为和信号,c为进位信号。
(P36)
ENTITYhalf_adderIS
PORT(x,y:
INBIT;
s:
INBIT;
c:
OUTBIT);
ENDENTITYhalf_adder;
ARCHITECTUREdataflowOFhalf_adderIS
BEGIN
s<=xXORy;
c<=xANDy;
ENDARCHITECTUREdataflow;
【例3-5】2选1多路选择器的行为描述程序。
(P37)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux21IS
PORT(
a,b:
INSTD_LOGIC;
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC
);
ENDENTITYmux21;
ARCHITECTUREbehavOFmux21IS
BEGIN
PROCESS(a,b,s)
BEGIN
IFs='0'THENy<=a;
ELSE
y<=b;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREbehav;
【例3-6】2选1多路选择器数据流描述程序。
(P36)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux21IS
PORT(
a,b:
INSTD_LOGIC;
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC
);
ENDENTITYmux21;
ARCHITECTUREdataflowOFmux21IS
BEGIN
y<=(aAND(NOTs))OR(bANDs);
ENDARCHITECTUREdataflow;
【例3-7】2选1多路选择器结构描述程序。
(P37)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYand21IS
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDENTITYand21;
ARCHITECTUREoneOFand21IS
BEGIN
q<=i0ANDi1;
ENDARCHITECTUREone;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor21IS
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDENTITYor21;
ARCHITECTUREoneOFor21IS
BEGIN
q<=i0ORi1;
ENDARCHITECTUREone;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYinv21IS
PORT(i0:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDENTITYinv21;
ARCHITECTUREoneOFinv21IS
BEGIN
q<=(NOTi0);
ENDARCHITECTUREone;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux21IS
PORT(
a,b:
INSTD_LOGIC;
s:
INSTD_LOGIC;
y:
OUTSTD_LOGIC
);
ENDENTITYmux21;
ARCHITECTUREstructOFmux21IS
COMPONENTand21
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTor21
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTinv21
PORT(i0:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALtmp1,tmp2,tmp3:
STD_LOGIC;
BEGIN
u1:
and21PORTMAP(b,s,tmp1);
u2:
inv21PORTMAP(s,tmp2);
u3:
and21PORTMAP(a,tmp2,tmp3);
u4:
or21PORTMAP(tmp1,tmp3,y);
ENDARCHITECTUREstruct;
【例3-8】半加器的混合描述程序。
(P37)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYxor21IS
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDENTITYxor21;
ARCHITECTUREbehavOFxor21IS
BEGIN
q<=i0XORi1;
ENDARCHITECTUREbehav;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYhalf_adderIS
PORT(a,b:
INSTD_LOGIC;
c,s:
OUTSTD_LOGIC);
ENDENTITYhalf_adder;
ARCHITECTUREmixOFhalf_adderIS
COMPONENTxor21IS
PORT(i0,i1:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDCOMPONENT;
BEGIN
c<=aANDb;
u1:
xor21PORTMAP(a,b,s);
ENDARCHITECTUREmix;
【例3-9】打开一个字符文件,读出文件中的内容并关闭文件。
(P51)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYreadfileIS
PORT(cs:
INSTD_LOGIC;
c:
OUTCHARACTER);
ENDENTITYreadfile;
ARCHITECTUREread1OFreadfileIS
BEGIN
PROCESS(cs)
TYPEchar_fileISFILEOFCHARACTER;
FILEcfile:
char_file;
VARIABLEi:
INTEGER:
=0;
BEGIN
IF(cs='1')THEN
FILE_OPEN(cfile,"f:
/leifr/testfile.asc",READ_MODE);
WHILENOTENDFILE(cfile)LOOP
READ(cfile,c);
i:
=i+1;
ENDLOOP;
FILE_CLOSE(cfile);
ELSE
c<='-';
ENDIF;
ENDPROCESS;
ENDARCHITECTUREread1;
【例4-1】WAIT语句示例程序。
(P65)
cwait1:
PROCESS
BEGIN
y<=(aANDb)OR(mXORt);
z<=cNANDd;
WAIT;--无限等待
ENDPROCESScwait1;
【例4-2】WAITFOR语句示例程序。
(65)
cwait2:
PROCESS
BEGIN
y<=(aANDb)OR(mXORt);
z<=cNANDd;
WAITFOR10*(ct1+ct2);--等待由该表达式计算的时间
ENDPROCESScwait2;
【例4-3】WAITON语句示例程序(二选一选择器)。
(P66)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux2_1IS
PORT(data0,data1:
INSTD_LOGIC;
sel:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDmux2_1;
ARCHITECTUREbehavioralOFmux2_1IS
SIGNALtemp1,temp2,temp3:
STD_LOGIC;
BEGIN
cwait3:
PROCESS
BEGIN
temp1<=data0ANDsel;
temp2<=data1AND(NOTsel);
temp3<=temp1ORtemp2;
q<=temp3;
WAITONdata0,data1,q;
ENDPROCESScwait3;
ENDbehavioral;
【例4-4】WAITON语句和PROCESS语句中所使用的敏感信号列表的对比。
(P67)
ARCHITECTUREbehavioralOFmux2_1IS
SIGNALtemp1,temp2,temp3:
STD_LOGIC;
BEGIN
cwait4:
PROCESS(data0,data1,q)
BEGIN
temp1<=data0ANDsel;
temp2<=data1AND(NOTsel);
temp3<=temp1ORtemp2;
q<=temp3;
ENDPROCESScwait4;
ENDbehavioral;
【例4-5】WAITUNTIL语句示例程序。
(P67)
ARCHITECTUREbehavioralOFexample_waituntilIS
SIGNALtemp:
INTEGER;
BEGIN
cwait5:
PROCESS
BEGIN
WAITUNTIL((temp+5)>=20);--该表达式是布尔表达式
ENDPROCESScwait5;
ENDbehavioral;
【例4-6】多条件WAIT语句的示例程序。
(P68)
cwait6:
PROCESS
BEGIN
--多条件WAIT语句
WAITONdata0,data1,qUNTIL((temp+5)>=20)FOR34ns;
ENDPROCESScwait6;
【例4-7】信号代入语句示例程序。
(P68)
ARCHITECTUREbehavioralOFexample_dairuIS
SIGNALa,b,c,d,e,f:
STD_LOGIC;
SIGNALtemp0,temp1,temp2,temp3,temp4,temp5:
STD_LOGIC;
BEGIN
cdairu:
PROCESS
BEGIN
temp0<=aNANDb;--与非
temp1<=cNORd;--或非
temp2<=eXORfAFTER5ns;--异或门延迟
temp3<=(aNANDb)NOR(cNANDd);
temp4<=(cORd)NAND(eORf);
temp5<=aXORbXORcXORdXOReXORf;
ENDPROCESScdairu;
ENDbehavioral;
【例4-8】变量赋值语句示例程序。
(P69)
ARCHITECTUREbehavioralOFexample_fuzhiIS
CONSTANTcvolt:
REAL:
=3.3;--定义常数
CONSTANTccurrent:
REAL:
=4.0;
VARIABLEtemp0,temp1:
REAL;--定义变量
VARIABLEtemp2,temp3:
INTEGERRANGE0TO255:
=10;
VARIABLEtemp4:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEtemp5:
STD_LOGIC;
SIGNALa:
STD_LOGIC;--定义信号
SIGNALb:
REAL;
SIGNALc:
INTEGER;
SIGNALd:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
cfuzhi:
PROCESS
BEGIN
temp0:
=cvolt;--变量直接赋值
temp1:
=(cvolt+1.8)*ccurrent;--变量表达式赋值
temp2:
=c+78;
temp3:
=c/5;--此时c必须是5的倍数
temp4:
=d;
temp5:
=temp4
(2);
ENDPROCESScfuzhi;
ENDbehavioral;
【例4-9】变量赋值和信号量代入的对比示例程序。
(P69)
ARCHITECTUREbehavioralOFexample_duibiIS
SIGNALd0,d1,d2,d3:
STD_LOGIC;--定义信号
SIGNALq0,q1:
STD_LOGIC;
BEGIN
cduibi_1:
PROCESS(d0,d1,d2,d3)
BEGIN
d2<=d0;--信号量代入
q0<=d2ORd3;
d2<=d1;--信号量代入
q1<=d2ORd3;
ENDPROCESScduibi_1;
cduibi_2:
PROCESS(d0,d1,d3)
VARIABLEm2:
STD_LOGIC;
BEGIN
m2:
=d0;--变量赋值
q0<=m2ORd3;
m2:
=d1;--变量赋值
q1<=m2ORd3;
ENDPROCESScduibi_2;
ENDbehavioral;
进程cduibi_1的运行结果:
q0=d1ORd3并且q1=d1ORd3
进程cduibi_2的运行结果:
q0=d0ORd3而q1=d1ORd3
【例4-10】采用单IF语句来描述D触发器的示例程序。
(P71)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcdff1IS
PORT(d:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
q:
OUTSTD_LOGIC;
qnot:
OUTSTD_LOGIC);
ENDcdff1;
ARCHITECTUREdataflowOFcdff1IS
BEGIN
cdff_example:
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN--单IF语句
q<=d;
qnot<=NOTd;
ENDIF;
ENDPROCESScdff_example;
ENDdataflow;
【例4-11】采用二选择的IF语句来描述二选一选择器的示例程序。
(P72)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux2_2IS
PORT(a0,a1:
INBIT;
sel:
INBIT;
q:
OUTBIT);
ENDmux2_2;
ARCHITECTURErtlOFmux2_2IS
BEGIN
cmux2_2:
PROCESS(a0,a1,sel)
BEGIN
IF(sel='1')THEN--二选择的IF语句
q<=a0;
ELSE
q<=a1;
ENDIF;
ENDPROCESScmux2_2;
ENDrtl;
【例4-12】采用多选择的IF语句来描述4选1选择电路的示例程序。
(P73)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux4_1IS
PORT(a0,a1,a2,a3:
INSTD_LOGIC;
sel:
INSTD_LOGIC_VECTOR(1DOWNTO0);
q:
OUTSTD_LOGIC);
ENDmux4_1;
ARCHITECTURErtlOFmux4_1IS
BEGIN
cmux4_1:
PROCESS(a0,a1,a2,a3,sel)
BEGIN
IF(sel="00")THEN--多选择的IF语句
q<=a0;
ELSIF(sel="01")THEN
q<=a1;
ELSIF(sel="10")THEN
q<=a2;
ELSE
q<=a3;
ENDIF;
ENDPROCESScmux4_1;
ENDrtl;
【例4-13】采用IF语句嵌套结构的带复位端的四选一选择器的示例程序。
(P74)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux4_2IS
PORT(cdata:
INSTD_LOGIC_VECTOR(3DOWNTO0);
sel:
INSTD_LOGIC_VECTOR(1DOWNTO0);
creset:
INSTD_LOGIC;
q:
OUTSTD_LOGIC);
ENDmux4_2;
ARCHITECTURErtlOFmux4_2IS
BEGIN
cmux4_2:
PROCESS(cdata,sel,creset)
BEGIN
IF(creset='1')THEN
IF(sel="00")THEN--多选择的IF语句
q<=cdata(0);
ELSIF(sel="01")THEN
q<=cdata
(1);
ELSIF(sel="10")THEN
q<=cdata
(2);
ELSE
q<=cdata(3);
ENDIF;
ELSE
q<='0';
ENDIF;
ENDPROCESScmux4_2;
ENDrtl;
【例4-14】采用CASE语句来描述4选1选择器的示例程序。
(P76)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux4_3IS
PORT(cdata:
INSTD_LOGIC_VECTOR(3DOWNTO0);
sel:
INSTD_LOGIC_VECTOR(1DOWNTO0);
q:
OUTSTD_LOGIC);
ENDmux4_3;
ARCHITECTURErtl_mux4OFmux4_3IS
SIGNALtemp_sel:
INTEGERRANGE0TO3;
BEGIN
cmux4_3:
PROCESS(cdata,sel)
BEGIN
temp_sel<='0';
IF(sel(0)='1')THEN--选择控制信号的译码
temp_sel<=temp_sel+1;
ENDIF;
IF(sel
(1)='1')THEN--选择控制信号的译码
temp_sel<=temp_sel+2;
ENDIF;
--采用CASE语句描述四选一电路的选择控制信号
CASEtemp_selIS--CASE语句的控制表达式是temp_sel
WHEN0=>q<=cdata(0);
WHEN1=>q