Full picture
15

声音控制器

15.1 概述

Zeal 视频板包含一个强大的声音子系统,具有五个声道

  • 4 个标准声道,可生成基本波形:方波、三角波、锯齿波和噪声。
  • 1 个采样声道,能够通过 256 字节的 FIFO 缓冲区播放任意波形数据。

4 个标准声道共享一个 16 位线性反馈移位寄存器(LFSR)用于噪声生成。采样声道独立运行,但在输出前会与其他声道混合。

混合方式是先对四个标准声道取平均值,然后加上采样表声道的当前采样值。这种方法保持音频输出平衡,但同时在两种类型声道播放时需要注意避免饱和或削波。

与其他控制器一样,DMA 控制器可以映射到设备组中,I/O 端口起始地址为 0xA0,其设备索引为 3

15.2 声道控制与同步

  • 保持寄存器(hold register) 可将声道输出冻结在当前采样值,从而实现静音,而无需停止波形生成。
  • 此保持功能支持同时原子化启动/停止多个声道,以避免时序毛刺或伪影。可通过设置 MASTER_HOLD 寄存器来选择要保持或取消保持的声道。
  • 声音选择寄存器决定哪些声道会受到频率和波形配置寄存器写入的影响,从而支持灵活的每声道独立配置。可在 MASTER_ENABLE 寄存器中选择/启用声道。

例如,如果要将声道 0 和 1 设置为频率 0x1000,可以使用以下伪代码:

// 启用声道 0 和 1(每个声道 1 位)
MASTER_ENABLE  = (1 << 1) | (1 << 0);

// 所有选中的声道将监听以下寄存器的变化
FREQUENCY_LOW  = 0x00;
FREQUENCY_HIGH = 0x10;

// 将声道 0 设置为方波,50% 占空比
MASTER_ENABLE  = (1 << 0);
WAVEFORM = 0x80;

// 将声道 1 设置为锯齿波
MASTER_ENABLE  = (1 << 1);
WAVEFORM = 0x02;

15.3 声道与波形

4 个标准声道中的每一个都可以产生以下波形之一,每个声道可独立选择:

索引 波形
0 方波(可配置占空比)
1 三角波
2 锯齿波
3 白噪声(使用共享 LFSR)

设置一个或多个声道的波形可通过设置 WAVEFORM 寄存器完成。要配置的声道必须先在 MASTER_ENABLE 寄存器中选择。

方波的占空比由 3 位字段控制,支持以下设置:

占空比 (%)
000 0
001 12.5
010 25
011 37.5
100 50
101 62.5
110 75
111 87.5

设置占空比仅适用于将声道设置为方波的情况,可通过设置 WAVEFORM 寄存器中的 Duty cycle 字段完成。

⚠️ 频率、波形或占空比的更改会被锁存,仅在当前波形周期结束时生效,从而避免咔嗒声或爆音。

15.4 频率与音高

每个声道的频率由 16 位寄存器设置。最终的频率(Hz)计算公式如下:

$\text{频率} = \frac{\text{sample_rate} \times \text{freq_reg}}{2^{16}}$

其中标准声道的固定采样率为 44,091Hz

硬件不限制频率值,因此极高或极低的值可能会产生人耳无法听见的声音。

已启用声道的频率可通过分别设置 FREQUENCY_LOW(低字节)和 FREQUENCY_HIGH(高字节)寄存器来写入。

15.5 音量与混音

  • 每个声道有一个禁用位和一个2 位线性音量控制,支持五个级别:0%、25%、50%、75% 和 100%。已启用声道的音量可通过 VOLUME 寄存器设置。
  • 主音量分别控制每个通道(左声道和右声道)的输出音量,也采用 2 位线性缩放。左/右声道的音量可通过 MASTER_VOLUME 寄存器设置。
  • 声道(包括采样表声道)可以单独分配到左和/或右音频通道,为此提供了 MASTER_LEFT_CHANNELMASTER_RIGHT_CHANNEL 寄存器。
  • 混音时,四个标准声道的输出先取平均值,然后再加上采样表声道的当前采样值。

