计算机组成原理—— 总线系统(十一)

在追求梦想的旅途中,我们常常会遇到崎岖的道路和难以预料的风暴。然而,正是这些挑战塑造了我们的坚韧和毅力,使我们能够超越自我,触及那些看似遥不可及的目标。不要因为一时的困境而气馁,也不要因为他人的质疑而动摇自己的信念。你的价值不由外界定义,而是由你内心深处对理想的执着所决定。

想象一下,站在高山之巅俯瞰世界的感觉,那是经过无数次攀登、滑倒再站起后才能体会到的壮丽景象。每一次的努力都是向着这个目标迈进的一小步,无论多么微小的进步,都是通向成功的宝贵积累。即使前路漫漫,即使希望渺茫,心中的火焰也不应熄灭,因为它代表着你的热情、你的决心以及你对未来无限的可能。

记住,在这漫长的旅途中,最重要的是过程而非结果。享受每一个学习的机会,珍惜每一段成长的经历,让它们成为你心中最宝贵的财富。即使最终没有达到预期的目标,但只要你在过程中尽力了、奋斗了,那么你就已经赢得了属于自己的胜利。

因此,请继续怀揣着梦想,勇敢地向前迈进。用你的行动证明给世界看,你可以超越一切限制,实现心中所愿。因为在你的心中,蕴藏着改变世界的无限力量,只要你愿意挖掘并释放它,没有什么是不可能的。未来正等待着你去书写,而你是那个唯一能够创造属于自己辉煌篇章的人。

计算机组成原理资源网

https://www.wenjingketang.com/这里面有ppt课后习题及答案,需要的可以自行下载

目录

