FPGA开发板吃灰?用拨码开关和LED灯做个四位乘法器实验(Quartus II + Cyclone IV保姆级教程)
用拨码开关和LED玩转FPGA:四位乘法器实战指南(Cyclone IV版)
每次打开FPGA开发板的包装盒,看到那些密密麻麻的接口和元件,是不是既兴奋又无从下手?别让昂贵的开发工具沦为"电子手办",今天我们就用最基础的拨码开关和LED灯,完成一个看得见摸得着的四位乘法器实验。无需额外配件,你的实验箱就是最佳 playground。
1. 硬件交互设计:让抽象逻辑"活"起来
传统FPGA教学往往陷入仿真波形图的泥潭,而我们要做的是打造一个物理可交互的计算器。拿起你的Cyclone IV开发板,你会发现两组关键部件:
- 输入部分:4位拨码开关(乘数A) + 4位独立按键(乘数B)
- 输出部分:8个LED灯(乘积结果)
这种设计背后的硬件思维值得玩味:
// 硬件映射示例 input [3:0] sw_multiplier; // 拨码开关SW1-SW4 input [3:0] btn_multiplicand; // 按键KEY1-KEY4 output [7:0] led_product; // LED1-LED8交互逻辑对比表:
| 操作类型 | 传统仿真方式 | 本实验方案 | 体验优势 |
|---|---|---|---|
| 输入设置 | 修改测试文件参数 | 实时拨动开关 | 触觉反馈 |
| 结果查看 | 观察波形图 | LED亮灭组合 | 视觉直观 |
| 调试过程 | 重新编译仿真 | 即时硬件响应 | 成就感强 |
提示:实验前请确认开发板型号,常见Cyclone IV板卡的拨码开关电压一般为3.3V,LED为共阳接法
2. Quartus II工程搭建:从零开始的正确姿势
新建工程时,这些细节决定成败:
器件选择陷阱:
- Cyclone IV E系列选EP4CE6/EP4CE10
- 封装选QFP144或E144(常见实验箱配置)
文件结构规范:
/project │── /rtl │ └── multiplier.v │── /sim │ └── tb_multiplier.v └── /constraints └── pin_assignment.qsfVerilog模板优化:
module binary_multiplier ( input wire [3:0] a, // 被乘数(拨码开关) input wire [3:0] b, // 乘数(按键) output reg [7:0] p // 乘积(LED) ); // 组合逻辑实现 always @(*) begin p = a * b; // 直接使用运算符(综合器会自动优化) end endmodule常见编译错误排查:
- 错误"Can't resolve multiple constant drivers" → 检查是否有多个always块驱动同一信号
- 警告"Found pins functioning as undefined clocks" → 忽略未使用的时钟引脚
- 错误"Top-level design entity is undefined" → 右键设置当前文件为顶层实体
3. 引脚分配实战:避开那些"坑"
拿到实验箱原理图后,重点关注三个部分:
核心引脚映射表:
| 信号名称 | FPGA引脚 | 开发板物理位置 | 备注 |
|---|---|---|---|
| a[0] | PIN_34 | SW1 | 拨码开关最右侧 |
| a[1] | PIN_35 | SW2 | 需确认开关方向 |
| b[0] | PIN_153 | KEY1 | 按键通常低有效 |
| led[0] | PIN_156 | D1 | LED亮=逻辑1 |
引脚分配时的黄金法则:
- 先分配时钟引脚(如果有)
- 按功能模块分组分配
- 保留未使用引脚的默认设置
注意:某些实验箱的按键需要硬件消抖,可在代码中添加20ms延时检测
4. 烧录与调试:让LED说出答案
完成全编译后,进入最激动人心的硬件验证阶段:
烧录操作流程:
- 连接USB-Blaster到JTAG接口
- 开发板通电(注意电源指示灯)
- 在Quartus II中选择Tools > Programmer
- 添加生成的.sof文件
- 勾选Program/Configure选项
- 点击Start按钮
功能测试用例:
| 测试案例 | 拨码开关 | 按键输入 | 预期LED显示 | 实际结果 |
|---|---|---|---|---|
| 3×5 | 0011 | 0101 | 00001111 | |
| 15×15 | 1111 | 1111 | 11100001 | |
| 边界测试 | 1000 | 1000 | 01000000 |
遇到LED显示异常时,按这个顺序排查:
- 检查电源和下载线连接
- 确认引脚分配与原理图一致
- 用万用表测量开关通断
- 简化代码进行分段测试
5. 进阶优化:从能用走向好用
基础版本跑通后,可以尝试这些增强体验的改造:
版本对比方案:
| 特性 | 基础版 | 增强版 | 实现方法 |
|---|---|---|---|
| 输入方式 | 纯硬件 | 软硬结合 | 添加NIOS II软核 |
| 结果显示 | 二进制 | 十进制 | 增加BCD转换模块 |
| 计算速度 | 组合逻辑 | 流水线 | 插入寄存器阶段 |
流水线改造示例代码:
// 两级流水线乘法器 reg [3:0] a_reg, b_reg; reg [7:0] product; always @(posedge clk) begin // 第一级:锁存输入 a_reg <= a; b_reg <= b; // 第二级:输出结果 product <= a_reg * b_reg; end性能对比数据:
- 组合逻辑版本:最大时钟频率85MHz(Cyclone IV EP4CE10)
- 流水线版本:最大时钟频率可达125MHz
- 资源消耗增加约15%的LEs
最后分享一个调试小技巧:在Quartus II的SignalTap II中添加内部信号观测点,可以像逻辑分析仪一样实时抓取FPGA内部信号,比单纯依赖LED显示更高效。
