直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus
名称:直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus
软件:Quartus
语言:VHDL
功能介绍
本设计实现直流电机测速与 PWM 调速控制功能,顶层模块为 motor_ctrl_top,工程采用 VHDL 编写并在 Quartus 环境下组织。系统围绕电机控制实验常见需求展开,包含时钟分频、PWM 波形产生、速度测量以及七段数码管显示等功能模块,可用于学习 FPGA 对电机速度采集、控制信号生成和数据显示的完整实现流程。 设计中通过 tick_div 产生稳定的周期性 tick 脉冲,为后续速度统计、显示刷新或控制节拍提供基础时序;pwm_gen 负责输出 PWM 控制信号,通过占空比调节方式实现电机驱动控制;speed_measure 用于对电机反馈脉冲进行计数和速度换算;seg7_display 则用于将速度或相关数值以七段数码管形式显示出来。各模块分工清晰,便于单独阅读、修改和复用。 该工程适合用于 FPGA/VHDL 电机控制课程设计、EDA 实验拓展以及直流电机测速控制类项目参考。代码结构相比单一实验例程更完整,既包含底层时序节拍模块,也包含面向外设显示和电机控制的功能模块,便于理解从硬件输入、内部计数处理到输出控制显示的设计链路。运行环境
开发语言:VHDL 开发软件:Quartus 顶层模块:motor_ctrl_top 主要工程文件包含 Quartus 工程配置文件、VHDL 源码文件以及编译输出文件,可在 Quartus 中打开工程进行综合、编译和后续仿真配置。设计思路
系统采用模块化设计思路,将电机测速与调速功能拆分为多个相对独立的硬件逻辑单元。顶层 motor_ctrl_top 负责连接各功能模块,统一管理时钟、复位、PWM 输出、测速输入和显示输出等信号,使工程结构更利于调试和扩展。 时序部分由 tick_div 完成基础分频。FPGA 常用 50MHz 等高速系统时钟,直接用于低速控制和显示刷新并不方便,因此通过参数化分频模块产生固定周期 tick 脉冲。该 tick 信号可作为后续周期计数、速度采样或显示扫描的节拍基础,降低各功能模块对原始高速时钟的直接依赖。 PWM 调速部分通过 pwm_gen 生成周期性 PWM 波形。电机控制中常使用占空比改变平均驱动电压,从而实现速度调节;在 FPGA 中可通过计数器与占空比设定值比较的方式生成 PWM 输出。测速部分则通过 speed_measure 对反馈脉冲进行统计,在固定时间窗口内得到速度相关计数值,再交由显示模块输出。 显示部分采用 seg7_display,将内部速度数据或控制状态转换为七段数码管可识别的段选、位选信号。这样的结构使控制、测量和显示逻辑相互解耦,后续可以根据实验需求调整 PWM 参数、测速窗口、显示位数或数值格式。模块结构
主要模块结构如下: motor_ctrl_top:顶层模块,完成各子模块例化与系统信号连接。 tick_div:通用分频模块,按参数 DIVISOR 对输入时钟计数,输出单周期 tick 脉冲。 pwm_gen:PWM 生成模块,用于产生电机调速控制信号。 speed_measure:速度测量模块,用于统计电机反馈脉冲并形成速度相关数据。 seg7_display:七段数码管显示模块,用于显示速度或控制相关数值。 tb_motor_ctrl_top:顶层测试平台模块,用于工程仿真参考。演示视频
提供电机测速/控制演示视频,可用于查看工程运行效果和操作现象。仿真图/仿真说明/设计文档图片
设计文档包含 EDA/SOPC 实验平台相关说明、Quartus 工程建立、编译、管脚分配、仿真和下载流程等内容,并包含直流电机测速实验、步进电机驱动控制、数控分频器、数码管动态显示等相关实验章节,可作为理解本工程开发环境和实验流程的参考。 文档图片包含 Quartus 新建工程、器件选择、编译、Pin Planner 管脚分配、波形仿真、Programmer 下载等界面示意,以及实验平台连接和资源说明图片。





























部分代码
以下展示顶层模块 motor_ctrl_top 的部分代码,完整源码请下载压缩包查看。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
-- 通用分频模块:输入50MHz时钟,按参数DIVISOR计数,输出一个1个clk周期宽的tick脉冲
-- 1) DIVISOR是可修改的参数,表示多少个输入时钟周期产生一个tick脉冲
-- 2) 例如50MHz时钟,DIVISOR=50000时,tick频率约为1kHz(50_000_000 / 50_000 = 1000)
entity tick_div is
generic (
DIVISOR : integer := 50000 -- 分频系数,默认产生1kHz的tick
);
port (
clk : in std_logic; -- 输入时钟(例如50MHz)
rst_n : in std_logic; -- 低电平复位
tick : out std_logic -- 输出tick脉冲(一个clk周期宽)
);
end entity;
architecture rtl of tick_div is
signal cnt : integer range 0 to DIVISOR-1 := 0;
signal tick_r : std_logic := '0';
begin
tick <= tick_r;
process(clk, rst_n)
begin
if rst_n = '0' then
cnt <= 0;
tick_r <= '0';
elsif rising_edge(clk) then
if cnt = DIVISOR-1 then
cnt <= 0;
tick_r <= '1'; -- 计满时产生一个周期的高电平脉冲
else
cnt <= cnt + 1;
tick_r <= '0';
end if;
end if;
end process;
end architecture;
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus