您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 第12章 微处理器接口芯片设计实例
1第12章微处理器接口芯片设计实例12.1可编程并行接口芯片设计实例12.2SCI串行接口芯片设计实例12.3键盘接口芯片KBC设计实例2为了便于读者进一步掌握用VHDL语言设计实际数字电路的方法,本章列举了3个较简单的微处理器接口芯片的设计实例。3凡是学习过微型计算机原理的读者都知道,8255是典型的可编程并行接口芯片,它广泛地应用于各种接口电路中。为使设计的程序不过于复杂,这里所设计的芯片仅适用于8255的“0”型工作方式,即基本的输入/输出方式。12.1可编程并行接口芯片设计实例412.1.18255的引脚与内部结构1.外部引脚8255的引脚如图12-1所示。它共有40条引脚,其中:D0~D7——双向数据总线,用来传送数据和控制字。——读信号线,与其它信号线一起实现对8255接口的读操作。——写信号线,与其它信号线一起实现对8255接口的写操作。——片选信号线,当它为低电平(有效)时,才能选中该8255芯片,也才能对8255进行操作。RDWRCS5A0~A1——端口地址选择信号线。8255有4个端口:其中3个为输入/输出口,1个为控制寄存器端口。具体规定如下:A1A0选择端口00A口01B口10C口11通常A0、A1与CPU的地址总线A0和A1相连接。RESET——复位信号输入,高电平有效。复位后,8255的A口、B口、C口均被定义为输入。6PA0~PA7、PB0~PB7、PC0~PC7——3个输入/输出端口的引脚,其输入/输出方向由软件来设定。72.内部结构8255的内部结构框图如图12-2所示。从图12-2中可以看到,左边的信号与CPU总线相连,而右边的信号则与外设相连。A、B、C口的输出均有锁存能力,而输入都没有锁存能力(这一点与原8255芯片略有区别)。为了控制方便,将8255的3个口分成A、B两组。其中,A组包括A口的8条线PA0~PA7和C口的高4位PC4~PC7;B组包括B口的8条线PB0~PB7和C口的低4位PC0~PC3。A组和B组都分别由软件编程来加以控制。8图12-28255的内部结构框图912.1.28255的工作方式及其控制字8255有3种工作方式:方式0、方式1和方式2。前面已经提到,为简化设计这里只设定为方式0。1.8255的方式0在此方式下,A口的8条线、B口的8条线、C口的高4位对应的4条线和C口低4位对应的4条线可分别定义为输入或输出。因为上述4部分的输入或输出是可以互相独立来定义的,故它们的输入/输出组合有16种。另外,在方式0的情况下,C口还具有按位置位和复位的能力,这一点将在后述的控制字中详述。102.控制字8255具有很强大的功能,其不同功能的实现是通过对控制器写不同控制字来实现的。8255有两种控制字:方式控制字和C口位操作控制字。1)方式控制字8255的方式控制字的格式如图12-3所示。方式控制字的标志是控制字的最高位为“1”,即图中的b7位为“1”。如果现在设定A口为输入口,B口为输出口,C口的低4位为输入,C口的高4位为输出,那么控制字的格式应为:控制字的值为91H,那么将该控制字写向控制寄存器,就会使8255处于所设定的工作方式。11图12-38255的方式控制字的格式122) CC口位操作控制字的格式如图12-4所示。该控制字和方式控制字的区别在于:控制字的最高位(b7位)为“0”,用此位作为软开关可将控制字写入不同的控制寄存器。例如,当PC口作为输出口时,用如下控制字:其值为0DH。将此值送控制寄存器地址就可以使PC6置“1”。13图12-4C口位操作控制字的格式1412.1.38255的结构设计由图12-2所示的8255内部结构框图可知,该芯片应由3种逻辑电路构成:锁存器、组合逻辑电路和三态缓冲器。1.锁存器锁存器用于锁存数据。在8255的结构中应定义7个锁存器,它们是:pa_latch——A口输出锁存器,8位;pb_latch——B口输出锁存器,8位;pcl_latch——C口低4位输出锁存器;pch_latch——C口高4位输出锁存器;ctrreg——方式控制字寄存器;15bctrreg——C口位控制字寄存器,4位;ctrregF——选择标志寄存器,1位。当该标志寄存器为“1”时,数据存入方式控制字寄存器;当它为“0”时,数据的低4位存入C口控制字寄存器。162.三态缓冲器在8255芯片中数据线D0~D7和端口PA、PB、PC都可以是双向的。因此,在设计该部分逻辑与外部接口时,必须是三态的,即这些引脚都应为三态双向引脚。173.组合逻辑电路除上述两类电路外,余下的基本上是选择电路或译码电路。1812.1.48255芯片的VHDL语言描述由于该VHDL语言描述的程序模块将在MAX+plusⅡ的工具上进行编译、综合和仿真,因此程序中应采用RTL描述方式。【例12-1】8255芯片的VHDL语言描述程序。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYppiIS19PORT(reset,rd,wr,cs,a0,a1:INSTD_ULOGIC;pa:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);pb:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);pcl:INOUTSTD_LOGIC_VECTOR(3DOWNTO0);pch:INOUTSTD_LOGIC_VECTOR(3DOWNTO0);d:INOUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYppi;ARCHITECTURErtlOFppiISSIGNALinternal_bus_out:STD_LOGIC_VECTOR(7DOWNTO0);20SIGNALinternal_bus_in:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALst,ad,flag:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALctrreg:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALpa_latch,pb_latch,pc_latch:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(rd,cs)ISBEGIN21st=ctrreg(3)&ctrreg(0);IF(cs='0'ANDrd='0')THENIF(a0='0'ANDa1='0'ANDctrreg(4)='1')THENinternal_bus_in=pa;ELSIF(a0='1'ANDa1='0'ANDctrreg(1)='1')THENinternal_bus_in=pb;ELSIF(a0='0'ANDa1='1'ANDst=01)THEN22internal_bus_in(3DOWNTO0)=pcl(3DOWNTO0);ELSIF(a0='0'ANDa1='1'ANDst=10)THENinternal_bus_in(7DOWNTO4)=pch(3DOWNTO0);ELSIF(a0='0'ANDa1='1'ANDst=11ANDctrreg(7)='1')THENinternal_bus_in(3DOWNTO0)=pcl(3DOWNTO0);internal_bus_in(7DOWNTO4)=pch(3DOWNTO0);ENDIF;ELSEinternal_bus_in=ZZZZZZZZ;ENDIF;d=internal_bus_in23ENDPROCESS;PROCESS(cs,wr,reset)ISVARIABLEctrregF:STD_LOGIC;VARIABLEbctrreg_v:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIF(cs='0'ANDwr='0')THENad=a1&a0;ctrregF:=d(7);internal_bus_out=d;ENDIF;24IF(reset='1')THENpa_latch=00000000;pb_latch=00000000;pc_latch=00000000;ctrreg=10011011;bctrreg_v:=0000;ctrregF:='1';ELSIF(wr'EVENTANDwr='1')THENIF(ctrregF='1'ANDad=11ANDcs='0')THENctrreg=internal_bus_out;ELSIF(ctrreg(7)='1'ANDad=00ANDcs='0')THEN25pa_latch=internal_bus_out;26ELSIF(ctrreg(7)='1'ANDad=01ANDcs='0')THENpb_latch=internal_bus_out;ELSIF(ctrreg(7)='1'ANDad=10ANDcs='0')THENpc_latch=internal_bus_out;ELSIF(ctrregF='0'ANDad=11ANDcs='0')THENbctrreg_v:=internal_bus_out(3DOWNTO0);CASEbctrreg_vISWHEN0000=pc_latch(0)='0';WHEN0010=pc_latch(1)='0';WHEN0100=pc_latch(2)='0';WHEN0110=pc_latch(3)='0';27WHEN1000=pc_latch(4)='0';WHEN1010=pc_latch(5)='0';WHEN1100=pc_latch(6)='0';WHEN1110=pc_latch(7)='0';WHEN0001=pc_latch(0)='1';WHEN0011=pc_latch(1)='1';WHEN0101=pc_latch(2)='1';WHEN0111=pc_latch(3)='1';WHEN1001=pc_latch(4)='1';WHEN1011=pc_latch(5)='1';WHEN1101=pc_latch(6)='1';28WHEN1111=pc_latch(7)='1';WHENOTHERS=flag=11;ENDCASE;ENDIF;ENDIF;ENDPROCESS;PROCESS(pa_latch)ISBEGINIF(ctrreg(4)='0')THENpa=pa_latch;ELSE29pa=ZZZZZZZZ;ENDIF;ENDPROCESS;PROCESS(pb_latch)ISBEGINIF(ctrreg(1)='0')THENpb=pb_latch;ELSEpb=ZZZZZZZZ;ENDIF;ENDPROCESS;30PROCESS(pc_latch)ISBEGINIF(ctrreg(0)='0')THENpcl=pc_latch(3DOWNTO0);ELSEpcl=ZZZZ;ENDIF;ENDPROCESS;PROCESS(pc_latch)ISBEGIN31IF(ctrreg(3)='0')THENpch=pc_latch(7DOWNTO4);ELSEpch=ZZZZ;ENDIF;ENDPROCESS;ENDARCHITECTURErtl;本程序清单的前4条说明语句用于所引用的IEEE库。接着8行是8255的实体描述,其中输入/输出引脚与8255定义相同。在这里只是将PC口的8条线分成高4位和低4位而已。由于pa、pb、pc和d都是双向的,因此在这里也定义成双向。328255的构造体由5个进程构成,它们是读进程、写进程和形成pa、pb、pc三态输出的三个进程。下面对构造体中的有关问题作一说明。331.构造体中各信号的定义和说明1)在构造体中定义了两条内部总线internal_bus_in和internal
本文标题:第12章 微处理器接口芯片设计实例
链接地址:https://www.777doc.com/doc-3178385 .html