尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
FPGA循迹小车设计:Verilog实现传感器决策与PWM调速
简介这份资源面向FPGA入门与进阶学习者、电子设计竞赛选手及嵌入式方向学生提供一套基于Verilog与Quartus II的循迹小车完整工程用于解决从红外传感器数据采集、方向决策到电机控制的硬件逻辑设计问题。压缩包共137个文件、约4.57MB以Quartus II工程文件为主包括qpf、qsf工程配置v源文件与vt、vmake仿真相关文件sof、pof比特流以及大量cdb、hdb、rdb等综合与布局布线中间数据库和rpt报告另含readme说明与testbench验证材料覆盖设计输入、综合、仿真到下载的完整流程。已有3233人学习下载说明其在同类项目中具备较高参考价值。读者可据此理解红外循迹原理、Verilog控制逻辑写法与Quartus II工程组织方式借助testbench仿真在硬件调试前排查问题并参考现成工程结构快速搭建自己的小车控制系统。1. 需求先立住为什么循迹小车要用 FPGA 而不是单片机做循迹小车这个题目多数人第一反应是找块单片机几行 PWM 加红外对管就收工。但如果你在课程设计或毕设里被要求用 Verilog 在 Quartus II 里从零搭一套数字系统单片机路线就交不了差——评审要看的不是“车能跑”而是“你有没有用硬件描述语言把感知、决策、执行这条链路拆成可综合的模块”。这套方案要解决的核心问题是把循迹小车当成一个完整的 FPGA 数字系统来做红外传感器阵列输入、循迹决策逻辑、PWM 电机驱动、数码管状态显示全部用 Verilog 写成可综合代码在 Quartus II 里完成综合、引脚分配、下载验证。适合正在做 FPGA 课设、数字系统设计毕设或者想拿一个完整项目练手 Verilog 分层设计的人。下面按需求、架构、模块实现、避坑、验收的顺序讲透。2. 总体方案设计四层结构与模块职责划分2.1 从传感器到轮子的信号链路循迹小车的本质是一条闭环传感器看到黑线位置决策模块判断偏差方向PWM 模块调节左右轮占空比电机执行转向车身姿态变化又反馈给传感器。用 FPGA 做这件事关键是把这条链路切成时钟域清晰、接口固定的模块而不是把所有逻辑塞进一个 always 块。我一般把系统分成四层。第一层是输入调理层负责红外对管原始信号的同步与消抖因为传感器输出带毛刺直接进决策逻辑会让小车在直道上左右抽搐。第二层是决策层根据多路传感器的组合状态输出转向指令这是整个项目里唯一带“智能”的部分也是最容易写成一坨 if-else 的地方。第三层是执行层把转向指令翻译成左右轮 PWM 占空比并保证死区时间防止电机驱动桥直通。第四层是人机接口层用数码管或 LED 显示当前传感器状态和占空比调试阶段这层比什么都重要。四层之间只通过明确的信号线连接传感器同步后的电平、决策输出的方向枚举、PWM 的占空比寄存器值。接口定死之后每个模块可以单独仿真出问题能快速定位是哪一层。这套分层不是为了好看是血泪经验——早期我把消抖和决策写在一起车在黑白边界抖动时根本分不清是传感器脏了还是逻辑写错了。2.2 时钟与复位策略FPGA 板载晶振通常是 50MHz而 PWM 频率只需要几 kHz 到十几 kHz传感器采样更慢。方案里用一个分频链产生三档使能信号1kHz 给传感器同步采样20kHz 给 PWM 计数1Hz 给数码管扫描。注意这里用的是“使能”而不是“分频出多个时钟”全系统尽量跑在单一 50MHz 时钟下靠时钟使能控制节奏。多时钟域会引入跨时钟域同步问题对课设规模来说是自找麻烦。复位采用低电平异步复位、同步释放的常规写法复位按键加一级同步器消抖。下面这段是时钟使能生成的核心逻辑参数化设计方便改板子// 时钟使能生成单时钟域多档使能 module clk_en_gen #( parameter CLK_FREQ 50_000_000 // 板载时钟频率 )( input wire clk, input wire rst_n, output reg en_1k, // 传感器采样使能 output reg en_20k, // PWM 计数使能 output reg en_1hz // 数码管刷新使能 ); reg [15:0] cnt_1k; reg [11:0] cnt_20k; reg [25:0] cnt_1hz; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt_1k 16d0; cnt_20k 12d0; cnt_1hz 26d0; en_1k 1b0; en_20k 1b0; en_1hz 1b0; end else begin // 1kHz计到 CLK_FREQ/1000 - 1 翻转一次 en_1k (cnt_1k (CLK_FREQ/1000 - 1)); cnt_1k en_1k ? 16d0 : cnt_1k 1b1; en_20k (cnt_20k (CLK_FREQ/20000 - 1)); cnt_20k en_20k ? 12d0 : cnt_20k 1b1; en_1hz (cnt_1hz (CLK_FREQ - 1)); cnt_1hz en_1hz ? 26d0 : cnt_1hz 1b1; end end endmodule这段代码的关键点是所有计数器都在同一个时钟沿下工作使能信号只持续一个时钟周期下游模块用if (en_1k)判断即可。参数CLK_FREQ改成实际板子的晶振频率就能复用换板子不用改逻辑。计数器位宽要按最大计数值留够1Hz 那档在 50MHz 下需要 26 位少一位就会溢出导致刷新频率翻倍这种位宽算错在综合时不会报错只会在板子上表现为数码管闪得不对劲属于典型的玄学问题。2.3 引脚分配与板级约束Quartus II 里引脚分配是绕不过去的一步传感器输入、电机 PWM 输出、数码管段选位选、复位按键、晶振每一根都要在 Pin Planner 里对应到实际管脚。我的习惯是先画一张引脚对照表把信号名、方向、管脚号、电平标准写清楚再往 Quartus 里填避免边填边忘。电机驱动板的 PWM 输入通常要求 3.3V 逻辑如果 FPGA 的 IO bank 电压设成 2.5VPWM 高电平可能推不动驱动芯片表现为电机转但没劲这种问题查代码查不出来得看电平标准。3. 核心模块实现传感器决策与 PWM 调速3.1 红外阵列同步与消抖循迹常用的方案是五路或七路红外对管中间一路对准黑线两侧对称分布。原始信号进 FPGA 后先打两拍同步再用计数器做消抖连续 N 次采样值一致才更新输出。N 取 8 到 16 之间对应 1kHz 采样下 8 到 16ms 的稳定窗口能滤掉大部分路面反光和传感器抖动。// 单路传感器同步消抖五路例化五次 module sensor_debounce #( parameter STABLE_CNT 8 // 连续一致次数 )( input wire clk, input wire rst_n, input wire en_sample, // 1kHz 采样使能 input wire raw_in, // 传感器原始输入 output reg clean_out // 消抖后输出 ); reg raw_d1, raw_d2; reg [3:0] stable_cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin raw_d1 1b0; raw_d2 1b0; stable_cnt 4d0; clean_out 1b0; end else begin raw_d1 raw_in; raw_d2 raw_d1; // 两级同步消除亚稳态 if (en_sample) begin if (raw_d2 clean_out) stable_cnt 4d0; else if (stable_cnt STABLE_CNT - 1) begin clean_out raw_d2; stable_cnt 4d0; end else stable_cnt stable_cnt 1b1; end end end endmodule两级触发器同步是跨时钟域输入的标准做法虽然传感器信号严格说不算异步时钟域但机械触点式的红外模块输出边沿很脏同步加消抖一起做最稳。STABLE_CNT调大抗干扰更强但响应变慢车跑快了会冲过弯道调小则容易误判通常五路传感器配 8 次消抖是平衡点。3.2 循迹决策逻辑的状态编码五路传感器从左到右记为 S4 S3 S2 S1 S0黑线压住哪几路就代表车身相对线的偏移。决策模块把 5 位传感器状态映射成五种转向指令急左、左、直行、右、急右。用 case 语句穷举 32 种组合太啰嗦实际只关心有效组合其余按直行或保持上一状态处理。// 五路传感器决策输出方向枚举 module track_decision ( input wire [4:0] sensor, // {S4,S3,S2,S1,S0}1 表示检测到黑线 output reg [2:0] dir // 0急左 1左 2直行 3右 4急右 ); always (*) begin case (sensor) 5b00100: dir 3d2; // 中间压线直行 5b01100, 5b01000: dir 3d1; // 偏右向左修正 5b00110, 5b00010: dir 3d3; // 偏左向右修正 5b11000, 5b10000: dir 3d0; // 严重偏右急左 5b00011, 5b00001: dir 3d4; // 严重偏左急右 5b11111: dir 3d2; // 全黑路口或停车线直行 default: dir 3d2; // 丢线保持直行交给丢线保护 endcase end endmodule这里有个设计取舍全黑和全白都归到直行但实际场景里全白意味着丢线应该减速或停车。我的做法是在决策模块外再挂一个丢线计数器连续 200ms 五路全白就强制停车避免车冲出赛道。决策逻辑本身保持纯组合、无状态方便单独仿真穷举所有输入。3.3 PWM 占空比映射与死区方向指令到左右轮占空比的映射用查表实现直行时左右都是 60%左转时左轮降到 30%、右轮保持 70%急转时一侧降到 10%。占空比分辨率取 8 位PWM 频率 20kHz计数器 0 到 249 循环比较值来自占空比寄存器。// 双路 PWM 生成带死区 module pwm_dual #( parameter PERIOD 250 // 20kHz 50MHz 使能 )( input wire clk, input wire rst_n, input wire en_20k, input wire [7:0] duty_l, // 左轮占空比 0-100 input wire [7:0] duty_r, output reg pwm_l, output reg pwm_r ); reg [7:0] cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin cnt 8d0; pwm_l 1b0; pwm_r 1b0; end else if (en_20k) begin cnt (cnt PERIOD - 1) ? 8d0 : cnt 1b1; // 占空比按百分比换算到计数值 pwm_l (cnt (duty_l * PERIOD / 100)); pwm_r (cnt (duty_r * PERIOD / 100)); end end endmodule死区在电机驱动桥里通常由硬件保证如果驱动板没有死区控制就得在 PWM 输出上做互补对加延时这个项目用的是成品驱动模块硬件已含死区所以代码里只做单路 PWM。duty_l * PERIOD / 100这种乘除在综合时会展开成常量和移位PERIOD 是参数不影响可综合性但如果 PERIOD 不是 2 的幂综合器会生成乘法器资源紧张时可以改成预计算查找表。3.4 数码管状态显示调试阶段数码管显示三样东西五路传感器状态、当前方向指令、左右占空比。用 1kHz 扫描四位共阴数码管位选轮流拉低段选输出对应字形。这层逻辑简单但引脚多Quartus 引脚分配时容易和 PWM 输出抢管脚提前在 Pin Planner 里锁定能省不少返工。4. 避坑与排查五个最容易翻车的点4.1 综合通过但板子上车不动现象是 Quartus 编译零错误下载后电机完全不转。原因多半是引脚分配漏了或者分配到了专用配置管脚。解决方法是打开 Pin Planner 逐项核对特别检查 PWM 输出是否落在普通 IO 上配置管脚和时钟专用脚不能挪作他用。另外确认驱动板供电和 FPGA 共地不共地时 PWM 信号没有参考电平驱动芯片识别不到高电平。4.2 小车直道左右抽搐现象是车在直线上频繁小幅修正像喝醉。原因是传感器消抖窗口太短或者决策逻辑对边界组合处理不当。解决方法是把STABLE_CNT从 8 调到 16同时在决策 case 里给相邻组合加迟滞从直行进入左转的阈值和从左转退回直行的阈值错开避免在临界点反复跳变。这个迟滞用一个小状态机实现比纯组合查表稳得多。4.3 转弯冲过黑线丢线现象是车到弯道直接冲出去丢线保护才停车。原因是转向占空比差值不够或者 PWM 频率太低导致电机响应迟滞。解决方法是加大急转时两侧占空比差急转一侧降到 10% 另一侧拉到 80%同时把 PWM 频率从 5kHz 提到 20kHz减少电机电流纹波带来的低速抖动。车速整体降下来也是办法直行占空比从 60% 降到 50%用时间换稳定性。4.4 数码管显示乱码或闪烁现象是数码管某几位不亮或者整体闪烁。原因是扫描频率和位选时序不匹配或者段选译码表写错。解决方法是确认扫描使能是 1kHz 且每位停留时间均等段选译码用 case 穷举 0 到 9 和几个特殊字符别用算术运算凑字形。共阴共阳搞反也会导致全亮或全灭对照数码管手册确认公共端接法。4.5 复位后状态不确定现象是上电后车偶尔乱跑一下才正常。原因是寄存器初值依赖复位而复位按键释放有抖动或者某些寄存器没写复位分支。解决方法是所有时序 always 块统一用异步复位复位信号进芯片前加 RC 加施密特整形代码里每个 reg 都在复位分支赋初值。综合报告里检查有没有“无复位寄存器”的警告有就补上。5. 验收与答辩怎么证明这套系统真的跑通了验收不是把车放地上跑一圈就完事评审要看到可复现的证据链。我一般按三步走。第一步是仿真验收用 ModelSim 或 Quartus 自带仿真器对决策模块和 PWM 模块做波形验证穷举五路传感器的有效组合截图保存输入输出对应关系证明逻辑正确性不依赖实物。第二步是分级联调先只焊传感器和数码管验证采样和显示再接电机驱动用固定占空比验证转向最后合入决策逻辑跑全程。每一步留视频答辩时按顺序放比口头描述有说服力。第三步是极限测试把车放在黑白边界、急弯、断线三种场景下各跑五次记录丢线次数和停车响应时间用数据说明鲁棒性。答辩时最容易被问的是“为什么用 FPGA 不用单片机”回答要落到具体设计上FPGA 的并行性让五路传感器可以同时采样消抖PWM 双路输出互不干扰决策逻辑是纯硬件组合没有指令周期抖动这些是单片机分时复用做不到的。另一个高频问题是资源占用提前从 Quartus 编译报告里导出逻辑单元、寄存器、引脚的使用率说明还有多少余量可以扩展。下面这张表是我验收时用的检查清单照着过一遍基本不会漏项检查项通过标准验证方式传感器采样五路独立消抖无串扰遮挡单路看数码管对应位决策逻辑32 种输入组合输出符合预期仿真波形穷举PWM 输出占空比误差小于 2%示波器测高低电平时间循迹全程标准赛道连续跑 10 圈不丢线实车计时记录丢线保护全白 200ms 内停车人为抬车测试复位可靠性上电复位 20 次无异常反复断电上电从那以后我每次带这类项目都强制要求先出仿真波形再上板实物跑通只是最后一步波形对了心里才有底。这套方案的完整工程包含 Verilog 源码、Quartus II 工程文件、引脚分配表和仿真测试文件按上面的模块划分组织改板子只需调整顶层参数和引脚表。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