[7.2 总线接口](#7.2 总线接口)

[7.2.1 信息传送方式](#7.2.1 信息传送方式)

同步传输

异步传输

半同步传输

[7.2.2 总线接口的基本概念](#7.2.2 总线接口的基本概念)

功能模块详解

[7.3 总线仲裁](#7.3 总线仲裁)

[7.3.1 集中式仲裁](#7.3.1 集中式仲裁)

[链式查询(Daisy Chaining)](#链式查询(Daisy Chaining))

计数器定时查询

[独立请求(Independent Request)](#独立请求(Independent Request))

[7.3.2 分布式仲裁](#7.3.2 分布式仲裁)

CAN总线仲裁机制

CSMA/CD协议

案例分析与扩展

[PCI Express总线](#PCI Express总线)

HyperTransport总线

总结


7.2 总线接口

7.2.1 信息传送方式
同步传输

技术细节

同步传输依赖全局时钟信号(如CPU主时钟)协调所有操作。每个时钟周期完成固定操作,如地址发送、数据读写等。时序要求严格,所有设备必须同步。

时序图示例

plaintext

复制代码
时钟周期: | 1 | 2 | 3 | 4 |  
地址线:  | A | A | B | B |  
数据线:  | D | D | X | X |  
控制线:  | Write | Read | Idle | Idle |  

Verilog代码实现

verilog

复制代码
module sync_transfer (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out,
  input write_en
);
  reg [7:0] buffer;

  always @(posedge clk) begin
    if (write_en) begin
      buffer <= data_in;  // 写入数据
      data_out <= 8'bz;    // 输出高阻态
    end else begin
      data_out <= buffer;  // 读取数据
    end
  end
endmodule

案例:SDRAM控制器

SDRAM通过同步接口与CPU交互,时钟频率为133MHz。每个时钟周期完成一次突发传输(Burst Transfer),连续传输4/8/16个数据。


异步传输

技术细节

异步传输使用握手协议(Req/Ack)协调设备。无全局时钟,设备根据自身速度调整时序。

时序图示例

plaintext

复制代码
Req:  __/‾‾‾\____  
Ack:  ____/‾‾‾\__  
数据有效区间: 在Req和Ack同时有效时  

C代码模拟握手协议

c

复制代码
void async_transfer(uint8_t* data) {
  // 发送方
  set_req_high();
  while (!check_ack());  // 等待接收方应答
  send_data(data);
  set_req_low();
  while (check_ack());   // 等待接收方释放Ack

  // 接收方
  if (req_is_high()) {
    read_data(data);
    set_ack_high();
    while (req_is_high()); // 等待发送方释放Req
    set_ack_low();
  }
}

案例:RS-232串口通信

波特率9600bps,起始位1位,数据位8位,停止位1位。通过UART控制器实现异步数据传输。


半同步传输

技术细节

在同步传输基础上添加等待信号(Wait),允许从设备延长时钟周期。

时序图示例

plaintext

复制代码
时钟:   | 1 | 2 | 3 | 4 |  
Wait:    | __/‾‾‾\________ |  
数据线: | X | D | D | X |  

VHDL代码实现

vhdl

复制代码
process(clk)
begin
  if rising_edge(clk) then
    if wait_signal = '0' then
      data_out <= internal_buffer;
    else
      -- 保持当前状态
    end if;
  end if;
end process;

案例:PCI总线

PCI总线支持半同步传输,从设备通过DEVSEL#信号声明响应,TRDY#信号控制数据传输节奏。


7.2.2 总线接口的基本概念
功能模块详解
  1. 地址译码器

    • 实现方式:基于比较器或可编程逻辑阵列(PLA)。

    • 示例:

      verilog

      复制代码
      module address_decoder (
        input [15:0] addr,
        output reg select_device1,
        output reg select_device2
      );
        always @(*) begin
          select_device1 = (addr[15:12] == 4'b0001);
          select_device2 = (addr[15:12] == 4'b0010);
        end
      endmodule
  2. 数据缓冲器

    • 类型:单向缓冲(如74LS244)、双向缓冲(如74LS245)。

    • FIFO实现:循环队列管理读写指针。

      c

      复制代码
      #define FIFO_SIZE 16
      uint8_t buffer[FIFO_SIZE];
      int head = 0, tail = 0;
      
      void fifo_write(uint8_t data) {
        buffer[head] = data;
        head = (head + 1) % FIFO_SIZE;
      }
  3. 错误检测算法

    • CRC-32计算(以太网标准):

      python

      复制代码
      def crc32(data):
        crc = 0xFFFFFFFF
        poly = 0xEDB88320
        for byte in data:
          crc ^= byte
          for _ in range(8):
            crc = (crc >> 1) ^ poly if (crc & 1) else crc >> 1
        return crc ^ 0xFFFFFFFF

7.3 总线仲裁

7.3.1 集中式仲裁
链式查询(Daisy Chaining)

电路设计

plaintext

复制代码
仲裁器 → Grant → Device1 → Grant → Device2 → ... → DeviceN
每个设备的Grant输入连接到前一个设备的Grant输出。

优先级问题

  • 固定优先级:Device1 > Device2 > ... > DeviceN

  • 故障影响:若Device3损坏,后续设备无法获得授权。

Verilog实现

verilog

复制代码
module daisy_chain_arbiter (
  input clk,
  input [3:0] req,
  output reg [3:0] grant
);
  always @(posedge clk) begin
    grant[0] = req[0];
    grant[1] = req[1] & ~grant[0];
    grant[2] = req[2] & ~grant[1];
    grant[3] = req[3] & ~grant[2];
  end
endmodule

计数器定时查询

算法流程

  1. 仲裁器维护一个计数器(0到N-1循环)。

  2. 收到请求后,从当前计数值开始扫描设备。

  3. 第一个遇到请求的设备获得授权。

动态优先级示例

c

复制代码
int current_device = 0;

int arbitrate(int requests[]) {
  for (int i = 0; i < MAX_DEVICES; i++) {
    int device = (current_device + i) % MAX_DEVICES;
    if (requests[device]) {
      current_device = (device + 1) % MAX_DEVICES;
      return device;
    }
  }
  return -1; // 无请求
}

独立请求(Independent Request)

硬件设计

每个设备有独立的Req和Grant线,仲裁器使用优先级编码器。

优先级编码器示例(4设备)

verilog

复制代码
module priority_encoder (
  input [3:0] req,
  output reg [1:0] grant
);
  always @(*) begin
    casex(req)
      4'b1xxx: grant = 2'b00; // Device0优先级最高
      4'b01xx: grant = 2'b01;
      4'b001x: grant = 2'b10;
      4'b0001: grant = 2'b11;
      default: grant = 2'b00;
    endcase
  end
endmodule

7.3.2 分布式仲裁
CAN总线仲裁机制

非破坏性逐位仲裁

  • 每个节点发送ID的同时监听总线。

  • 若发现更高优先级ID(二进制0),则退出发送。

ID比较逻辑

c

复制代码
// CAN标准ID为11位
#define ID_MASK 0x7FF

void can_arbitrate(uint16_t my_id) {
  transmit_id(my_id);
  for (int i = 10; i >= 0; i--) {
    bool bit = (my_id >> i) & 1;
    bool bus_bit = read_bus_bit();
    if (bit != bus_bit) {
      if (bus_bit == 0) {
        // 检测到更高优先级ID,停止发送
        enter_listen_mode();
        return;
      }
    }
  }
  // 仲裁胜利,继续发送数据
  transmit_data();
}

CSMA/CD协议

冲突检测与退避算法

  1. 发送前监听总线(Carrier Sense)。

  2. 检测到冲突后发送Jam信号。

  3. 退避时间计算:二进制指数退避(0 ~ 2^k -1时隙,k为冲突次数)。

退避算法代码

python

复制代码
import random

collision_count = 0

def backoff_time():
    max_slots = 2 ** min(collision_count, 10) - 1
    return random.randint(0, max_slots) * slot_time

案例分析与扩展

PCI Express总线

分层协议架构

  • 事务层:处理TLP(Transaction Layer Packet)。

  • 数据链路层:错误检测与重传(Ack/Nak机制)。

  • 物理层:差分信号传输,支持多通道绑定。

TLP包格式

字段 长度(字节) 说明
Header 12或16 包含路由、操作类型等
Payload 0-4096 传输数据
ECRC 4 端到端CRC校验

HyperTransport总线

点对点传输

  • 双向链路上行与下行分离。

  • 基于包的路由:直接内存访问(DMA)和中断传递。

  • 带宽计算:

    带宽=频率×位宽×2(双工)带宽=频率×位宽×2(双工)

    例如:1.6GHz × 16位 × 2 = 6.4GB/s。


总结

总线技术是计算机系统的核心,其设计需平衡速度、可靠性和复杂度。现代系统倾向于使用高速串行总线(如PCIe)和分布式仲裁(如以太网),而嵌入式领域仍依赖CAN等实时性协议。理解总线接口与仲裁机制,是优化系统性能的关键。

相关推荐
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
鱼7332 天前
计算机的性能指标(2)--运算速度指标
计算机组成原理
Justice Young2 天前
计算机组成原理【期末冲刺版】
计算机组成原理
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd