FPGA实战:从Verilog到DE2-115板载验证——4位全加器与3-8译码器的完整设计流程

张开发
2026/5/5 12:08:40 15 分钟阅读
FPGA实战:从Verilog到DE2-115板载验证——4位全加器与3-8译码器的完整设计流程
1. FPGA开发入门从理论到实战第一次接触FPGA开发的朋友可能会觉得这是个高大上的领域其实它就像搭积木一样有趣。我刚开始学习时也走过不少弯路今天就用最接地气的方式带大家完成两个经典案例——4位全加器和3-8译码器。这两个项目就像学习编程时的Hello World能帮你快速掌握FPGA开发的完整流程。FPGA现场可编程门阵列就像一块万能电路板我们可以通过硬件描述语言比如Verilog来定义它的功能。DE2-115开发板是Altera现在属于Intel推出的一款经典学习板卡上面集成了LED、开关、数码管等外设特别适合初学者练手。这次我们要用的Quartus II软件就像是FPGA界的Visual Studio集成了代码编辑、仿真、下载等全套工具。在开始前建议准备好以下环境Quartus II 18.0或更新版本我用的是18.1标准版DE2-115开发板及配套USB线安装好USB-Blaster驱动一颗愿意动手实践的心2. 四位全加器的实现2.1 全加器基础原理全加器是数字电路中最基础的运算单元就像做加法时的个位相加。想象你在做笔算加法不仅要计算当前位的两个数字还要考虑前一位的进位。一位全加器就是完成这个过程的电路它有3个输入加数A、加数B、进位Cin2个输出和Sum、进位Cout。真值表是这个样子的ABCinSumCout0000001010100101100100110011011010111111四位全加器就是把四个一位全加器串联起来就像把四个算盘串在一起做多位加法。在实际项目中我们常用74LS283这类芯片实现但今天要用Verilog自己造一个。2.2 Verilog代码实现打开Quartus II新建工程时要注意几个关键点工程路径不要有中文或空格设备选择Cyclone IV EP4CE115F29C7这是DE2-115的FPGA型号仿真工具选ModelSim-Altera创建完工程后新建Verilog文件输入以下代码module full_adder4( input[3:0] a, // 4位加数A input[3:0] b, // 4位加数B input cin, // 进位输入 output[3:0] sum, // 4位和输出 output cout // 进位输出 ); // 直接使用运算符实现 assign {cout, sum} a b cin; endmodule这段代码的精妙之处在于用了拼接运算符{}把进位cout和sum组合成一个5位结果。保存文件时建议用英文命名比如fa4.v。编译通过后点击Tools - Netlist Viewers - RTL Viewer你会看到一个自动生成的电路图。我第一次看到时特别兴奋——这就是我的代码变成的硬件电路2.3 功能仿真验证仿真就像给电路做彩排能提前发现问题。新建Vector Waveform File(.vwf)添加所有输入输出信号右键点击a、b信号选择Count Value设置测试值给cin设置几个高低电平变化点击Processing - Start Simulation观察sum和cout的变化是否符合预期。比如当a4b0101(5)b4b0011(3)cin1时sum应该是4b1001(9)cout0。2.4 硬件下载与测试在DE2-115上我们用板载开关作为输入LED显示输出引脚分配a[3:0] - SW[3:0]b[3:0] - SW[7:4]cin - SW[8]sum[3:0] - LEDR[3:0]cout - LEDR[4]下载步骤确保USB-Blaster驱动已安装开发板通电USB线连接电脑点击Programmer添加.sof文件勾选Program/Configure点击Start测试时拨动开关组合观察LED显示。比如SW[3:0]0101SW[7:4]0011SW[8]1时LED[3:0]应该显示1001LED[4]不亮。3. 3-8译码器的设计与实现3.1 译码器工作原理3-8译码器就像个智能开关3个输入控制8个输出。想象你有3个开关可以组合出8种状态每种状态只点亮对应的一个灯泡。这在计算机系统中非常常见比如内存地址译码。真值表如下CBAY7Y6Y5Y4Y3Y2Y1Y000000000001001000000100100000010001100001000100000100001010010000011001000000111100000003.2 Verilog实现方案新建工程时记得选择相同型号的FPGA。这里给出两种实现方式方案一case语句实现module decoder_3_8( input a, b, c, // 3位输入 output reg [7:0] out // 8位输出 ); always (a, b, c) begin case({c,b,a}) // 拼接成3位 3b000: out 8b00000001; 3b001: out 8b00000010; 3b010: out 8b00000100; 3b011: out 8b00001000; 3b100: out 8b00010000; 3b101: out 8b00100000; 3b110: out 8b01000000; 3b111: out 8b10000000; endcase end endmodule方案二位移运算实现module decoder_3_8( input [2:0] in, output [7:0] out ); assign out 1 in; // 左移运算 endmodule第二种写法更简洁但可能对初学者不太直观。建议先用第一种方案理解后再尝试优化。3.3 数码管显示实现DE2-115上有6个7段数码管我们可以用它们直观显示译码结果修改引脚分配a - SW[0]b - SW[1]c - SW[2]out[7:0] - HEX0的段选信号数码管驱动 需要将out信号连接到数码管的段选端。注意DE2-115的数码管是共阳极的所以输出0表示点亮。测试效果 拨动SW[2:0]观察HEX0显示的数字变化。比如SW3b011时应该显示数字3的段码。4. 常见问题与调试技巧4.1 驱动安装问题很多同学卡在USB-Blaster驱动安装这一步。如果设备管理器里显示黄色感叹号试试右键更新驱动手动指定到Quartus安装目录的drivers文件夹如果还不行尝试以管理员身份运行Quartus4.2 引脚分配冲突DE2-115的引脚功能是固定的分配时要注意避免将普通IO分配给时钟引脚数码管、LED、开关的引脚号可以在板子手册里查到建议使用Assignment Editor工具可视化分配4.3 仿真波形异常如果仿真结果不对检查输入激励是否覆盖所有情况时序设置是否正确时间单位、仿真时长代码中的信号位宽是否匹配4.4 实际硬件不工作下载后没反应时检查开发板供电指示灯确认.sof文件下载成功尝试按下板子的复位键用万用表测量关键引脚电压记得我第一次做实验时因为忘记打开开发板电源调试了半天才发现问题。这些小细节往往最容易忽略。5. 项目进阶与扩展完成基础功能后可以尝试这些增强功能全加器扩展添加BCD码转换功能实现带溢出检测的8位加法器用按键控制运算使能译码器扩展添加使能控制端实现4-16译码器用PWM控制LED亮度系统集成将两个模块整合到一个工程用按键切换运算模式在数码管上显示当前模式比如可以改造译码器代码增加使能端module decoder_3_8_en( input en, // 使能信号 input [2:0] in, output reg [7:0] out ); always (*) begin if(!en) out 8b00000000; // 禁用时全0 else case(in) 3b000: out 8b00000001; // ...其他case保持不变 endcase end endmodule这些扩展练习能帮你更深入理解FPGA设计思想。我在学习过程中发现实际动手修改代码、观察硬件变化比单纯看书理解得更快。

更多文章