这种方案保持输出平衡,避免了简单的累加削波,但请注意,同时播放采样声道和所有四个标准声道可能会导致饱和,因为采样是在取平均值之后添加的。

15.6 采样表声道

第五个声道使用256 字节的 FIFO 缓冲区来播放任意数字采样。 可通过在 MASTER_ENABLE 寄存器中设置 SAMPLE_TAB 位来选择它。该特殊声道使用与其他声道相同的 WAVEFORMFREQUENCYVOLUME 寄存器。这些寄存器偏移量被重新用作 ST_FIFOST_SRATE_DIVST_STATUS 寄存器。

  • 支持以下采样格式,可在 ST_SRATE_DIV 寄存器中设置:
    • 8 位无符号
    • 16 位有符号或无符号(小端序)
  • 采样播放速率可通过分频器编程,设置在 ST_SRATE_DIV 中,解释如下:
$\text{采样率} = \frac{44091}{\text{分频器} + 1}$
  • FIFO 具有满和空状态标志
    • 如果 FIFO 为空,播放暂停。
    • 当 FIFO 满时,写入停止。

当前 FIFO 状态可从 ST_STATUS 寄存器中读取。

该声道允许在标准合成声道之外播放复杂声音或采样音频。

15.7 编写声音控制器程序

SDK 提供了简洁的 API 来控制声道和采样:

  • 初始化并重置声音子系统。
  • 配置声道的频率、波形、音量和通道分配。
  • 管理采样表声道:配置采样格式、采样率分频器,并将采样数据写入 FIFO。
  • 使用保持寄存器原子化地静音或启动声道。

有关详细示例和完整的 API 用法,请查看 SDK 声音示例

15.8 寄存器总览

Name Description Base-relative address Access
FREQUENCY_LOW 当前所有选中声音通道的频率分频器最低字节 0x00 WO
FREQUENCY_HIGH 当前所有选中声音通道的频率分频器最高字节 0x01 WO
WAVEFORM 当前所有选中声音通道的波形 0x02 WO
VOLUME 当前所有选中声音通道的音量 0x03 WO
ST_FIFO 向FIFO写入一个字节(仅限样本表) 0x00 WO
ST_SRATE_DIV 采样率分频器(仅限样本表) 0x01 R/W
ST_STATUS 样本表声音通道的状态(仅限样本表) 0x02 varies
MASTER_LEFT_CHANNEL 将声音通道分配到左声道输出的位图 0x0B WO
MASTER_RIGHT_CHANNEL 将声音通道分配到右声道输出的位图 0x0C WO
MASTER_HOLD 保持声音通道的位图,阻止其生成下一个样本 0x0D WO
MASTER_VOLUME 左右声道的主音量控制 0x0E WO
MASTER_ENABLE 主使能控制,选择将监听寄存器范围0x00-0x08的声音通道 0x0F WO

15.9 寄存器

