Vivado综合阶段HDL与XDC属性设置完整指南:从KEEP到时序约束
2026/9/29 2:16:13
程序查询方式是最基础、最简单的 I/O 控制方式,核心逻辑是CPU 通过软件指令主动轮询外设状态,直到外设准备好数据后,再执行读写操作。整个过程中,CPU 全程参与,无任何硬件自动干预。
CPU 与外设的交互完全由用户程序或系统程序控制,CPU 不断执行读状态寄存器指令,判断外设是否处于“就绪” 状态:
读/写数据寄存器指令,完成一次数据传输。外设必须提供两个核心寄存器,且这两个寄存器需被 CPU 寻址:
| 寄存器类型 | 作用 | 典型状态位 |
|---|---|---|
| 状态寄存器 | 存储外设的工作状态,供 CPU 查询 | - 忙(BUSY):外设正在工作,不可操作- 就绪(READY):外设已准备好数据,可读写- 错误(ERROR):传输过程中出现故障 |
| 数据寄存器 | 暂存 CPU 与外设之间传输的数据 | - 输入时:外设将数据写入数据寄存器,CPU 读取- 输出时:CPU 将数据写入数据寄存器,外设读取 |
程序查询方式的流程可分为3 个步骤,全程由 CPU 主导:
初始化阶段CPU 向外设发送启动命令(如启动键盘扫描、启动 ADC 采样),外设开始工作。
循环查询阶段(核心)
// 伪代码:程序查询方式读外设 while(1) { // 步骤1:读取外设状态寄存器 status = read(STATUS_REGISTER); // 步骤2:判断就绪位是否置位 if(status & READY_BIT) { break; // 外设就绪,退出循环 } // 外设未就绪,继续循环等待 } 3. 数据传输阶段
CPU 执行数据读写指令,完成一次数据传输:
// 读取外设数据寄存器中的数据 data = read(DATA_REGISTER); // 可选:清除外设就绪位,触发外设下一次工作 write(STATUS_REGISTER, status & ~READY_BIT);| 优点 | 具体说明 |
|---|---|
| 硬件逻辑极简 | 无需中断控制器、DMA 控制器等额外硬件,仅需外设提供状态 / 数据寄存器,成本极低 |
| 软件编程简单 | 控制逻辑直观,无复杂的中断服务程序、寄存器配置,适合入门级嵌入式开发 |
| 时序完全可控 | CPU 主导所有操作,可精确控制数据传输的时间点,适合对时序要求简单的场景 |
| 缺点 | 具体说明 |
|---|---|
| CPU 利用率极低 | 90% 以上的时间 CPU 都在循环查询,无法执行其他任务,相当于 “原地空转” |
| 实时性极差 | 若外设响应慢(如低速打印机),CPU 会被长期占用,导致其他任务延迟甚至卡顿 |
| 传输效率低 | 仅支持单字节 / 单字传输,每次传输都要经历 “查询→传输” 的完整流程,不适合大批量数据传输 |
| CPU 负担重 | 系统中外设数量越多,CPU 需轮询的设备越多,负担呈线性增长 |
程序查询方式的局限性决定了它仅适用于简单、低速、外设数量少的系统:
反例:不适合硬盘读写、网卡数据收发、视频流传输等高速、大批量数据传输场景。