当前位置: 首页 > news >正文

用Verilog在Quartus II里手搓一个4位乘法器:从原理图到FPGA烧录全流程

从零手搓4位乘法器:Verilog+Quartus II实战指南

第一次在FPGA上实现数字电路时,那种看到LED灯按预期亮起的成就感至今难忘。本文将带你完整走一遍四位乘法器的实现流程,从Verilog代码编写到最终烧录,过程中遇到的每个坑都会详细说明。不同于教科书式的实验报告,这里聚焦的是真实项目开发中那些没人告诉你的细节。

1. 理解乘法器的核心逻辑

四位乘法器的本质是将两个4位二进制数相乘,得到一个8位的结果。在数字电路领域,实现乘法运算主要有两种思路:

  • 组合逻辑实现:通过门电路直接计算,延迟固定但资源占用较多
  • 流水线实现:分多个时钟周期完成,适合高速连续运算

对于初学者,组合逻辑是更好的起点。其核心原理可以用这个例子说明:

假设A=1101(13),B=1011(11),计算过程如下:

1101 (A) × 1011 (B) ------- 1101 (B[0]=1, 结果加上A<<0) 1101 (B[1]=1, 结果加上A<<1) 0000 (B[2]=0, 不加) 1101 (B[3]=1, 结果加上A<<3) ------- 10001111 (143)

Verilog实现时需要注意三个关键点:

  1. 位宽处理:4位输入需要8位输出寄存器
  2. 移位操作:使用<<运算符实现位置对齐
  3. 条件判断:仅当乘数位为1时才累加部分积

提示:实际电路中并没有真正的"乘法",而是通过移位和加法组合实现的,这与CPU中的ALU工作原理类似。

2. Verilog代码编写实战

打开Quartus II新建工程后,创建名为mult4x4.v的Verilog文件。以下是经过实际验证的代码版本,包含常见错误防范:

