dsp第二章笔记
📌 导航索引目录
- 📍 第一站:内部总线物理结构(4对/8条独立并行线)
- 📍 第二站:CPU 运算核心四大组件深剖
- 📍 第三站:专用算法硬核加速部件
- 📍 第四站:状态寄存器(ST0 / ST1)标志位物理账本
- 🎯 工业级因果逻辑大闭环(硬件控制与条件分支)
📍 第一站:内部总线物理结构(4对/8条独立并行线)
C54x 采用改进型哈佛结构,物理上集成了 8 组 16 位独立的并行总线,实现了“程序空间”与“数据空间”的物理彻底分离。
- 物理本质:总线分为两类,带有
A后缀的为地址总线,专传料单;不带A后缀的为数据总线,专门搬运指令与操作数。 - 流水线并行能力:独立总线阵列支持 CPU 在同一个时钟周期内同时执行:读取 1 条指令、抓取 2 个数据操作数、写入 1 个运算结果。
🚨 空间划分核心避坑:
数据存储器前 128 个字(0000h - 007Fh)被严格括为MMRs(存储器映射寄存器)与Scratch-pad(暂存 RAM)。绝对禁止在此区域存放用户普通数组,应用层变量必须从0080h(DARAM 核心区起点)开始存储。
📍 第二站:CPU 运算核心四大组件深剖
1. ALU 核心硬件逻辑与输入源预处理
(1) 双路物理输入源(MUX 选择器精准调度)
- X 输入源:① 桶形移位寄存器输出端;② 数据总线
DB(来自数据存储器的操作数)。 - Y 输入源:① 累加器
ACC A或ACC B;② 数据总线CB;③ 暂存器T。
(2) SXM 符号位扩展预处理机制(16位输入向40位对齐)
当 16 位操作数通过 DB 或 CB 进入 40 位 ALU时,根据对齐格式触发以下预处理:
| 操作数物理位置 | 开关状态 | 高位处理 (39~16位) | 低位处理 (15~0位) |
|---|---|---|---|
| 操作数在低 16 位 | SXM = 0 (无符号) |
强行补 0 |
保持原 16 位数据 |
SXM = 1 (有符号) |
依照第 15 位符号位扩展 | 保持原 16 位数据 | |
| 操作数在高 16 位 | SXM = 0 (无符号) |
39~32位补 0 |
15~0位强行清 0 |
SXM = 1 (有符号) |
39~32位依照符号位扩展 | 15~0位强行清 0 |
(3) OVM 饱和溢出物理逻辑
当 40 位运算发生爆表溢出时,芯片由状态寄存器 ST1 中的 OVM 控制:
OVM = 0(正常溢出):不对 ALU 结果做任何干预,直接写入目标累加器,高位溢出丢失。OVM = 1(饱和压制):硬件自动执行裁剪修正:- 正向溢出:将 32 位最大正数
007FFFFFFFH锁死装入累加器。 - 负向溢出:将 32 位最小负数
FF80000000H锁死装入累加器。 - 状态反馈:状态寄存器 ST0 中的溢出标志位
OVA/OVB自动拉响警报(置 1)。
- 正向溢出:将 32 位最大正数
2. 40位累加器结构与“三步切糕移位法”
C54x 集成两个独立的 40 位累加器(A 和 B),其物理空间严格被划分为三段:AG (39~32位)、AH (31~16位)、AL (15~0位)。
✍️ 移位存储指令速记物理链路
当执行带移位的 STH(存储高位)或 STL(存储低位)指令时,遵循“桶形移位器输出镜像,累加器本尊不变”的死律:
- 第一步:看正负,滑整体
- 立即数为正(如 8):代表左移。数据整体左滑,右侧空出车道一律补
0。 - 立即数为负(如 -8):代表右移。数据整体右滑,左侧空出车道一律复制符号位。
- 立即数为正(如 8):代表左移。数据整体左滑,右侧空出车道一律补
- 第二步:看指令,切蛋糕
- 若为
STH:眼睛死盯最新镜像中的AH区域(中间 4 个十六进制字母),切下存入目标内存。 - 若为
STL:眼睛死盯最新镜像中的AL区域(最后 4 个十六进制字母),切下存入目标内存。
- 若为
- 第三步:本尊判定:在旁边无条件写下:累加器 A / B 的内部原数值保持绝对不变。
📊 移位存储全链精炼对照表(原数据:FF 0123 4567)
| 移位指令 | 物理换算过程(滑移镜像) | 🎯 存储单元 T 结果 | 累加器 A 本尊状态 |
|---|---|---|---|
STH A, 8, T |
左移 8 位 \(\rightarrow\) 01 2345 6700 |
2345H |
不变 (FF 0123 4567) |
STH A, -8, T |
右移 8 位 \(\rightarrow\) FF FF01 2345 |
FF01H |
不变 (FF 0123 4567) |
STL A, 8, T |
左移 8 位 \(\rightarrow\) 01 2345 6700 |
6700H |
不变 (FF 0123 4567) |
STL A, -8, T |
右移 8 位 \(\rightarrow\) FF FF01 2345 |
2345H |
不变 (FF 0123 4567) |
3. 桶形移位寄存器与“指数归一化”黄金搭档
桶形移位器由多路选择器门阵列组成,可在 1 个时钟周期内 完成 -16 ~ 31 位的任意移位。
🎯 移位控制源的三大物理途径
- 立即数控制:
ADD A, -4, B\(\rightarrow\) 步数写死在代码中(负数代表右移 4 位)。 - 预设开关控制:
ADD A, ASM, B\(\rightarrow\) 硬件动态读取 ST1 中的ASM寄存器(5 位)。 - 动态小黑板控制:
NORM A\(\rightarrow\) 步数强行由暂存器T的低 6 位决定。
4. 17×17 硬件乘法累加单元(MAC)
- 17×17 的物理本质:数据虽为 16 位,但为了在底层完美包容有符号数(补码)的加减,硬件上额外拓宽了 1 位物理补码符号位,拼成 17 位乘法器。
- 算法支撑:17×17 乘法器输出端直通下面的 40 位加法器,实现了乘法与累加在单个周期内一步到位。
📍 第三站:专用算法硬核加速部件
1. CSSU(比较、选择和存储单元)与 CMPS 指令
CMPS 是为 Viterbi 算法进行路径追溯而设计的纯硬件快车道。
- 考场速记死律:
- 高位大 \(\rightarrow\) 存
AH\(\rightarrow\)TRN(0) = 0\(\rightarrow\)TC = 0(全员归零)。 - 低位大 \(\rightarrow\) 存
AL\(\rightarrow\)TRN(0) = 1\(\rightarrow\)TC = 1(全员起航)。
- 高位大 \(\rightarrow\) 存
- TRN 移位机理:通过连续 16 次左移,
TRN寄存器得以用最紧凑的二进制(0与1)无缝锁死 16 轮淘汰赛的完整历史分叉足迹。
2. 指数编码器(EXP)手算图表拓扑
| 题型分类 | 考场原题样例 | 1. 展开二进制(数出总符号位数) | 2. 带入公式计算 | 🎯 最终答案(存入 T) | 后续 NORM 动作 |
|---|---|---|---|---|---|
| 题型 Ⅰ(高位全 F) | A = FF FFFFF F001H |
从第39位往右数,共有 19 个连续的 1 |
\(19 - 8 = 11\) | 000BH |
向左平移 11 位 |
| 题型 Ⅱ(高位全 0) | A = 00 0000 1234H |
从第39位往右数,共有 27 个连续的 0 |
\(27 - 8 = 19\) | 0013H |
向左平移 19 位 |
- 物理反向避坑:若连续符号位数小于 8,减 8 后必得负数,此时
T写入负数二进制补码,后续NORM自动驱动桶形移位器向右平移以防高位爆表。
📍 第四站:状态寄存器(ST0 / ST1)标志位物理账本
1. ST0(状态寄存器 0):主要负责“看天气(记录运算状态)”
| 标志位 | 物理全称 | 核心硬件逻辑 | 考场状态判定 |
|---|---|---|---|
OVF |
Overflow Flag | 监测 40 位累加器是否发生爆表。 | 累加器满溢出来时自动置 1。 |
TC |
Test/Control flag | 记录测试指令与 CMPS 淘汰赛的胜负。 |
CMPS 指令下低位 AL 获胜时置 1,高位胜清 0。 |
C |
Carry bit | 算术运算最高位进位/借位状态。 | 加法产生进位或减法无借位时置 1;硬件复位默认置 1。 |
2. ST1(状态寄存器 1):主要负责“设机关(控制硬件模式)”
| 控制位 | 物理全称 | 核心硬件逻辑 | 考场控制死律 |
|---|---|---|---|
OVM |
Overflow Mode | 累加器防爆高压饱和安全帽的总开关。 | OVM=1:锁定最大/最小值;OVM=0:任由高位丢失。 |
SXM |
Sign Extension Mode | 16位有无符号数向40位拉伸的对齐开关。 | SXM=1:依照符号位拉伸;SXM=0:高24位强行清零。 |
ASM |
Accumulator Shift Mode | 5位存储空间,控制桶形移位器的滑移步数。 | ADD A, ASM, B 指令启动时,滑梯移位直接读取此处的数值。 |
🚀 第一部分:第二章核心汇编指令大集结 (Cheat Sheet)
基于文档内容,我将 PPT 和笔记中提到的关键指令整理如下,适合考前速记:
1. 算术与逻辑运算类
| 指令 | 功能描述 | 核心考点/避坑 |
|---|---|---|
ADD A, -4, B |
A 右移 4 位后加到 B | 负数右移,A 原值不变 |
ADD A, ASM, B |
A 按 ASM 设定位数移位后加到 B | 移位量由状态寄存器 ST1.ASM 决定 |
ADDS / SUBS |
无符号加/减法 | 禁止符号扩展,不看 SXM 标志 |
ADDM 等 |
存储器到存储器运算 | 结果不进累加器,直接存内存 |
2. 数据存储与定标类 (累加器操作)
| 指令 | 功能描述 | 核心考点/避坑 |
|---|---|---|
STH A, 8, T |
A 左移 8 位,存高 16 位 (AH) 到 T | 切中间;正数左移补 0 |
STL A, -8, T |
A 右移 8 位,存低 16 位 (AL) 到 T | 切尾部;负数右移补符号位 |
STLM A, AR1 |
A 的低 16 位存入 AR1 | 属于 MMR 写操作,极易引发流水线冲突 |
3. 特种算法加速类 (CSSU & EXP)
| 指令 | 功能描述 | 核心考点/避坑 |
|---|---|---|
CMPS A, *AR1 |
比较 AH 与 AL,存大者 | CSSU 核心;自动更新 TRN 和 TC 标志 |
EXP A |
提取指数 | 计算公式:\(T = \text{前导符号位数} - 8\) |
NORM A |
归一化 | 根据 T 寄存器的值对 A 进行物理移位 |
4. 系统控制与 I/O
| 指令 | 功能描述 |
|---|---|
RSBX / SSBX |
复位/置位状态位 (如 SSBX SXM) |
IDLE1/2/3 |
闲置省电指令 (分级关闭外设/PLL) |
PORTR / PORTW |
外部 I/O 空间读写 |
FB[D] 等系列 |
扩展程序存储器的长跳转/长调用指令 |
📚 第二部分:硬件结构与关键机制总结
1. 内部总线结构 (8组16位总线)
- 架构:1 条程序总线 (PB) + 3 条数据总线 (CB, DB, EB) + 4 条地址总线。
- 优势:单周期内可同时完成 取指 (1条) + 取数 (2个操作数) + 写结果 (1个)。
2. CPU 核心部件
- ALU (算术逻辑单元):
SXM(符号扩展):决定 16 位数据进入 40 位 ALU 时,高位补 0 还是补符号位。OVM(溢出模式):决定溢出时是饱和处理 (Saturation) 还是正常溢出。
- 累加器 (ACC A/B):
- 结构:40 位 = AG (8位保护) + AH (16位高) + AL (16位低)。
- 移位存储口诀:正左负右,STH 切中,STL 切尾,本尊不变。
- 桶形移位器:支持 \(-16 \sim 31\) 位移位,用于归一化和定点数运算。
🧠 第三部分:终极通关 Quiz 满分答案库
1、TMS320C54x芯片的基本结构都包括哪些部分?
TMS320C54x 系列 DSP 芯片虽然种类很多,但结构基本相同,主要由以下 10 个部分 组成:
- 中央处理器 (CPU)
- 内部总线控制结构
- 特殊功能寄存器
- 数据存储器 (RAM)
- 程序存储器 (ROM)
- I/O 接口 (扩展功能)
- 串行口
- 主机通信接口 (HPI)
- 定时系统 / 定时器
- 中断系统
2、TMS320C54x芯片的CPU主要由几部分组成?
它的 CPU 是个拥有高度并行处理能力的“超级加工厂”,主要由以下 7 大核心部件 组成:
- 40 位算术逻辑运算单元 (ALU)
- 2 个 40 位累加器 (ACCA 和 ACCB)
- 支持 -16~31 位移位的桶形移位寄存器
- 乘法-累加单元 (MAC)
- 比较、选择和存储单元 (CSSU)
- 指数编码器 (EXP)
- CPU 状态和控制寄存器 (ST0、ST1、PMST 等)
3、PMST中的MP/MC、OVLY和DROM 3个状态位对存储空间结构有何影响?
这三个开关是大厨用来布置“粮仓”的关键:
- MP/MC (微处理器/微型计算机方式位):决定是否允许使用片内程序存储器 ROM。
MP/MC=0时,工作在微机模式,片内 ROM 映射到程序空间;MP/MC=1时,工作在微处理器模式,程序空间全部在外部存储器,不能使用片内 ROM。 - OVLY (RAM 重复占位标志):决定内部 DARAM 是否映射到程序存储空间。
OVLY=0时,内部 DARAM 只作为数据存储器;OVLY=1时,内部 DARAM 同时被映射到程序存储空间和数据存储空间(除数据页0外)。 - DROM (数据 ROM 位):决定片内 ROM 是否可以映射到数据存储空间。
DROM=0时,内部 ROM 不映射到数据空间;DROM=1时,部分片内 ROM 被映射到数据存储空间。
4、TMS320C54x芯片的内外设主要包括哪些电路?
为了配合强大的 CPU,芯片配备了以下 7 种 核心片内外设电路:
- 通用 I/O 引脚(如 XF 和 BIO)
- 定时器
- 时钟发生器(含锁相环 PLL)
- 主机接口 (HPI)
- 串行通信接口
- 软件可编程等待状态发生器
- 可编程分区转换逻辑
5、TMS320C54x芯片的流水线操作共有多少个操作阶段?
共有 6 个 操作阶段(深度为6的流水线)。它们分别是:
- 预取指 (P):生成地址并送上程序地址总线 PAB。
- 取指 (F):从存储器读取指令代码送到程序总线 PB。
- 译码 (D):将指令送入译码器 IR 翻译并产生控制信号。
- 寻址 (A):生成数据存储器的读/写地址。
- 读数 (R):从存储器读取操作数。
- 执行 (X):执行运算并将结果写回存储器。
6、流水线冲突是怎样产生的?有哪些方法可以避免?
- 产生原因:由于 CPU 的内部资源有限,当多于一个流水线上的指令在同一个机器周期内“抢夺”同一个硬件资源(例如同时访问两次同一个存储器块,或者对 MMR 寄存器执行写操作后紧接着马上读取)时,就会产生时序冲突。
- 避免方法:
- 硬件自动解决:由 CPU 硬件通过自动延迟操作周期来解决(自动插入等待)。
- 程序软件解决:通过重新安排汇编指令的执行顺序来规避。
- 手动插入空操作:查阅等待周期表,在冲突的指令之间人为插入对应数量的
NOP(空操作)指令。 - 利用隐含保护:利用双字或三字指令(如
STM)自身执行周期长、自带隐含保护周期的特性来填补等待间隙。
7、TMS320C54x芯片的串行口有哪几种类型?
不同型号配置不同,总共分为以下 4 种 类型:
- 标准同步串行口 (SP)
- 缓冲同步串行口 (BSP)
- 多通道缓冲同步串行口 (McBSP)
- 时分复用串行口 (TDM)
8、TMS320VC5402 共有多少可屏蔽中断?它们分别是什么?NMI和RS属于哪一类?
- 共有 16 个 固定优先级的可屏蔽硬件中断,分别是
SINT0 ~ SINT15。 - NMI (不可屏蔽中断) 和 RS (复位) 属于非屏蔽中断(外部硬件中断源),它们不受控制寄存器中 INTM 开关的屏蔽限制。
Q9:试分析下列程序的流水线冲突,画出流水线操作图。如何解决流水线冲突?
STLM A, AR0
STM #10, AR1
LD *AR1, B
答:
- 冲突分析:
-
第一条指令
STLM在执行级 X 级(假设在 \(T_6\) 周期)向存储器映像寄存器进行了写操作 。 -
第二条指令
STM在其执行级也准备进行写操作,造成外部总线与写资源的冲突,芯片硬件会自动将其延迟一个周期(产生 1 个周期的自动保护) 。 -
第三条指令
LD *AR1, B在寻址级 A 级需要对AR1进行读出间接寻址 。但此时由于前面的冲突和延迟,AR1里的最新值#10尚未完全写入准备好。“前写后读”导致了新的严重流水线冲突 。
- 流水线操作图(图解数据流冲突与延迟):
机器周期 ──► T1 T2 T3 T4 T5 T6 T7 T8 T9
────────────────────────────────────────────────────────────
STLM A, AR0 [P] [F] [D] [A] [R] [Xw]
STM #10, AR1 [P] [F] [D] [A] [R] [Xw] <-- 硬件自适应延迟
LD *AR1, B [P] [F] [D] [A]* [R] [X]
▲
└─ 冲突!此时AR1尚未写入完毕
- 解决办法:在
STLM后、或者在STM指令后插入一条NOP空操作指令,将读寻址动作强行错开,以腾出足够的物理级时间给AR1刷新数据 :
STLM A, AR0
NOP ; 插入一个空操作
STM #10, AR1
LD *AR1, B
Q10:试根据等待周期表,确定下列程序段需要插入几个NOP指令。
① 核心分析:
LD @GAIN, T ; 对 T 寄存器进行写操作(查表:对 T 写操作需要 1 个等待周期)
STM #input, AR1 ; 属于【双字指令】,在流水线中自带 1 个周期的隐含保护
MPY *AR1+, A ; 读 T 碗干活
-
结论:因为紧随其后的
STM是一个双字指令,物理上已经创造了 1 个周期的隐含保护延迟,刚好抵消了LD ..., T所需的 1 个等待周期 。 -
需要插入的 NOP 数量:0 个 。
② 核心分析:
STLM B, AR2 ; 存储器映像写操作(查表:对辅助寄存器 ARx 写入需要 2 个等待周期)
STM #input , AR3 ; 属于【双字指令】,提供 1 个周期的隐含保护。2 - 1 = 1,仍欠 1 个周期
MPY *AR2+, *AR3+, A
-
结论:对
AR2写入需要 2 个周期,虽然双字指令STM隐含屏蔽了 1 个周期,但在第三行马上使用AR2间接寻址时,依旧存在 1 个周期的断层 。 -
需要插入的 NOP 数量:1 个。应修改为 :
STLM B, AR2
STM #input, AR3 ; 隐含保护 1 周期
NOP ; 补齐最后的 1 个等待周期
MPY *AR2+, *AR3+, A
③ 核心分析:
MAC @x, B
STLM B, ST0 ; 对状态寄存器 ST0 进行写操作(查表:对 ST0 写入需要 3 个等待周期)
ADD @table, A, B ; 紧随其后的普通单字算术指令,无任何隐含保护
-
结论:对存储器映像状态寄存器
ST0执行写操作后,必须雷打不动地插入 3 个完全空开的机器周期,后面的指令才能安全执行 。 -
需要插入的 NOP 数量:3 个。应修改为 :
MAC @x, B
STLM B, ST0
NOP ; 插入第 1 个空操作
NOP ; 插入第 2 个空操作
NOP ; 插入第 3 个空操作
ADD @table, A, B

浙公网安备 33010602011771号