深入解析线程基础与高级并发编程技术

深入解析线程基础与高级并发编程技术

1. 线程基础概念解析 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。理解线程首先要从它与进程的关系入手。 进程是程序的一次执行过程,拥有独立的内存空间和系统资源。而线程则是进程内部的一个执…

📅 2026/10/30 8:40:54
基于YOLOv12的智能垃圾分类系统开发实践

基于YOLOv12的智能垃圾分类系统开发实践

1. 项目概述:基于YOLOv12的固体垃圾智能识别系统 这个项目是我最近完成的一个很有意思的计算机视觉应用 - 使用最新的YOLOv12目标检测算法来实现固体垃圾的自动识别和分类。整套系统包含完整的深度学习模型训练流程、基于PyQt5开发的用户界面、以及实用的登录注册功…

📅 2026/10/30 8:40:54
互联网医院系统架构设计与核心功能实现

互联网医院系统架构设计与核心功能实现

1. 互联网医院系统落地全景解析 医疗数字化转型浪潮下,互联网医院系统已成为医疗机构标配。一套成熟的源码解决方案需要打通三个核心维度:技术架构必须支持高并发医疗数据交互,业务逻辑要完整覆盖诊前-诊中-诊后全流程,合规性则需…

📅 2026/10/30 8:40:54
MORE NEWS

