基于Quartus原理图的电子琴设计
基于Quartus原理图设计的电子琴系统实现
在高校数字电路实验中,一个常见的挑战是如何让初学者快速理解从按键输入到声音输出的完整信号链。FPGA本应是理想的实践平台,但面对VHDL或Verilog代码,许多学生还没开始就被语法劝退。有没有一种方式,能像搭积木一样把逻辑模块连起来,就能让蜂鸣器“唱”出《小星星》?答案正是Quartus的图形化原理图设计。
我们以Cyclone系列FPGA为核心,构建一个无需编写任何HDL代码的简易电子琴系统。它支持7个基本音阶(do、re、mi…si),通过按键触发,由无源蜂鸣器发声。整个过程完全依赖原理图符号连接,所有功能模块——无论是去抖、编码还是分频——都以可视化的“黑盒子”形式存在,信号流向一目了然。
为什么选择74HC系列元件作为设计基础?
尽管FPGA内部没有真正的74HC芯片,但在Quartus的原理图编辑器里,这些经典TTL/CMOS器件的符号依然可用。它们不仅是工程师熟悉的语言,更是将抽象逻辑具象化的桥梁。调用
74HC04
反相器、
74HC151
数据选择器或
74HC390
计数器,能让设计者瞬间建立起对电路行为的直觉认知。
例如,在这个项目中:
-
74HC04
被用来翻转电平极性,适配某些低电平有效的按键或蜂鸣器驱动需求;
-
74HC151
作为8选1多路选择器,根据按键地址码选出对应的分频系数;
- 虽然严格来说没有
74HC9264
这一型号(原文疑为笔误),但我们可以通过组合多个标准器件或创建自定义子图来实现按键扫描与去抖功能。
这些元件在编译时会被综合进FPGA的LUT和寄存器资源中,只要其逻辑功能可映射,就能正常工作。需要注意的是,务必确认所选器件的工作电压与目标FPGA的I/O标准兼容(通常为3.3V或更低),避免硬件烧毁风险。
音符的本质:如何用50MHz时钟“切”出精确频率?
音乐的核心是频率。中央C(do)约261.63Hz,意味着蜂鸣器每秒要振动261.63次。而我们的FPGA板载晶振通常是50MHz——即每秒振荡五千万次。问题就转化为:如何从这五千万次里,“精准地”取出261.63次?
方法是利用 可编程分频器 。基本思路是使用一个计数器不断累加时钟脉冲,当达到某个预设值后翻转输出电平,从而生成对称方波。由于方波高低各占一半周期,所以实际分频比要乘以2:
N = \frac{f_{\text{in}}}{2 \times f_{\text{out}}}
对于do音:
N = \frac{50,000,000}{2 \times 261.63} ≈ 95,548
也就是说,设置一个计数器从0计数到95,547,然后清零并翻转输出,即可得到接近261.63Hz的方波。
以下是常用音符的分频参数表(基于50MHz主时钟):
| 音符 | 频率 (Hz) | 分频系数 $ N $ |
|---|---|---|
| do | 261.63 | 95,548 |
| re | 293.66 | 85,132 |
| mi | 329.63 | 75,838 |
| fa | 349.23 | 71,572 |
| sol | 392.00 | 63,775 |
| la | 440.00 | 56,818 |
| si | 493.88 | 50,618 |
注:频率依据十二平均律计算,参考A4=440Hz标准。
实践中,可以将这些系数存储在一个只读查找表(ROM)或直接通过多路选择器硬连线。每次按键按下时,对应的分频初值被加载至计数器,立即改变输出频率。
按键为何必须去抖?一个看似简单的动作背后有多复杂
机械按键看起来只是“通”与“断”,但实际上在按下和释放瞬间,触点会因弹性产生多次弹跳,导致电平在几毫秒内反复震荡。如果不处理,FPGA可能将一次按压识别成十几次操作——想象一下,你只想弹一个“do”,结果喇叭噼里啪啦响了一串。
解决办法不是靠运气,而是靠时间滤波。最可靠的方案是 定时采样法 :每隔一段时间(比如1ms)读取一次按键状态,只有当连续多次采样结果一致时,才认为按键已稳定。
具体实现上,我们可以构建一个小型状态机结构:
1. 外部按键信号首先进入两个级联的D触发器进行同步,防止亚稳态;
2. 启动一个20ms计数器(50MHz下需计数约1,000,000次);
3. 在此期间持续监测按键电平;
4. 若在整个延时期间状态未变,则输出有效按键信号,并锁存当前状态。
虽然这部分逻辑用原理图绘制稍显繁琐,但有个巧妙做法:先用VHDL写好去抖模块,编译成功后生成符号文件(
.bsf
),再将其拖入原理图中当作普通元件使用。这样既保留了图形化设计的优势,又借助HDL实现了复杂时序控制。
下面是该模块的关键逻辑示意(仅供辅助理解):
process(clk)
begin
if rising_edge(clk) then
key_sync1 <= key_in;
key_sync2 <= key_sync1;
if cnt_enable = '1' then
if counter < x"0F4240" then -- 约1ms @50MHz
counter <= counter + 1;
else
db_out <= key_sync2; -- 更新去抖后状态
end if;
end if;
end if;
end process;
只要确保计数时间远大于抖动周期(一般≥20ms),就能获得干净的单次脉冲输出。
蜂鸣器怎么接?有源和无源的区别千万别搞错
很多人第一次调试失败,往往是因为忽略了蜂鸣器类型。两种常见类型行为截然不同:
- 有源蜂鸣器 :内部自带振荡电路,相当于“智能喇叭”。只要给它加上直流电压(如高电平),就会自己发出固定频率的声音。优点是控制简单,缺点是只能发一种音。
- 无源蜂鸣器 :本质就是一个微型扬声器,需要外部提供交变信号才能振动发声。就像给喇叭送音频信号一样,你给什么频率,它就发什么音。
显然,要做电子琴,我们必须选 无源蜂鸣器 。它的驱动方式也更符合FPGA特性:直接将分频器输出的方波连接到蜂鸣器一端,另一端接地。FPGA引脚交替输出高低电平,迫使蜂鸣器膜片来回运动,从而发声。
不过要注意几点:
- FPGA I/O口驱动能力有限,一般建议串联一个220Ω电阻限流,保护IO;
- 绝对不要长时间输出高电平(直流),否则可能导致线圈过热损坏;
- 可加入使能信号控制启停,比如仅当按键按下且去抖完成后才允许方波输出;
- 进阶玩法中,可通过PWM调节方波占空比来控制音量大小。
整体架构如何搭建?一步步连接你的“音乐流水线”
整个系统的信号流其实非常清晰,完全可以画成一条流水线:
[7个机械按键]
↓
[7路并行输入]
↓
[7个去抖模块] → 输出7路稳定信号
↓
[优先级编码器 或 多路选择器] → 生成3位地址码(0~6)
↓
[查表模块 / ROM / MUX] → 根据地址输出对应分频系数
↓
[可编程分频器] → 生成目标频率方波
↓
[蜂鸣器驱动输出]
在Quartus原理图中,每个方框都可以是一个独立的子图(Block Diagram File)。顶层图负责连接各个模块,底层子图则实现具体功能。这种层次化设计极大提升了可读性和复用性。
比如,“音符选择模块”可以用一个
74HC151
八选一数据选择器实现。它的8个数据输入端分别接入7个音符的分频系数(第8位可留空或接静音),3位选择线来自按键编码器。一旦某键按下,编码器送出对应地址,MUX立刻切换至该通道,更新分频器预设值。
而分频器本身也可以做成通用模块:输入时钟、复位、预设值和使能信号,输出方波。只要改变输入的预设值,就能无缝切换音符。
实际调试中会遇到哪些坑?经验告诉你怎么绕开
即便设计完美,下载到板子上也可能无声。别急,按以下顺序排查:
-
Pin Assignment是否正确?
最常见的错误是忘记绑定物理引脚。进入Assignment Editor,确认每个按键和蜂鸣器都分配到了正确的GPIO编号,并保存为SDC约束文件。 -
蜂鸣器类型是否匹配?
如果接的是有源蜂鸣器,即使输入方波,也可能因内部电路干扰而不响。换一个无源蜂鸣器试试,或者用示波器观察输出引脚是否有方波。 -
电源是否稳定?
某些开发板的IO供电不足,尤其当多个外设同时工作时。检查板载电压是否正常,必要时外接稳压电源。 -
分频系数算错了?
四舍五入误差累积会导致音不准。建议保留整数部分,或使用双模分频技术提高精度。也可在MATLAB中预先计算并验证所有系数。 -
多键冲突怎么办?
默认情况下,若两个键同时按下,编码器可能输出错误地址。解决方案包括:
- 使用优先级编码器(如74HC148),只响应编号最高的按键;
- 添加组合逻辑禁止多键输入;
- 或干脆接受和弦效果(进阶功能)。 -
编译报错找不到元件?
确保使用的74HC器件属于Quartus支持的库。部分老型号可能已被弃用,可用等效LPM模块替代,或手动创建自定义符号。
还能怎么扩展?让它不只是个玩具
一旦基础功能跑通,这个平台就有无限可能。你可以轻松添加以下功能:
- LED指示灯 :每个按键对应一个LED,按下时亮起,增强交互反馈;
- 数码管显示音符编号 :用BCD译码驱动共阴极数码管,实时显示当前演奏的音阶;
- 自动播放模式 :加入状态机和计数器,按预定节奏依次触发音符,实现《欢乐颂》循环播放;
- 录音回放 :利用片内RAM记录按键序列和持续时间,再原样重现;
- MIDI接口 :通过UART发送MIDI消息,连接电脑或合成器;
- LCD屏显示曲谱 :配合字符型LCD,边弹边看简谱。
甚至可以把整个系统封装成IP核,供其他项目调用。你会发现,原本以为“过时”的原理图设计法,反而成了快速迭代原型的最佳工具。
这种高度集成的可视化设计思路,正悄然改变着数字系统教学的面貌。它不追求炫技式的代码优化,而是强调“看得见、摸得着”的工程思维。当你亲手连通最后一个导线,按下按键那一刻响起的第一个清晰音符,那种成就感,远胜于任何仿真波形。而这,或许才是电子设计最初的浪漫。
更多推荐
所有评论(0)