FREQUENCY_LOW (0x00)
当前所有选中声音通道的频率分频器最低字节
FREQ_LSB
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
FREQ_LSB
频率分频器最低字节 (WO)
FREQUENCY_HIGH (0x01)
当前所有选中声音通道的频率分频器最高字节
FREQ_MSB
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
FREQ_MSB
频率分频器最高字节 (WO)
WAVEFORM (0x02)
当前所有选中声音通道的波形
Duty cycle
(reserved)
Waveform
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
Duty cycle
仅适用于方波的占空比步进。 (WO)
Waveform
声音通道输出的波形。请参考上表查看所有选项。 (WO)
VOLUME (0x03)
当前所有选中声音通道的音量
DISABLE
(reserved)
Steps
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
DISABLE
禁用声音输出,相当于0%音量。 (WO)
Steps
音量步进。请参考上表查看所有选项。 (WO)
ST_FIFO (0x00)
向FIFO写入一个字节(仅限样本表)
DATA
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
DATA
向样本表声音通道的FIFO写入一个字节。 (WO)
ST_SRATE_DIV (0x01)
采样率分频器(仅限样本表)
(reserved)
DIV
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
DIV
采样率分频器。得到的采样率为44,091/(DIV+1)。 (R/W)
ST_STATUS (0x02)
样本表声音通道的状态(仅限样本表)
EMPTY
FULL
(reserved)
SIGNED
LOOP
MODE_8BIT
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
EMPTY
当FIFO为空时置位。 (RO)
FULL
当FIFO为满时置位。 (RO)
SIGNED
当样本为有符号数时置位(仅16位模式下,8位模式下忽略)。 (R/W)
LOOP
置位时,使用现有FIFO内容循环播放样本。 (R/W)
MODE_8BIT
当样本为无符号8位格式时置位,样本为16位(有符号或无符号)时清零。 (R/W)
MASTER_LEFT_CHANNEL (0x0B)
将声音通道分配到左声道输出的位图
SAMPLE_TAB
(reserved)
VOICE_3
VOICE_2
VOICE_1
VOICE_0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
SAMPLE_TAB
置位时在左声道输出样本表声音通道。 (WO)
VOICE_3
置位时在左声道输出声音通道3。 (WO)
VOICE_2
置位时在左声道输出声音通道2。 (WO)
VOICE_1
置位时在左声道输出声音通道1。 (WO)
VOICE_0
置位时在左声道输出声音通道0。 (WO)
MASTER_RIGHT_CHANNEL (0x0C)
将声音通道分配到右声道输出的位图
SAMPLE_TAB
(reserved)
VOICE_3
VOICE_2
VOICE_1
VOICE_0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
SAMPLE_TAB
置位时在右声道输出样本表声音通道。 (WO)
VOICE_3
置位时在右声道输出声音通道3。 (WO)
VOICE_2
置位时在右声道输出声音通道2。 (WO)
VOICE_1
置位时在右声道输出声音通道1。 (WO)
VOICE_0
置位时在右声道输出声音通道0。 (WO)
MASTER_HOLD (0x0D)
保持声音通道的位图,阻止其生成下一个样本
SAMPLE_TAB
(reserved)
VOICE_3
VOICE_2
VOICE_1
VOICE_0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
SAMPLE_TAB
置位时保持样本表声音通道。 (WO)
VOICE_3
置位时保持声音通道3。 (WO)
VOICE_2
置位时保持声音通道2。 (WO)
VOICE_1
置位时保持声音通道1。 (WO)
VOICE_0
置位时保持声音通道0。 (WO)
MASTER_VOLUME (0x0E)
左右声道的主音量控制
DISABLE_RIGHT
DISABLE_LEFT
(reserved)
STEPS_RIGHT
STEPS_LEFT
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
DISABLE_RIGHT
禁用右声道的声音输出,相当于0%音量。 (WO)
DISABLE_LEFT
禁用左声道的声音输出,相当于0%音量。 (WO)
STEPS_RIGHT
右声道的音量步进。请参考上表查看所有选项。 (WO)
STEPS_LEFT
左声道的音量步进。请参考上表查看所有选项。 (WO)
MASTER_ENABLE (0x0F)
主使能控制,选择将监听寄存器范围0x00-0x08的声音通道
SAMPLE_TAB
(reserved)
VOICE_3
VOICE_2
VOICE_1
VOICE_0
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
Reset
SAMPLE_TAB
置位时选择样本表声音通道。 (WO)
VOICE_3
置位时选择声音通道3。 (WO)
VOICE_2
置位时选择声音通道2。 (WO)
VOICE_1
置位时选择声音通道1。 (WO)
VOICE_0
置位时选择声音通道0。 (WO)
EN | 中文Beta