VHDL语言实例.docx

上传人:b****3 文档编号:11116825 上传时间:2023-05-29 格式:DOCX 页数:10 大小:21.77KB
下载 相关 举报
VHDL语言实例.docx_第1页
第1页 / 共10页
VHDL语言实例.docx_第2页
第2页 / 共10页
VHDL语言实例.docx_第3页
第3页 / 共10页
VHDL语言实例.docx_第4页
第4页 / 共10页
VHDL语言实例.docx_第5页
第5页 / 共10页
VHDL语言实例.docx_第6页
第6页 / 共10页
VHDL语言实例.docx_第7页
第7页 / 共10页
VHDL语言实例.docx_第8页
第8页 / 共10页
VHDL语言实例.docx_第9页
第9页 / 共10页
VHDL语言实例.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

VHDL语言实例.docx

《VHDL语言实例.docx》由会员分享,可在线阅读,更多相关《VHDL语言实例.docx(10页珍藏版)》请在冰点文库上搜索。

VHDL语言实例.docx

VHDL语言实例

VHDL语言实例

例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是数据输出

ENTITYselsIS

PORT(d0,d1,d2,d3,d4,d5,d6,d7:

INBIT;

         s:

INTEGERRANGE0TO7;

         out1:

OUTBIT);

ENDsels;

图例2(a)  八选一数据选择器实体

ARCHITECTUREsels_arcOFselsIS

BEGIN

      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;

ENTITYmux8IS

PORT(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;

 PROCESS

ENDreg_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_arcOFalarmIS

BEGIN

 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给出了报警控制逻辑电路图。

返回

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2