module mult4x4( input [3:0] A, // 被乘数,接拨码开关 input [3:0] B, // 乘数,接按键 output reg [7:0] R // 结果,接LED ); always @(*) begin R = 8'b0; // 初始化结果寄存器 for (int i=0; i<4; i=i+1) begin if (B[i]) R = R + (A << i); // 关键运算逻辑 end end endmodule

这段代码有几个易错点需要特别注意:

  1. 寄存器初始化:必须在使用前清零,否则会产生锁存器
  2. 敏感列表:使用@(*)自动包含所有输入信号
  3. 循环变量:现代Verilog支持int类型,比integer更规范

保存后将其设为顶层实体(右键文件→Set as Top-Level Entity),然后进行首次编译。如果遇到这些错误:

  • Error (10170):通常是缺少分号或括号不匹配
  • Warning (10240):未使用的信号,检查端口声明

3. ModelSim仿真技巧

仿真能提前发现90%的逻辑错误。新建mult4x4_tb.v测试文件:

`timescale 1ns/1ns module tb_mult4x4; reg [3:0] A, B; wire [7:0] R; mult4x4 uut (.*); // 自动连接端口 initial begin // 测试用例1:3×5 A = 4'b0011; B = 4'b0101; #10; // 测试用例2:15×15 A = 4'b1111; B = 4'b1111; #10; // 边界测试:0×0 A = 4'b0000; B = 4'b0000; #10; $stop; end endmodule

在ModelSim中运行后,正确的波形应该显示:

时间(ns)ABR
0-100011010100001111
10-201111111111100001
20-300000000000000000

如果发现输出全为X(未知值),通常是:

  • 寄存器未初始化
  • 敏感列表遗漏信号
  • 端口连接错误

4. 管脚分配与电路连接

根据常见的DE10-Standard开发板,推荐管脚分配如下:

信号管脚号开发板位置
A[0]PIN_34SW1
A[1]PIN_33SW2
A[2]PIN_31SW3
A[3]PIN_30SW4
B[0]PIN_24KEY1
B[1]PIN_25KEY2
B[2]PIN_26KEY3
B[3]PIN_27KEY4
R[0]PIN_156LED1
.........
R[7]PIN_161LED8

在Assignment Editor中输入这些映射后,需要特别注意:

  1. 电压标准:确保IO Standard设置为3.3V LVTTL
  2. 弱上拉:按键输入建议启用Weak Pull-Up
  3. 保留管脚:设为As input tri-stated

生成原理图时,总线连接的正确方式是:

  1. 右键Verilog文件→Create Symbol Files
  2. 新建Block Diagram/Schematic File
  3. 添加生成的符号,用总线工具连接(名称后加[n..0])

5. 烧录与调试实战

编译成功后,连接USB-Blaster下载器:

  1. 点击Programmer→Auto Detect选择FPGA型号
  2. 添加输出的.sof文件
  3. 勾选Program/Configure后点击Start

常见问题解决方案:

问题现象可能原因解决方法
No Hardware detected驱动未安装安装Altera USB-Blaster驱动
JTAG communication error接触不良或线缆问题检查连接,更换下载线
配置成功后无反应管脚冲突或时钟未设置检查全局复位和时钟分配

实际测试时,建议按这个顺序验证:

  1. 输入0×0确认所有LED熄灭
  2. 输入1×1检查最低位LED
  3. 输入15×15验证所有LED亮
  4. 随机组合测试如5×3、10×6等

当发现结果偏差时,用这个排查流程:

  1. 检查ModelSim波形是否正常
  2. 确认管脚分配与物理连接一致
  3. 用SignalTap II逻辑分析仪抓取实际信号

最后分享一个调试技巧:在代码中添加以下临时输出,可以通过开发板上的蜂鸣器快速定位问题点:

assign debug = (A == 4'b0000) && (B == 4'b0000) && (R != 8'b00000000);

这个项目最让我意外的是,看似简单的乘法器在实际硬件实现时会遇到这么多细节问题。最初版本因为忘记初始化寄存器,导致结果随机波动,花费了两小时才找到原因。这也正是硬件设计的魅力所在——每个细节都直接影响最终结果。

http://www.zskr.cn/news/1431855.html

相关文章:

  • 用过才敢说!2026年不容错过的专业AI论文平台
  • 2026年知名的安徽石灰粉/江苏灰钙粉(涂料专用)/上海氧化钙粉/浙江氧化钙长期合作厂家推荐 - 行业平台推荐
  • GPT-4与GPT-3.5实战选型指南:从核心能力到成本效益的深度对比
  • C# TabControl关闭按钮避坑指南:解决重绘闪烁、事件冲突与内存泄漏
  • 避开这些坑!寒武纪MLU平台BANG C编程实战中的内存与同步陷阱
  • 2026年质量好的步进电机驱动器/混合式步进电机/42步进电机稳定供货厂家推荐 - 行业平台推荐
  • 2026年品质上乘的深冲铝镁锌板/家电铝镁锌板/高锌层铝镁锌板/龙骨铝镁锌板高口碑品牌推荐 - 品牌宣传支持者
  • 山东专升本资料推荐|英语计算机语文高数真题精练
  • 2026年热门的CSP/连续封闭涂层彩涂板/彩涂卷/彩钢板精选厂家推荐 - 行业平台推荐
  • 别再暴力循环了!用Python高效计算水仙花数的3个优化技巧(附N=7实战)
  • Gemini安全审计报告曝光:5类未公开API权限绕过漏洞,附PoC验证脚本及修复优先级排序
  • 解决TarDAL复现中CUDA/cuDNN符号查找错误的保姆级排坑指南
  • 别再只改权限了!PHP会话报错‘O_RDWR failed’的5个深层原因与排查清单
  • 从工具反噬到深度工作:程序员如何用自动化与GTD对抗数字异化
  • TC3xx启动代码深度排雷:从BROM到core0_main,那些手册里没明说的调试经验
  • 从session.save_path到ini_set:深入理解PHP会话存储的三种配置方式及最佳实践
  • 从信号处理到AI求解器:傅立叶变换如何革新了科学计算?
  • 别再轻信“无痕搜索”!拆解5大AI引擎的隐私声明话术陷阱,附12条法律级自查清单(含截图取证模板)
  • LangChain4j 开发Java Agent智能体- 阿里云百炼大模型平台接入以及Ollama简介以及安装和使用
  • 工业语音识别:从降噪到领域自适应,攻克垂直行业落地挑战
  • 别再只盯着USB硬盘盒了!用闲置电脑给群晖/威联通NAS扩容,打造高性价比‘分布式存储’
  • Hologres V2.1版本建表避坑指南:从‘能用’到‘好用’的五个关键配置
  • 【Gemini定价策略深度解密】:20年云AI商业分析师亲授Google最新定价逻辑与成本规避技巧
  • 搞定RK3566安卓11的RTL8211F网卡后,别忘了用iperf3测速和点亮LED状态灯
  • 仿人机器人分层控制框架:ALIP与DSRB模型实践
  • 从天文数字到纳米尺度:用Python科学计数法轻松处理极端数据(附Jupyter Notebook)
  • HCNR201A vs 运放隔离:在电机控制或传感器采集场景下,如何选择你的模拟信号隔离方案?
  • 非接触式同步电机转子励磁系统的辨识建模与动态分析建模【附代码】
  • OpenCV滤波器选型指南:人脸美化用双边滤波,去椒盐噪声用中值,边缘检测Sobel和Canny怎么选?
  • BOLT技术:基于HBM的无感映射安全加速方案