更多资讯

📰

GA-VMD参数优化实战:遗传算法自动搜索K与α的Python实现

简介:这份资源面向信号处理、故障诊断与优化算法方向的学习者和研究者,提供用遗传算法自动寻优变分模态分解(VMD)关键参数的Python实现。VMD的模态个数K与正则化参数α直接决定分解质量,人工试凑效率低,而遗…

📰

大规模MIMO LS信道估计MATLAB代码详解与避坑实践

简介:面向大规模MIMO系统研究的LS信道估计算法Matlab仿真实例,核心解决多天线场景下信道状态信息获取问题,适合无线通信方向高年级本科生与研究生对照学习,也适合作为课程设计或毕业设计的前期验证工具。资源包共10个文件&#xf…

📰

MATLAB LSTM回归预测实战:从数据准备到贝叶斯调参完整指南

简介:这份资源面向需要掌握时序数据回归预测的机器学习初学者与工程人员,提供基于MATLAB实现的长短期记忆神经网络(LSTM)完整代码与配套说明。LSTM作为循环神经网络的变体,通过门控单元与记忆单元有效捕捉序列中的长期…

📰

Paperclip:面向 React 的轻量级 AI 智能体运行时框架

1. “Paperclip”不是回形针:一个被误读的开源项目代号最近在几个技术社区里频繁看到“paperclip”这个词,尤其和 Node.js、React、AI agents 这些关键词一起出现。有人以为是某个新出的 UI 组件库,有人猜是 React 的 Hooks 封装工具&#xf…

📰

Redis生产环境部署与优化全指南

1. Redis安装部署核心思路解析Redis作为当前最流行的内存数据库之一,其安装部署过程看似简单却暗藏诸多技术细节。根据我多年运维经验,完整的Redis部署需要经历源码获取、环境准备、编译安装、配置调优和服务管理五个关键阶段。不同于简单的apt-get inst…

📰

Python+OpenCV车道线检测:从图像处理到视频流实时识别的完整实践

简介:面向课程设计与毕业设计的车道线检测项目,基于Python语言和OpenCV库开发。代码覆盖图像加载、灰度化、高斯滤波、边缘检测、感兴趣区域截取、霍夫直线提取、车道线拟合与结果叠加等完整流程,同时支持图片和视频两种输入,并提…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