VHDL语言实例之欧阳治创编.docx
《VHDL语言实例之欧阳治创编.docx》由会员分享,可在线阅读,更多相关《VHDL语言实例之欧阳治创编.docx(7页珍藏版)》请在冰豆网上搜索。
VHDL语言实例之欧阳治创编
VHDL语言实例
时间2021.03.10
创作:
欧阳治
例1:
设计一七段显示译码器,用它来驱动七段发光管LED显示十六进制数字0到9和字母A到F。
LED显示数码管为共阳极。
LIBRARYieee; USEieee.std_logic_1164.all;
ENTITYHEX2LEDIS PORT( HEX:
INstd_logic_vector(3DOWNTO0); LED:
OUTstd_logic_vector(6TO0) ); ENDHEX2LED;
图例1七段显示译码器实体
ARCHITECTUREHEX2LED_arcOFHEX2LEDIS BEGIN
--HEX-TO-SEVEN-SEGMENTDECODER --SEGMENTENCODING --0 ------ --5||1 ------<--6 --4||2 ------ --3
WITHHEXSELECT
LED<="1111001"when"0001", "0100100"when"0010", "0110000"when"0011", "0011001"when"0100", "0010010"when"0101", "0000010"when"0110", "1111000"when"0111", "0000000"when"1000", "0010000"when"1001", "0001000"when"1010", "0000011"when"1011", "1000110"when"1100", "0100001"when"1101", "0000110"when"1110", "0001110"when"1111", "1000000"whenothers;
ENDHEX2LED_arc;
例2:
设计一个八选一数据选择器
1)s是通道选择信号, d0,d1,d2,d3,d4,d5,d6,d7数据输入 out1是数据输出
ENTITYselsISPORT(d0,d1,d2,d3,d4,d5,d6,d7:
INBIT; s:
INTEGERRANGE0TO7; out1:
OUTBIT);ENDsels;
图例2(a) 八选一数据选择器实体
ARCHITECTUREsels_arcOFselsISBEGIN WITHsSELECT out1<=d0WHEN0, d1WHEN1, d2WHEN2, d3WHEN3, d4WHEN4, d5WHEN5, d6WHEN6, d7WHEN7;ENDsels_arc;
2)A,B,C是通道选择信号, I0,I1,I2,I3,I4,I5,I6,I7数据输入 Q是数据输出
LIBRARYieee;USEieee.std_logic_1164.all;
ENTITYmux8ISPORT(I0,I1,I2,I3,I4,I5,I6,I7,A,B,C:
INstd_logic; Q:
OUTstd_logic);ENDmux8;
图例2(b) 八选一数据选择器实体
ARCHITECTUREmux8_arcOFmux8IS SIGNALsel:
INTEGER;BEGIN Q<=I0AFTER10nsWHENsel=0ELSE I1AFTER10nsWHENsel=1ELSE I2AFTER10nsWHENsel=2ELSE I3AFTER10nsWHENsel=3ELSE I4AFTER10nsWHENsel=4ELSE I5AFTER10nsWHENsel=5ELSE I6AFTER10nsWHENsel=6ELSE I7AFTER10ns;
sel<=0WHENA=‘0’ANDB=‘0’ANDC=‘0’ELSE 1WHENA=‘1’ANDB=‘0’ANDC=‘0’ELSE 2WHENA=‘0’ANDB=‘1’ANDC=‘0’ELSE 3WHENA=‘1’ANDB=‘1’ANDC=‘0’ELSE 4WHENA=‘0’ANDB=‘0’ANDC=‘1’ELSE 5WHENA=‘1’ANDB=‘0’ANDC=‘1’ELSE 6WHENA=‘0’ANDB=‘0’ANDC=‘1’ELSE 7;
ENDmux8_arc;
例3:
设计一D触发器
d是输入端,clk是时钟信号控制端,q是触发器的输出端。
其程序如下:
LIBRARYieee;USEieee.std_logic_1164.all;
ENTITYregIS PORT(d,clk:
INBIT; q:
OUTBIT);ENDreg;
图例3D触发器实体
ARCHITECTUREreg_arcOFregIS BEGIN PROCESS BEGIN WAITUNTILclk=‘1’; q<=d; ENDPROCESS; PROCESSENDreg_arc;
例4:
设计一基本RS触发器
r、s为触发器的输入信号,q、not_q为触发器的输出信号。
LIBRARYieee;USEieee.std_logic_1164.all;
ENTITYRSFFIS PORT(r,s:
INBIT; q,not_q:
OUTBIT);ENDRSFF;
图例4基本RS触发器实体
ARCHITECTURERSFF_arcOFRSFFIS BEGIN PROCESS(r,s) VARIABLElast_state:
BIT:
=‘0’; BEGIN ASSERTNOT(r=‘1’ANDs=‘1’) REPORT“BothrANDsequalto‘1’” SEVERITYerror; IFr=‘0’ANDs=‘0’THEN last_state:
=last_state; ELSIFr=‘1’ANDs=‘0’THEN last_state:
=‘0’; ELSE--r=‘0’ANDs=‘1’ last_state:
=‘1’; ENDIF; q<=last_stateAFTER10ns; not_q<=NOT(last_state)AFTER20ns; ENDPROCESS;ENDRSFF_arc;
当r和s同时等于1时,触发器处于不定状态。
程序设计中设置了断言语句是为了判断r和s都等于1时,输出终端将显示报告“BothrANDsequalto‘1’”,同时终止模拟过程,并显示错误的严重error,以便设计者调试和修正模块程序。
从IF到ENDIF是条件语句,用到了可选项ELSIF和ELSE来判别RS触发器的其它三种情况。
IF语句后面是一赋值语句,将IF语句中赋值的中间变量lsat_state经10ns后送到q端。
图8-12是RS触发器的逻辑电路图。
例5:
设计一个带有异步清零、同步置数、使能控制的四位二进制计数器
LIBRARYieee;USEieee.std_logic_1164.all;
ENTITYCOUNT2IS PORT(A:
ININTEGERRANGE0TO3; CLK:
INSTD_LOGIC; CLR:
INSTD_LOGIC; EN:
INSTD_LOGIC; LD:
INSTD_LOGIC; Cout:
OUTINTEGERRANGE0TO3 );ENDCOUNT2;
图例5 四位二进制计数器实体
ARCHITECTURECOUNT2_arcOFCOUNT2IS SIGNAL SIG:
INTEGERRANGE0TO3;BEGIN PROCESS(CLK,CLR) BEGIN IFCLR='0'THEN SIG<=0; ELSIF(CLK'EVENTANDCLK='1')THEN IFLD='1'THEN SIG<=A; ELSE IFEN='1'THEN SIG<=SIG+1; ELSE SIG<=SIG; ENDIF; ENDIF; ENDIF; ENDPROCESS; Cout<=SIG;ENDCOUNT2_arc
例6:
设计一个存储容量为28×8的RAM。
CS为RAM的片选信号,WR为RAM的写信号,RD为RAM读信号,ADR:
八位地址信号,Din:
八位数据输入线,Dout为八位数据输出线。
libraryIEEE;useIEEE.std_logic_1164.all;useieee.std_logic_unsigned.all;
entityRAMis port(WR:
inSTD_LOGIC; RD:
inSTD_LOGIC; ADR:
inSTD_LOGIC_VECTOR(7downto0); CS:
inSTD_LOGIC; Din:
inSTD_LOGIC_VECTOR(7downto0); Dout:
outSTD_LOGIC_VECTOR(7downto0) );endRAM;
图例6 RAM实体
architectureRAM_archofRAMis subtypewordisstd_logic_vector(7downto0); typememoryisarray(0to15)ofword; signaladr_in:
integerrange0to15; signalsram:
memory; begin adr_in<=conv_integer(ADR); process(wr)begin if(wr'eventandwr='1')then if(cs='1'andwr='1')then sram(adr_in)<=dinafter2ns; endif; endif; endprocess; process(rd,cs)begin if(rd='0'andcs='1')then dout<=sram(adr_in)after3ns; else dout<="ZZZZZZZZ"after4ns; endif; endprocess;endRAM_arch;
例7:
利用枚举类型设计一个状态机,用灯的颜色代表相应的状态名。
libraryIEEE;useIEEE.std_logic_1164.all;
ENTITYtraffic_lightIS PORT(sensor,clock:
instd_logic; red_light,green_light,yellow_light:
outstd_logic );endtraffic_light;
architectureabcoftraffic_lightis typet_stateis(red,green,yellow); signalpresent_state,next_state:
t_state;begin process(present_state,sensor) begin casepresent_stateis whengreen=> next_state<=yellow; red_light<='0'; green_light<='1'; yellow_light<='0'; whenred=> red_light<='1'; green_light<='0'; yellow_light<='0'; if(sensor='1')then next_state<=green; else next_state<=red; endif; whenyellow=> red_light<='0'; green_light<='0'; yellow_light<='1'; next_state<=red; endcase; endprocess; process begin waituntilclock'eventandclock='1'; present_state<=next_state; endprocess;endabc;
该状态机由两个进程描述,第一计算下一个状态逻辑,第二个锁存下一个状态到当前状态。
例8:
用VHDL设计一家用告警系统的控制逻辑,告警系统有来自传感器的三个输入信号smoke、door、water和准备传输到告警设备的三个输出触发信号fire_alarm、burg_alarm、water_alarm以及使能信号en和alarm_en。
VHDL程序描述如下:
LIBRARYieee;USEieee.std_logic_1164.all;
ENTITYalarmIS PORT(smoke,door,water:
INstd_logic; en,alarm_en:
INstd_logic; fire_alarm,burg_alarm:
OUTstd_logic; water_alarm:
OUTstd_logic);ENDalarm;
图例8 家用告警系统的控制逻辑电路图
ARCHITECTUREalarm_arcOFalarmISBEGIN PROCESS(smoke,door,water,en,alarm_en) BEGIN IF((smoke=‘1’)AND(en=‘0’))THEN fire_alarm<=‘1’; ELSE fire_alarm<=‘0’; ENDIF; IF((door=‘1’)AND((en=‘0’)AND(alarm_en=‘0’)))THEN burg_alarm<=‘1’; ELSE burg_alarm<=‘0’; ENDIF; IF((water=‘1’)AND(en=‘0’))THEN water_alarm<=‘1’; ELSE water_alarm<=‘0’; ENDIF; ENDPROCESS;ENDalarm_arc;
程序中用了三个分开的IF语句描述其功能,它们都没有ELSIF关键字,可以看出每个IF语句描述了一个输出端口。
第一个IF语句是检测有没有烟雾报警情况,有烟雾火警灾情发生立即产生报警信号,触发fire_alarm。
第二和第三IF语句检测不同的报警信号,和第一句相仿。
此模块的输入端口有两个使能信号,en使所有的输入都能到达输出,而用alarm_en端口,只对防盗告警系统使能。
需要指出的是这种功能很容易用逻辑方程描述,如前面的并行行为程序的例子。
但是有时IF语句的形式是更可读、更容易理解。
图8-11给出了报警控制逻辑电路图。
返回
时间2021.03.10
创作:
欧阳治