Menu Close

RISC-V 总线和流水线(1)总线简介

1. 总线简介

 

相关参考文章:

RISC-V教学教案

 

在计算机体系结构中,总线(最初来自拉丁词omnibus)是一种通信系统,可在计算机内部组件之间或计算机之间传输数据。早期的总线主要是连接内存和外设的线束。

早在1981年,IBM公司就开发了ISA总线。ISA全称为Industry Standard Architecture,为8比特或是16比特宽的并行总线,速度最高可达16 MB/s。乍一面世,ISA总线就被广泛使用,直到1993年满足更高传输速度的Intel公司发明的总线,PCI面世。

PCI(Peripheral Component Interconnect)总线的最高传输速度为533 MB/s,总线位宽也被扩展到32比特/64比特,更适合当时处理器的爆炸式发展速度。并且PCI总线支持即插即用,和ISA总线添加新设备时需要复杂的配置参数(IRQ线,I/O地址和DMA等)相比,PCI总线使用起来更方便。

PCI总线之后AGP(Accelerated Graphics Port)总线作为满足3D显卡的后继也逐渐崭露头角。而在之后的发展时期,PCI又通过后继者PCI-X和PCI-express,进一步提高速度和扩展了性能。当今,PCI-express是最广泛用来连接显卡,硬盘驱动等的总线。除此之外,还有许多现代总线在不同的应用场合发挥着必不可少的重要作用。

总线的发展可以大致分为3代:

  1. 初代总线都有一个致命的缺点:总线上的所有设备必须以相同的时钟主频运行,因此快速的CPU可能因为需要迁就慢速的外设而降低速度通信。
  2. 发展的总线可以将CPU和内存之间的通信,外设之间的通信分开控制(总线控制器是南桥芯片的前身)。这就可以使得CPU在不影响总线的情况下提高速度。
  3. 之后的总线允许以支持内存和视频卡所需的非常高的速度运行,同时在与较慢的外设通信时还支持较低的速度。进一步将慢速和快速的设备切割开来。CPU和内存之间的控制是北桥芯片的前身。CPU和北桥之间连接的总线被称为前端总线(Front Side Bus,FSB)。

现代总线根据计算机传输的信息类型,可划分为数据总线,地址总线和控制总线,分别用于传输数据,地址和控制信号。

总线分类有很多种:

  • 从计算机的角度来看,根据总线的主要角色,内部或外部连接设备可以分为内部总线外部总线。 SPI和I2C是内部总线,而Firewire(IEEE 1394)和GPIB(IEEE-488)是外部总线。
  • 分类也可以基于数据传输形式,总线可以是串行或并行的。并行总线在多条线上并行承载数据字,而串行总线以位串行形式传输数据。例如,PCIE和USB是串行总线,而ISA和Wishbone是并行的。
  • 通过总线是否有单独时钟线可以分为同步总线异步总线。同步总线一般有单独的时钟线,异步总线的时钟信号由数据信号的边沿提取。比如SPI和I2C就是同步总线,UART和CAN为异步总线。

使用总线可以标准化输入和输出的数据格式,使CPU与外围设备,外围设备和外围设备之间的数据通信不依赖于其自身的数据格式。 由于外围设备的种类繁多,因此外围设备的数据格式必须采用相同的标准。 只要计算机使用USB协议并与相应的软件配合使用,当计算机访问打印机,麦克风,键盘等多个外围设备时,外围设备就可以工作,而无需设计各种与计算机连接的接口。 这样,消除了不同设计接口连接的复杂性,并且计算机和外围设备的设计得以分离和简化。

 

2.不同通信接口举例

RAM,FIFO,FLASH等都是FPGA的内部逻辑,但是它们具有不同的模块和通信接口。 以下是RAM和FIFO的接口模块。

//RAM模块

//单端口RAM,也可以设置为双端口RAM

TSP_RAM     your_instance_name 
(
  .clka   (clka),       // 输入 clka
  .wea    (wea),        // 输入 [0 : 0] wea
  .addra  (addra),      // 输入 [11 : 0] addra
                        // 第二次实例化RAM的时候,可能就需要不同长度的地址
  .dina   (dina),       // 输入 [31 : 0] dina
  .douta  (douta),      // 输出 [31 : 0] douta
);

 

//FIFO 模块

fifo_generator     your_instance_name (
  .clk    (clk),      // 输入 clk
  .srst   (srst),     // 输入 srst, reset

  .din    (din),      // 输入 [7 : 0] din
  .wr_en  (wr_en),    // 输入 wr_en

  .rd_en  (rd_en),    // 输入 rd_en
  .dout   (dout),     // 输出 [7 : 0] dout

                      // FIFO 满/空
  .full   (full),     // 输出 FIFO满
  .empty  (empty)     // 输出 FIFO空
);

 

CPU需要同时连接RAM和FIFO,但显然它们具有不同的数据长度和不同的地址格式。 如果CPU不需要为每个外围设备设计特定的接口,则可以节省大量时间来设计CPU本身。 RISC-V CPU加载和存储的模块示例:

i_D_PC,          // 外围设备地址 (比如 FIFO, RAM)
i_LOAD,          // 加载指令

i_load_instr,    // {rv32i_lbu,rv32i_lb,rv32i_lhu,rv32i_lh,rv32i_lw};

o_rd_wen,        // 读写使能
i_rd_idx,        // 寄存器索引,用于回写
o_wb_data,       // 回写数据

i_STORE,         // 储存指令
i_store_instr,   // {rv32i_sb,rv32i_sh,rv32i_sw};

i_rs2_val,       // 实际储存在外围设备的值

 

可以看出,CPU接口与外围设备也有所不同。 同时,外围设备始终在发展。 如果没有总线,即使CPU在最初设计时也考虑了所有外围设备,随着外围设备的扩展,最终还是会产生问题。

 

3.使用总线的优点

假设CPU和外围设备之间没有总线,那么一些问题需要解决:

  • 将CPU译码出来的指令信息转换为RAM接口所需的信号。同时也将CPU译码出来的指令信息转换为FIFO接口所需的信号。
  • 时钟不匹配。 外围设备可能是超低速设备,也可能是可以在多个时钟周期内获取数据的设备(例如DDR需要数十个时钟才能读取或写入一次数据)。
  • RISC-V CPU设计者必须逐个处理不同的外围设备。这样,CPU core设计者和外围IP设计者必须协同合作。很多项目是由多个开发者或多个公司完成,这增加了很多沟通成本。

解决方法就是使用总线,优点如下:

  • 使用相同的标准,无需关心外围设备接口。
  • 无需担心CPU与外围设备之间的时钟不匹配,即使外围设备是多时钟周期的低速设备。
  • CPU设计者专注于CPU core的设计。 外围设备开发者关注外围设备的相关开发。 每个人都遵守总线规范,即可轻松实现互连。
  • 总线可以扩展和互连。 例如,可以将FII RISC-V总线扩展为AHB,而不会破坏当前的总线结构,并且可以直接使用以前由AHB连接的IP内核。
  • 这对外围设备的裁剪也非常有帮助。不需要更改CPU,只需更新地址,即可定制芯片。
Posted in FPGA, RISC-V, RISC-V, RISC-V IPcore设计, RISC-V 教案, 应用开发, 开发板, 教材与教案, 文章

发表评论

相关链接