直流电机测速与 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_genPWM 生成模块用于产生电机调速控制信号。 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时钟DIVISOR50000时tick频率约为1kHz50_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;代码获取点击下方公众号卡片