CPU自制入门1.6 总线的设计与实现_CPU自制入门1.6 总线的设计与实现试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > CPU自制入门 > 1.6 总线的设计与实现

CPU自制入门——1.6 总线的设计与实现

本节介绍总线的设计与实现。总线是将CPU、内存和I/O 相互连接的共享通道。因为总线和本章所有电路都有关连,所以我们先来制作。 1.6.1  总线的设计 本书设计的总线主控为4 通道,总线从属为8 通道。总线的信号线如表1-14 所示。 表1-14 总线信号线 通过总线访问时,需要预先确定总线主控与总线从属之间的通信规则。这种使用信号线的通信规则称为总线协议。本书使用的总线为使用时钟信号同步数据传输的同步总线。图1-77 展示了读取访问时的总线波形。 图1-77 读取访问时的总线波形 [Ⅰ]请求总线使用权 总线主控在获得总线的使用权后方可使用总线。主控发出总线使用权请求信号(req_)请求总线使用权。 [Ⅱ]取得总线使用权 总线仲裁器对总线主控发来的总线使用权请求进行调停,并发出总线使用许可信号(grnt_)。总线主控在接收到总线使用许可信号(grnt_)后,即可开始总线访问。 [Ⅲ]总线访问开始 总线主控输出地址(addr)信号,并发出地址选通(as_)信号。片选信号(cs_)由地址解码器基于地址信号生成。由于是读取访问, 向读/ 写信号(rw)输出读取(READ)信号。读/ 写信号(rw)和地址选通(as_)保持1 个时钟周期, 地址(addr)信号需要保持到总线访问结束。 [Ⅳ]来自总线从属的应答 总线从属同时输出就绪(rdy_)信号与读取的数据(rd_data)。 [Ⅴ]总线访问结束并释放总线使用权 地址(addr)信号输出停止并结束总线访问,总线使用权信号(req_)反相, 释放总线使用权。 图1-78 展示了写入访问时的总线波形。 图1-78 写入访问时的总线波形 [Ⅰ]请求总线使用权 总线主控在获得总线的使用权后方可使用总线。主控发出总线使用权请求信号(req_)请求总线使用权。 [Ⅱ]取得总线使用权 总线仲裁器对总线主控发来的总线使用权请求进行调停,并发出总线使用许可信号(grnt_)。总线主控在接收到总线使用许可信号(grnt_)后,即可开始总线访问。 [Ⅲ]总线访问开始 总线主控输出地址(addr)信号,并发出地址选通(as_)信号。片选信号(cs_)由地址解码器基于地址信号生成。由于是写入访问, 向读/ 写信号(rw)输出写入(WRITE)信号,并同时输出将要写入的数据(wr_data)。读/ 写信号(rw)、写入数据(wr_data)以及地址选通(as_)保持1 个时钟周期,地址(addr) 信号需要保持到总线访问结束。 [Ⅳ]来自总线从属的应答 总线从属输出就绪(rdy_)信号。 [Ⅴ]总线访问结束并释放总线使用权 地址(addr)信号输出停止并结束总线访问,总线使用权信号(req_)设为无效,释放总线使用权。 1.6.2  总线的实现 下面讲述总线的实现。总线是由总线仲裁器、总线主控多路复用器、地址解码器以及总线从属多路复用器组成的,其中总线仲裁器调停总线使用权,总线主控多路复用器选择总线使用权所有者输出信号,地址解码器基于地址生成片选信号,总线从属多路复用器基于地址(片选信号)选择从属输出信号。表1-15 列出了总线模块一览表,图1-79 展示了框图,表1-16 列出了宏一览表。 表1-15 总线模块一览表 图1-79 总线框图 表1-16 宏一览表(bus.h) 图1-79 中,各个总线主控在访问总线时,都需要向总线仲裁器发送请求信号(req_)。总线仲裁器则向被许可访问的总线主控与总线主控多路复用器输出总线使用许可信号(grnt_)。 一旦总线主控被许可使用总线,即可开始总线访问。总线主控多路复用器基于总线许可信号(grnt_),选择被许可访问总线的总线主控信号并输出。总线主控多路复用器输出的信号,输入到所有总线从属和地址解码器中。 地址解码器根据输入的地址(addr)输出片选信号(cs_)。片选信号(cs_)发送到与之对应的总线从属与总线从属多路复用器中。 总线从属多路复用器根据输入的片选信号(cs_),选择被访问的总线从属的输出信号,并发送到总线主控。 总线仲裁器的实现 总线仲裁器对总线使用权进行调停。总线仲裁器接受总线主控发来的总线使用请求,并将使用权赋予合适的总线主控。我们制作的总线仲裁器针对4 个总线主控发来的请求进行调停。总线仲裁器根据目前所有者的状态,按照有限状态机方式进行控制。总线仲裁器有4 个状态,分别是“0 号总线主控持有总线使用权”、“1 号总线主控持有总线使用权”、“2 号总线主控持有总线使用权”,以及“3 号总线主控持有总线使用权”。 针对总线使用权请求的调停,使用轮询(round robin)机制。轮询是一种按照请求顺序进行使用权分配,且平等对待所有总线主控的机制。 0 号总线主控拥有总线使用权时,总线请求优先级顺序为“0 号总线主控>1 号总线主控>2 号总线主控>3 号总线主控”。也就是说,0 号总线主控如果要求继续使用总线, 就会得到许可。 0 号总线主控释放总线,1 号总线主控请求使用总线时,无论2 号和3 号总线主控是否有请求,都会将总线使用权赋予1 号。如果0 号总线主控释放总线,1 号总线主控没有请求使用总线,而2 号总线主控请求使用总线时,则无论3 号总线主控是否有请求,都会将总线使用权赋予2 号。如果0 号总线主控释放总线,1 号与2 号总线主控都没有请求使用总线,而3 号总线主控请求使用总线时,3 号总线主控就会获得总线使用权。最后,如果所有总线主控都没有请求使用总线,则会保持当前状态。 同样,当1 号总线主控持有总线使用权时,优先级顺序为“1 号总线主控>2 号总线主控>3 号总线主控>0 号总线主控”;当2 号总线主控持有总线使用权时,优先级顺序为“2 号总线主控>3 号总线主控>0 号总线主控>1 号总线主控”;当3 号总线主控持有总线使用权时,优先级顺序为“3 号总线主控>0 号总线主控>1 号总线主控>2 号总线主控”。由于每当总线主控变化时总线使用权优先级按环状变化,所有总线主控都会平等获取总线使用权。总线仲裁器的状态转移图如图1-80 所示。 bus_arbiter 的信号线一览如表1-17 所示。总线使用权请求信号称为Bus request,总线使用权许可信号称为Bus grant。代码1-5 是生成Bus grant 信号的部分代码。 图1-80 总线仲裁器的状态转移图 表1-17 信号线一览(bus_arbiter.v) 代码1-5 总线仲裁器的赋予总线使用权部分(bus_arbiter.v) [Ⅰ]赋予总线使用权的初始化 首先初始化,将所有总线主控的总线赋予信号设为无效。 [Ⅱ]赋予总线使用权 基于总线使用权持有者(owner),设置当前总线持有者信号。(1)为0 号总线主控持有总线使用权的情况;(2)为1 号总线主控持有总线使用权的情况;(3) 为2 号总线主控持有总线使用权的情况;(4)为3 号总线主控持有总线使用权的情况。 总线仲裁部分的程序如代码1-6 所示。 代码1-6 总线仲裁器的仲裁部分(bus_arbiter.v) [Ⅰ]异步复位 将总线使用权的持有者复位。复位后0 号总线主控持有总线使用权。 [Ⅱ]0 号总线主控持有总线使用权时的仲裁 (1)处决定下一个获取总线使用权的主控。当前主控为0 号总线主控时,总线使用权分配优先级顺序为“0 号总线主控>1 号总线主控>2 号总线主控>3 号总线主控”。没有总线使用权请求时维持当前状态。 [Ⅲ]1 号总线主控持有总线使用权时的仲裁 (2)处决定下一个获取总线使用权的主控。当前主控为1 号总线主控时,总线使用权分配优先级顺序为“1 号总线主控>2 号总线主控>3 号总线主控>0 号总线主控”。 [Ⅳ]2 号总线主控持有总线使用权时的仲裁 (3)处决定下一个获取总线使用权的主控。当前主控为2 号总线主控时,总线使用权分配优先级顺序为“2 号总线主控>3 号总线主控>0 号总线主控>1 号总线主控”。 [Ⅴ]3 号总线主控持有总线使用权时的仲裁 (4)处决定下一个获取总线使用权的主控。当前主控为3 号总线主控时,总线使用权分配优先级顺序为“3 号总线主控>0 号总线主控>1 号总线主控>2 号总线主控”。 总线主控多路复用器的实现 总线主控多路复用器基于总线仲裁器输出的总线赋予信号,选择总线使用权所有者的信号,并将其输出到总线。bus_master_mux 的信号一览如表1-18 所示,示例程序如代码1-7 所示。 表1-18 信号一览表(bus_master_mux.v) 代码1-7 总线主控多路复用器(bus_master_mux.v) [Ⅰ]选择持有总线使用权的主控 (1)处为当0 号总线主控持有总线使用权时,将0 号总线主控的信号输出到总线;同样地,(2)处为当1 号总线主控持有总线使用权的情况;(3)处为当2 号总线主控持有总线使用权的情况;(4)处为当3 号总线主控持有总线使用权的情况; (5)处设定默认值并输出到总线。 地址解码器的实现 地址解码器基于总线主控输出的地址信号,判断将要访问哪个总线从属,并生成片选信号。访问的地址与总线从属的对应关系称为地址映射(address map)。 因为本书设计的总线连接到8 个总线从属通道,所以单纯地将地址空间8 等分,并分配给0 号总线从属到7 号总线从属。表1-19 列出了地址映射关系。 表1-19 总线的地址映射 bus_addr_dec 的信号一览如表1-20 所示,程序如代码1-8 所示。 表1-20 信号一览表(bus_addr_dec) 代码1-8 地址解码器(bus_addr_dec.v) [Ⅰ]生成总线从属索引 因为需要3 个比特位(2 的3 次方为8)来区分8 个总线从属通道,所以地址的最高3 位用来识别总线从属。并且基于地址(s_addr)的最高3 位生成总线从属索引(s_index)。 [Ⅱ]初始化片选信号 初始化时设置所有片选信号无效。 [Ⅲ]选择总线从属索引对应的从属 对总线从属索引对应的从属发送片选信号。(1)处索引为0 时,对0 号总线从属发送片选信号。同样地,向从属发送片选信号的代码为:1 号总线从属为(2) 处,2 号总线从属为(3)处,3 号总线从属为(4)处,4 号总线从属为(5)处, 5 号总线从属为(6)处,6 号总线从属为(7)处,7 号总线从属为(8)处。 总线从属多路复用器的实现 总线从属多路复用器基于地址解码器输出的片选信号,将被选择的总线从属的输出信号发送到总线。bus_slave_mux 的信号一览如表1-21 所示,程序如代码1-9 所示。 表1-21 信号一览(bus_slave_mux.v) 代码1-9 总线从属多路复用器(bus_slave_mux.v) [Ⅰ]选择片选信号对应的从属 总线从属的选择是通过片选信号实现的。(1)处访问0 号总线从属时,将来自0 号总线从属输出的s0_rd_data 与s0_rdy_ 发送到总线;同样地,(2)处为1 号总线从属的访问;(3)处为2 号总线从属的访问;(4)处为3 号总线从属的访问;(5) 处为4 号总线从属的访问;(6)处为5 号总线从属的访问;(7)处为6 号总线从属的访问;(8)处为7 号总线从属的访问;(9)处为默认值的设定。 总线的顶层模块 最后对总线的顶层模块进行说明。总线的顶层模块是将总线仲裁器、总线主控多路复用器、地址解码器以及总线从属多路复用器4 个模块进行连接的模块。 图1-81 展示了各个模块与信号线的连接图。总线主控独立信号为4 通道,总线从属独立信号为8 通道。为了避免图示变得繁杂,图1-81 中这两个通道以[0..3][0..7] 的方式书写表示。 图1-81 总线顶层模块的连接图 1.6.3  小结 本节对总线的设计与实现进行了说明。这里介绍的是经典的总线结构,经过我们实际动手设计与实现,大家应该已经对总线上数据交换的过程有了更深入的理解。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《CPU自制入门》其他试读目录

• 1.1 序
• 1.2 计算机系统
• 1.3 数字电路基础
• 1.4 Verilog HDL 语言
• 1.5 系统蓝图
• 1.6 总线的设计与实现 [当前]
• 1.7 存储器的设计与实现
• 1.8 AZ Processor 的设计与实现
• 1.9 I/O 的设计与实现
• 1.10 AZPR SoC 整体连接
• 1.11 AZPR SoC 的仿真
• 1.12 本章总结