PCI总线从设备控制器的设计与实现
龋在设计 中将内存空间定义为1M 大小,1M 地址空间的设备应构造地址寄存器的高12 位为1(使用 32 位基址寄存器),其它位置为0。对于I/O 基地址寄存器为了简便将其配置为与内存基地 址寄存器一样的状态。
基地址检查模块:如果PCI 设备要占用一定的I/O 空间或存储器空间, 就必须实现基址 寄存器, 以便系统设置软件在对系统进行自动设置时, 对其地址译码器进行编程,使设备能 获得所要求的空间,在利用Verilog HDL进行PCI 总线接口设计时, 必须对基址寄存器的每 一位都能正确译码, 这样才能确定PCI 设备是申请I/O 空间, 还是申请存储器空间, 申请 空间的大小及其在系统中占据的位置, 是否可预取等。
在基地址检查模块中首先判断系统是否要求复位,若要求复位则需对存储交易地址的寄 存器(ba0、ba1)清0;反之则说明需要对给定的基地址进行判断,当I/O 基地址寄存器有 效时,将总线上的数据pci_ad[31:4]的值赋给寄存器ba0;同样的当内存基地址寄存器有效 时将pci_ad[31:4]的值赋给寄存器ba1。这时ba0 和ba1 中的值就是系统配置的I/O 和内存 在系统中具体的位置。接下来当设备要选择申请的空间时,通过判断式pci_addr ba0_size的值是否与ba0 或ba1 相等,来判断是否选中I/O 或内存空间。
奇偶生成模块: PCI总线的奇偶校验提供了一种检验数据传输正确与否的机制, 在任何 给定的总线周期内,哪个设备驱动了pci_ad[31::00]线,它就必须驱动PAR线,而且在时间 上要比相应的地址或数据推迟一个时钟周期。奇偶校验主要用来确定主设备是否成功地寻址 到它所希望的从设备,以及数据传输的正确与否。因此,PCI总线进行奇偶校验的检测是必 需的。而奇偶校验生成就是解决以上问题的一个必要的步骤,从而使PCI总线设备控制器能 够为PCI总线提供正确的与奇偶校验有关的信息。
在交易中,从设备驱动数据到pci_dat_out 端口上,并通过par_out 信号向主设备提供 正确的奇偶效验信息。PCI 总线奇偶校验位的产生是采用偶校验,参与奇偶校验的位包括 pci_ad[31::00]及pci_cbe_l[3:0],检验pci_ad[31::00] 及pci_cbe_l[3:0] 上‘1’的 个数是否为偶数。如果为偶数则为par_out 端口赋‘0’,如果为奇数则为par_out 端口赋‘1’, 再将这个值传回主设备,在主设备中与主设备产生的奇偶校验值做比较,这样做的目的是为 保证总线命令的正常执行和数据传输的正确性。如果两个值相等说明寻址及数据的传输是正 确的,如果不相等,则说明寻址或数据的传输过程中发生了问题,此次交易的数据必须重新 传送。而对于那些实际并不传送数据的字节所对应的线,必须被驱动到稳定状态,也要包含 于奇偶计算之中。
有限状态机模块:PCI 总线接口芯片是多功能和时序复杂的时序逻辑电路,它的复杂性 由PCI 总线操作的多样性决定。为了便于利用硬件描述语言进行设计,将这一复杂的时序逻 辑抽象成有限状态机,并利用有限状态机实现复杂的总线操作。存储器读写操作、I/O 读写 操作、配置空间读写操作和中断操作都要通过一种设计合理的有限状态机实现,根据PCI 总 线操作的时序关系给出了一种简捷明了的有限状态机, 实现了存储器的读写、I/O 读写等各 种操作。如图1 所示为有限状态机的状态转移图。
空闲状态(Idle):根据当前命令为配置命令或读写命令而进入配置读写等待状态或存 储器、I/O 读写等待状态、其它情况则继续在空闲状态等待。
配置读写等待(con_wait)状态:系统进入配置读写等待状态后根据pci_irdy_l 的值 判断直接进入配置读写(con)状态,还是继续在配置读写等待(con_wait)状态循环,如 果pci_irdy_l=0,则进入配置读写(con)状态,否则继续在配置读写等待(con_wait)状 态循环。
配置读写(con)状态:在这一状态中将par_oe 设为有效,开始奇偶校验生成;并将 trdy_l 设为有效表示从设备准备好。下来判断pci_irdy_l 信号是否有效,即主设备是否准备好,如果该信号有效则传输配置信息,在下一时钟延到来时转入backoff 状态,准备返回 空闲状态;否则进行等待,直到pci_irdy_l 有效为止。
存储器或I/O 读写等待(rw_wait)状态:在进入这一状态前首先应判断是要进行读操 作还是写操作,下一步控制器要根据基地址译码模块的译码结果决定控制器是对存储器还是 I/O 读写,若译码结果显示存储器或I/O 都未选中,则进入传输中止状态。
存储器或I/O 读写等待2(rw_wait2)状态:进入该状态的同时开始计数,根据read_flag 的值,决定进行读操作还是写操作。
存储器或I/O 读等待(read_wait)状态:在存储器或I/O
- 用双端口RAM实现与PCI总线接口的数据通讯(05-06)
- 基于PCI总线和DSP芯片的图像处理平台的硬件设计(07-06)
- 基于DSP和PCI总线的通用数字信号处理系统(11-13)
- 一种基于PCI总线和DSP技术的虚拟仪器设计(03-16)
- 基于Linux平台的天气雷达高速数据采集系统设计(03-13)
- 基于DSP与PC机的PCI总线高速数据传输 (07-08)