六步骤流程控制器 VHDL Quartus
名称:六步骤流程控制器 VHDL Quartus
软件:Quartus
语言:VHDL
功能介绍
这是一个基于VHDL和Quartus的多步骤流程控制工程,适合实现具有固定工序、定时执行和重复次数要求的控制任务。系统通过启动按键开始运行,依次执行六个步骤,并在数码管上输出当前单次倒计时,同时提供步骤编号、毫秒级进度和流程结束指示信号。 工程将控制逻辑、数码管译码和LED驱动拆分为独立模块。流程控制器负责状态机、计时和重复执行;seg7_encoder负责倒计时数字到七段显示码的转换;led_driver根据过程进度产生LED显示效果;顶层模块完成各部分连接,测试平台work_controller_tb用于仿真验证。该结构便于学习VHDL时序逻辑、状态机设计、计数器以及多模块层次化集成。运行环境
开发语言:VHDL 开发软件:Intel Quartus 工程顶层:work_controller_top 输入时钟:10Hz,单拍时间为100ms 主要工程文件:work_controller_top.qsf、process_controller.vhd、seg7_encoder.vhd、led_driver.vhd、work_controller_tb.vhd及顶层VHDL文件。设计思路
本设计将完整流程划分为空闲、运行和结束三种状态,由process_controller统一管理启动、复位、步骤切换、单次计时和重复次数。start_key通过保存上一拍状态进行上升沿检测,避免按键保持高电平时重复触发;rst_n为低电平同步复位,系统复位后回到IDLE状态并清零步骤、计时和结束指示。 流程共有六个步骤,每个步骤具有独立的单次时长和重复次数:第一步6秒,第二步12秒并重复2次,第三步24秒,第四步8秒并重复3次,第五步10秒,第六步5秒。运行期间以10Hz时钟为基础,每拍累加100ms;当当前单次时长完成时,优先判断是否还有剩余重复次数,若有则清零本次计时并继续当前步骤,否则进入下一步骤。第六步完成后进入DONE状态并点亮结束指示灯,同时保留重新按键启动新流程的能力。 控制模块对外提供当前步骤号、倒计时十位和个位、当前单次已用毫秒以及结束指示信号。elapsed_ms可用于驱动LED动画,倒计时数字交由数码管显示模块处理,使流程控制、显示译码和LED驱动之间保持清晰的功能边界。模块结构
工程顶层为work_controller_top,主要由以下模块组成: 1. process_controller:核心流程控制模块,管理IDLE、RUNNING、DONE状态,完成启动沿检测、复位、步骤计时、重复次数判断和结束状态控制。 2. seg7_encoder:将控制模块输出的十位和个位数字转换为数码管显示信号。 3. led_driver:依据当前步骤和elapsed_ms等过程信号驱动LED显示,用于呈现流程进度或动画效果。 4. work_controller_tb:测试平台,用于对顶层控制流程及各模块连接进行仿真激励。 5. work_controller_top:工程顶层封装,负责时钟、复位、启动按键、数码管和LED接口之间的连接。演示视频
配套演示视频展示了工程运行过程,可用于了解流程启动、步骤切换、重复执行、数码管倒计时以及结束指示的整体效果。视频与工程文件配合使用,便于在导入Quartus工程后对照检查各模块信号和显示状态。仿真图/仿真说明/设计文档图片
工程配套设计文档包含工程文件说明、程序结构、编译结果、RTL结构图、顶层仿真图以及控制模块、LED驱动模块和数码管显示模块的说明。工程目录同时提供process_controller、led_driver和顶层相关的波形工程文件,可用于在Quartus仿真环境中观察启动沿、步骤切换、重复计时、倒计时输出和结束状态等关键信号。













