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

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

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

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

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

计算机组成原理资源网

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

目录

7.2 总线接口

7.2.1 信息传送方式

同步传输

异步传输

半同步传输

7.2.2 总线接口的基本概念

功能模块详解

7.3 总线仲裁

7.3.1 集中式仲裁

链式查询(Daisy Chaining)

计数器定时查询

独立请求(Independent Request)

7.3.2 分布式仲裁

CAN总线仲裁机制

CSMA/CD协议

案例分析与扩展

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) beginif (write_en) beginbuffer <= data_in;  // 写入数据data_out <= 8'bz;    // 输出高阻态end else begindata_out <= buffer;  // 读取数据endend
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()); // 等待发送方释放Reqset_ack_low();}
}

案例:RS-232串口通信
波特率9600bps,起始位1位,数据位8位,停止位1位。通过UART控制器实现异步数据传输。


半同步传输

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

时序图示例

plaintext

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

VHDL代码实现

vhdl

process(clk)
beginif rising_edge(clk) thenif wait_signal = '0' thendata_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 @(*) beginselect_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 = 0xFFFFFFFFpoly = 0xEDB88320for byte in data:crc ^= bytefor _ in range(8):crc = (crc >> 1) ^ poly if (crc & 1) else crc >> 1return 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) begingrant[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 @(*) begincasex(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;endcaseend
endmodule

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

非破坏性逐位仲裁

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

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

ID比较逻辑

c

// CAN标准ID为11位
#define ID_MASK 0x7FFvoid 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 randomcollision_count = 0def backoff_time():max_slots = 2 ** min(collision_count, 10) - 1return random.randint(0, max_slots) * slot_time

案例分析与扩展

PCI Express总线

分层协议架构

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

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

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

TLP包格式

字段长度(字节)说明
Header12或16包含路由、操作类型等
Payload0-4096传输数据
ECRC4端到端CRC校验

HyperTransport总线

点对点传输

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

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

  • 带宽计算:

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

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


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式技术

一、为什么需要分布式技术&#xff1f; 1. 科学技术的发展推动下 应用和系统架构的变迁&#xff1a;单机单一架构迈向多机分布式架构 2. 数据大爆炸&#xff0c;海量数据处理场景面临问题 二、分布式系统概述 三、分布式、集群 四、负载均衡、故障转移、伸缩性 负载均衡&a…

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程&#xff1a; Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你&#xff1a;deepseek R1基于 AnythingLLM API 调用本地…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…

02、QLExpress从入门到放弃,相关API和文档

QLExpress从入门到放弃,相关API和文档 一、属性开关 public class ExpressRunner {private boolean isTrace;private boolean isShortCircuit;private boolean isPrecise; }/*** 是否需要高精度计算*/ private boolean isPrecise false;高精度计算在会计财务中非常重要&…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

CCF-GESP 等级考试 2024年9月认证C++二级真题解析

2024年9月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;A 考察知识点&#xff1a;计算机存储 解析&#xff1a;磁心存储元件是早期计算机中用于存储数据的部件&#xff0c;它和现代计算机中的内存功能类似&#xff0c;都是用于临时…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

京东 旋转验证码 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 使用的第三方接码平台识别…

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…

微软AutoGen高级功能——Magentic-One

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;这次给大家分享的内容是微软AutoGen框架的高级功能Magentic-One。那么它是用来做什么的或它又是什么功能呢&#xff0c;我们直接进入正题。 Magentic-One Magnetic-One是一个通用型多智能体系统&#xff0c;用于…

Unity中自定义协程的简单实现

在 Unity 中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种非常强大的工具&#xff0c;它允许我们在不阻塞主线程的情况下&#xff0c;将代码的执行分成多个步骤&#xff0c;在不同的帧中执行。 Unity中协程实现原理 迭代器与状态机&#xff1a;本质上是基于C#的迭…

数值积分:通过复合梯形法计算

在物理学和工程学中&#xff0c;很多问题都可以通过数值积分来求解&#xff0c;特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中&#xff0c;我将讨论如何使用 复合梯形法 来进行数值积分&#xff0c;并以一个简单的…

【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 &#x1f3e0; yum &#x1f3b8; 什么是yum 当用户想下载软…

DeepSeek教unity------MessagePack-02

内置支持类型&#xff1a; 对象序列化 MessagePack for C# 可以序列化你自己定义的公共类或结构体类型。默认情况下&#xff0c;可序列化的类型必须用 [MessagePackObject] 属性进行注解&#xff0c;成员需要用 [Key] 属性进行注解。键可以是索引&#xff08;整数&#xff09;…

deepseek部署在本地详细教程

最近&#xff0c;DeepSeek爆火&#xff0c;先进的算法、卓越的能力&#xff0c;表现出众&#xff0c;其凭一己之力推动国内Ai大模型跨越式发展。作为一款现象级的Ai产品&#xff0c;用户量暴增&#xff0c;最近服务器又被攻击&#xff0c;使用DeepSeek&#xff0c;经常出现服务…

修改OnlyOffice编辑器默认字体

通过Docker修改OnlyOffice编辑器默认字体 问题描述详细方案1. 删除原生字体文件2. 创建字体目录3. 复制字体文件到容器中4. 执行字体更新脚本5. 重新启动容器 注意事项 问题描述 在OnlyOffice中&#xff0c;编辑器的默认字体可能不符合公司或个人的需求&#xff0c;通常会使用…

Vue学习笔记4

Vue学习笔记 一、自定义创建项目 基于VueCli自定义创建项目架子 二、vuex基本认知 1、vuex概述 是什么&#xff1a;是vue的状态管理工具&#xff08;插件&#xff09;&#xff0c;状态就是数据 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数…

文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、文心一言免费化的背后&#xff1a;AI成本与应用的双重驱动1️⃣成本下降&#xff0c;推动文心一言普及2…