8237A的寄存器组
4 x$ L' ?9 |! g 8237A内部寄存器可以分成两类。一类是通道寄存器,即每个通道都有的现行地址寄存器、现行字节数寄存器、基地址寄存器和基字节数寄存器,这些都是16位寄存器。另一类是控制和状态寄存器,包括模式寄存器(6位寄存器,4个通道各有一个)、命令寄存器(8位)、状态寄存器(8位)、屏蔽寄存器(4位)、临时寄存器(8位)。这两类寄存器在寻址时由最低4位地址A3~A0区分。
8 `2 b' U6 i+ a
1)现行地址寄存器
$ _+ H9 {+ Y9 \, ^5 r
该寄存器用来寄存DMA传送的当前存储器地址,每次传送后自动加l或减1。CPU可读或写该寄存器。
$ H9 j6 V) p, H+ t6 E3 v: {4 c. L
2)现行字节数寄存器
! N v3 X' Y' n$ o* L
该寄存器保存还要传送的字节数,每次传送后减1。当其值从0减到FFFFH时,TC将产生。该寄存器的值可由CPU写入或读出。
, h; m2 w& I2 Y! s2 b0 P: [) Y
3)基地址寄存器和基字节数寄存器
4 C/ O5 J$ m1 z" g) I
这两个“基”寄存器存放着相对应的“现行”寄存器的初始值。在初始化时,分别与相对应的“现行”寄存器被CPU写入相同的值,但“基”寄存器的值一直保持不变,且不能读出。
" [% z* x0 ^1 p
如果编程为自动初始化,则在每次产生TC后,“基”寄存器的值被用来作为相对应的“现行”寄存器的初始值。
3 N+ f; M4 W& |) o$ q 需要指出,由于字节数寄存器从0减到FFFFH时,DMA传送才终结。所以,实际传送的字节数要比写入字节数寄存器的值多1。因此,如果需要传送N个字节,则编程写入字节数寄存器的值应为N-1。
- _6 E( j) R! v& P; G5 d6 c* w 4)模式寄存器
' o8 O v/ q' B T, C# I: M1 b* \
它寄存相应通道的模式控制字。模式控制字的格式参看图6.35,其中用最低2位选择写入哪个通道的模式寄存器。D4位用来允许或禁止自动初始化。所谓自动初始化,是指每当EOP(上划线)产生时(不论是内部的TC引起还是由外部输入),都用基地址寄存器和基字节数寄存器的内容,使相应的“现行”寄存器恢复为初始值。
) J) y; l: R, d这样就为下一次DMA传送做好了准备。
" [ t3 _$ z+ ?9 W7 _
o' x, |" J$ j1 C5 z& D
8 M# b# l" n7 m) @" Z: H
" N6 e3 l; P$ C5 I( `9 q) r2 x( M0 z7 L' X3 w$ W, O' b! X
! w3 V, b) w" |" a& z4 }) S
5)命令寄存器
1 o }' v, [9 u" _ H v6 l 该寄存器用来寄存CPU写入控制8237A操作的命令字,复位时被清0。命令字的格式如图6.36所示。
' }/ }9 O/ c1 r! |
8 }8 I" V- I8 u' k' k) c$ A
) l* D( J( a" C. q
+ Z) u m9 F7 q* a$ ?
F$ J; ]% t6 t2 `8 T3 s3 ^
9 w' i; i" K6 n6 w% C
D4位用来规定优先权模式。8237A有两种优先权管理模式:固定优先权模式和循环优先权模式。当采用固定优先权模式时,4个通道的优先权是固定的,即通道0优先权最高,通道1次之,通道2再次之,通道3最低。当采用循环优先权模式时,本次循环中最近一次服务的通道在下次循环中优先权变成最低,而原本优先级仅次于它的通道将具有最高优先权,其他通道也依次改变优先权。循环优先权模式可有效避免一个通道独占系统总线而其他通道的DMA请求得不到及时响应的情况。需要指出,不论采用哪一种优先权模式,经判优某个通道获得服务后,其他通道无论优先权高低,均被禁止,直到已服务的通道结束传送为止。
+ j; A. H$ x. ^6 V DO位用来禁止或允许存储器到存储器的传送方式。若选择该方式,则用通道0的现行地址寄存器存放源地址。此时,若D1位也置位,则在整个存储器到存储器的传送过程中始终保持同一源地址,以便实现将一个目的存储区域的所有存储单元都置成同一个值。当D0位为0时,D1位不起作用。
0 ?/ Q" ~" _: L3 S4 I) G$ U- e
在不影响系统性能的情况下,为获得较高的传输效率,8237A能将每次传输时间从正常时序的3个时钟周期变为压缩时序的2个时钟周期。在正常时序时,命令字的D5选择滞后写或扩展写。其不同之处在于写信号是滞后到S4状态有效(滞后写)还是扩展到S3状态有效(扩展写)。
) w: T8 _; r# X2 Z2 }4 {# e; b& j
6)请求寄存器
5 y, A! V$ J8 ^( @6 d2 M
8 ]! c J4 F/ m" F
! b( I T# G3 Z* }; ]8 c. z该寄存器为4位,寄存DMA请求DREQ,每位对应一个通道。DREQ请求可由硬件DREQ线引入,也可由软件发出DREQ请求(仅限于数据块传送时可用)。用软件发DREQ请求需要使用请求字,请求字的格式如图6.37所示。其中D1、D0两位决定写入的通道,D2位决定是请求(置位)还是复位。
5 B }& ]+ G! v! S$ K$ y% U5 ^, l
注意,对于存储器到存储器的传送,必须用软件请求启动通道0。
0 L& @# ^5 R& n% ]# H7 `( O
7)屏蔽寄存器
! t9 Y- k: ?% j 该寄存器用来对某个。DMA通道设置为屏蔽或允许。8237A在复位后,4个通道全被置于屏蔽状态。所以,在编程时必须根据需要复位屏蔽位,以允许相应的通道产生DMA请求。还有一点需注意,当一个通道进行DMA传送后,产生面EOP(上划线)信号,如不是工作在自动初始化方式,则这一通道的屏蔽位被置位,必须再次编程为允许,才能进行下一次DMA传送。
1 e7 U& X8 F$ w4 R2 i6 [) M# ]
对屏蔽寄存器的写人有两种格式:单通道屏蔽字和主屏蔽字,如图6.38所示。单通道屏蔽字一次仅能设置一个通道,而主屏蔽字可同时对4个通道进行设置。
- y3 z5 v9 f" Z$ B; b9 T- W, N {" e( }, k+ m9 t
% b8 O% q6 u c* e- h, U% y" B# ?* O9 H3 e) h& R4 c3 `( d
+ r* j- k9 k: D
. m7 M6 b ?: _ 8)状态寄存器
- f/ k7 x6 J7 v9 R+ s% T( R" a% W
状态寄存器是为CPU能了解8237A的内部状态而设置。它的高