部分代码
以下展示顶层模块 work_controller_top 的部分代码,完整源码请下载压缩包查看。
library ieee;
use ieee.std_logic_1164.all;
-- 控制模块:管理工序步骤、重复次数与倒计时(单位:秒),输入时钟为10Hz(100ms一拍)
-- 设计思路:
-- 1)start_key上升沿启动流程;rst_n为低时同步复位;
-- 2)每个步骤有固定“单次时长”(毫秒)与“重复次数”;计满一次则根据重复次数决定是否继续当前步骤或进入下一步骤;
-- 3)对外输出:当前步骤号(1~6)、当前单次倒计时秒数(HEX显示)、当前单次已用毫秒(LED动画用)、结束指示灯。
entity process_controller is
port (
clk : in std_logic; -- 10Hz时钟
rst_n : in std_logic; -- 低电平复位
start_key : in std_logic; -- 高电平按下,检测上升沿
step_idx : out integer range 0 to 9; -- 当前步骤号(0表示空闲/未启动)
tens_digit : out integer range 0 to 9; -- 倒计时十位
ones_digit : out integer range 0 to 9; -- 倒计时个位
elapsed_ms : out integer range 0 to 24000; -- 当前单次已用毫秒(用于LED动画)
end_led : out std_logic -- 流程结束指示,高电平亮
);
end entity;
architecture rtl of process_controller is
-- 状态定义:空闲、运行、结束
type state_t is (IDLE, RUNNING, DONE);
signal state : state_t := IDLE;
signal time_sec_int : integer range 0 to 99; -- 当前单次倒计时(秒)
-- 步骤与计时寄存器
signal step : integer range 0 to 9 := 0; -- 当前步骤号
signal rep_left : integer range 0 to 3 := 0; -- 当前步骤剩余重复次数
signal t_ms : integer range 0 to 24000 := 0; -- 当前单次已用毫秒
signal prev_start : std_logic := '0'; -- start_key上一拍,用于沿检测
-- 各步骤单次时长(毫秒)
-- 第一步6秒;第二步12秒×2次;第三步24秒;第四步8秒×3次;第五步10秒;第六步5秒
function step_total_ms_func(s: integer) return integer is
begin
case s is
when 1 => return 6000;
when 2 => return 12000;
when 3 => return 24000;
when 4 => return 8000;
when 5 => return 10000;
when 6 => return 5000;
when others => return 0;
end case;
end;
-- 各步骤重复次数
function step_repeat_func(s: integer) return integer is
begin
case s is
when 2 => return 2;
when 4 => return 3;
when others => return 1;
end case;
end;
begin
-- 主时序过程:按1ms累加,管理步骤与重复次数
process(clk)
variable total_ms : integer;
begin
if rising_edge(clk) then
if rst_n = '0' then
state <= IDLE;
step <= 0;
rep_left <= 0;
t_ms <= 0;
end_led <= '0';
prev_start <= '0';
else
prev_start <= start_key;
-- 空闲态:等待启动
if state = IDLE then
end_led <= '0';
if (start_key = '1' and prev_start = '0') then
step <= 1;
rep_left <= step_repeat_func(1);
t_ms <= 0;
state <= RUNNING;
end if;
-- 运行态:按当前步骤单次时长计时
elsif state = RUNNING then
total_ms := step_total_ms_func(step);
if t_ms < total_ms then
t_ms <= t_ms + 100; -- 10Hz时钟,100ms累加
else
-- 完成一次单次时长
if rep_left > 1 then
rep_left <= rep_left - 1;
t_ms <= 0;
else
if step < 6 then
step <= step + 1;
rep_left <= step_repeat_func(step + 1);
t_ms <= 0;
else
state <= DONE;
end_led <= '1';
end if;
end if;
end if;
-- 结束态:保持结束指示,支持重新启动
elsif state = DONE then
step <= 0;
if (start_key = '1' and prev_start = '0') then
end_led <= '0';
step <= 1;
rep_left <= step_repeat_func(1);
t_ms <= 0;
state <= RUNNING;
end if;
end if;
end if;
end if;
end process;
-- 输出映射
// ... 以下代码略,完整源码请下载压缩包查看
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 六步骤流程控制器 VHDL Quartus
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 六步骤流程控制器 VHDL Quartus