You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VHDL中调整10kHz方波占空比(20%/40%/60%)的方法

VHDL分频器调整占空比的代码修改方案

原代码依赖计数器高位输出时钟,占空比由位宽固定,无法灵活调整到20%/40%/60%。以下是两种修改方案:

方案一:固定单一占空比(以20%为例)

直接通过计数值比较控制输出电平,代码如下:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;

ENTITY divider IS
PORT(
    RST_N   : IN  std_logic;
    CLK     : IN  std_logic;
    clk_new : OUT std_logic
);
END divider;

ARCHITECTURE bhv OF divider IS
SIGNAL i_q  : std_logic_vector(12 downto 0);
-- 定义高电平阈值:20%占空比对应1000个CLK周期
CONSTANT HIGH_THRESHOLD : std_logic_vector(12 downto 0) := "000001111101000"; -- 十进制1000
-- 总周期阈值:5000个CLK周期对应十进制4999
CONSTANT MAX_COUNT      : std_logic_vector(12 downto 0) := "000100111000011"; -- 十进制4999

BEGIN
-- 通过比较计数值控制输出电平
clk_new <= '1' WHEN (i_q < HIGH_THRESHOLD) ELSE '0';

cnt: PROCESS(CLK, RST_N)
BEGIN
    IF RST_N = '0' THEN
        i_q <= (OTHERS => '0');
    ELSIF rising_edge(CLK) THEN
        IF (i_q = MAX_COUNT) THEN
            i_q <= (OTHERS => '0');
        ELSE
            i_q <= i_q + 1;
        END IF;
    END IF;   
END PROCESS;    
END bhv;

如果需要切换到40%或60%,只需修改HIGH_THRESHOLD的值:

  • 40%:设置为"000011111010000"(十进制2000)
  • 60%:设置为"000101111101000"(十进制3000)

方案二:可配置多占空比

添加占空比选择端口,一键切换三种占空比:

LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;

ENTITY divider IS
PORT(
    RST_N       : IN  std_logic;
    CLK         : IN  std_logic;
    duty_sel    : IN  std_logic_vector(1 downto 0); -- 00=20%, 01=40%, 10=60%
    clk_new     : OUT std_logic
);
END divider;

ARCHITECTURE bhv OF divider IS
SIGNAL i_q          : std_logic_vector(12 downto 0);
SIGNAL high_threshold : std_logic_vector(12 downto 0);
CONSTANT MAX_COUNT  : std_logic_vector(12 downto 0) := "000100111000011"; -- 4999
-- 定义三种占空比对应的阈值
CONSTANT DUTY_20    : std_logic_vector(12 downto 0) := "000001111101000"; -- 1000
CONSTANT DUTY_40    : std_logic_vector(12 downto 0) := "000011111010000"; -- 2000
CONSTANT DUTY_60    : std_logic_vector(12 downto 0) := "000101111101000"; -- 3000

BEGIN
-- 根据选择信号切换阈值
WITH duty_sel SELECT
    high_threshold <= DUTY_20 WHEN "00",
                      DUTY_40 WHEN "01",
                      DUTY_60 WHEN "10",
                      DUTY_20 WHEN OTHERS; -- 默认20%

clk_new <= '1' WHEN (i_q < high_threshold) ELSE '0';

cnt: PROCESS(CLK, RST_N)
BEGIN
    IF RST_N = '0' THEN
        i_q <= (OTHERS => '0');
    ELSIF rising_edge(CLK) THEN
        IF (i_q = MAX_COUNT) THEN
            i_q <= (OTHERS => '0');
        ELSE
            i_q <= i_q + 1;
        END IF;
    END IF;   
END PROCESS;    
END bhv;

关键修改说明

  1. 修正计数器周期:将原代码的计数上限从5000改为4999,确保一个clk_new周期正好对应5000个输入CLK脉冲(0到4999共5000个数)
  2. 替换输出逻辑:放弃直接取计数器高位的方式,通过计数值与阈值比较,精准控制高电平持续时间,实现任意占空比
  3. 可扩展性:方案二通过选择端口实现多占空比切换,无需修改核心逻辑即可调整输出特性

内容的提问来源于stack exchange,提问作者user21705936

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:07:43