亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

精通 VHDL Generate 语句:轻松构建可复用去抖动器

VHDL generate 语句允许设计者自动跨多个实例复制代码块,每个实例连接不同信号。可将其视为编译期 for 循环,能创建链式进程或模块实例,大幅减少样板代码并提升可维护性。

与仅限于进程或子程序的传统循环不同,generate 直接位于架构区域。结合泛型,它成为打造高度可配置、可复用 VHDL 组件的强大机制。

Generate 语句语法

[label :] for <constant_name> in <range> generate [declarations_local_to_each_loop_iteration] [begin] <processes_and_instantiations> end generate [label];

方括号内为可选元素。若无局部对象声明,可省略声明区和 begin 关键字。<range> 遵循标准整数语法,使用 to 或 downto。

单位开关去抖动器

深入 generate 前,先回顾清理单个开关输入的简单去抖动器。泛型 timeout_cycles 使模块适配任意时钟频率。去抖动器抑制机械开关翻转时产生的瞬态毛刺。

entity debouncer is generic ( timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switch : in std_logic; switch_debounced : out std_logic ); end debouncer;

实现依赖整型计数器,其位宽由泛型决定。内部使用影子信号 debounced 保持输出逻辑整洁。

architecture rtl of debouncer is signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin -- Copy internal signal to output switch_debounced <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switch; else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switch /= debounced then counter <= 0; debounced <= switch; end if; end if; end if; end process; end architecture;

ModelSim 仿真确认 switch_debounced 仅在指定超时后跟随输入,有效滤除抖动伪影。

精通 VHDL Generate 语句:轻松构建可复用去抖动器

在下方表单提供邮箱,即可下载包含测试平台的完整 ModelSim 工程。所有更新来自 VHDLwhiz,可随时退订。

带实例化的 Generate 循环

将去抖动器扩展到开关数组,使用 generate 语句自动创建多个实例。

entity debouncer_gen_inst is generic ( switch_count : positive; timeout_cycles : positive ); port ( clk : in std_logic; rst : in std_logic; switches : in std_logic_vector(switch_count - 1 downto 0); switches_debounced : out std_logic_vector(switch_count - 1 downto 0) ); end debouncer_gen_inst;

架构用 generate 循环为每个开关位实例化 debouncer。各实例共享同一时钟和复位,但连接到不同的向量元素。

architecture rtl of debouncer_gen_inst is begin MY_GEN : for i in 0 to switch_count - 1 generate DEBOUNCER : entity work.debouncer(rtl) generic map ( timeout_cycles => timeout_cycles ) port map ( clk => clk, rst => rst, switch => switches(i), switch_debounced => switches_debounced(i) ); end generate; end architecture;

为 generate 块加标签(如 MY_GEN)可提升仿真器层次和综合报告中的可读性,便于调试。

精通 VHDL Generate 语句:轻松构建可复用去抖动器

测试平台仅翻转开关 3,因此波形聚焦于 MY_GEN(3)。在 ModelSim 运行此例可观察去抖动逻辑。

包含进程的 Generate 循环

也可将去抖动逻辑提升到 generate 块内部,省去单独组件实例化。这演示了 generate 循环也能创建带局部信号的同构进程。

architecture rtl of debouncer_gen_proc is begin MY_GEN : for i in 0 to switch_count - 1 generate signal debounced : std_logic; signal counter : integer range 0 to timeout_cycles - 1; begin switches_debounced(i) <= debounced; DEBOUNCE_PROC : process(clk) begin if rising_edge(clk) then if rst = '1' then counter <= 0; debounced <= switches(i); else if counter < timeout_cycles - 1 then counter <= counter + 1; elsif switches(i) /= debounced then counter <= 0; debounced <= switches(i); end if; end if; end if; end process; end generate; end architecture;

行为与模块实例化法一致,但代码自包含于架构内。两种方法皆可,按设计风格选择。

所有代码样例及完整 ModelSim 工程可通过下方表单下载。订阅 VHDLwhiz 获取更新,随时可退订。

有 generate 的创意用法?欢迎在评论区分享!

VHDL

  1. 开关控制电路实战:从原理图到面包板的基础电路构建
  2. 续流二极管实验:用霓虹灯抑制感性尖峰
  3. AC 分析配置:曲线类型、计算点与频率扫描设置
  4. 理解电气开关:类型、功能与应用
  5. 消除机械开关触点抖动
  6. 掌握 C# switch 语句:语法、示例与最佳实践
  7. C# break 语句:用法、时机与实战示例
  8. 掌握 C# continue 语句:高效跳过循环迭代的实战指南
  9. 掌握 C++ switch-case:语法、用法与实战示例
  10. VHDL过程示例:标准逻辑向量自增
  11. 善用VHDL记录类型构建整洁可复用FIFO接口
  12. VHDL变量详解:实用示例与可靠设计规则