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

如何在VHDL测试台中用并行过程生成不同参数的两路信号

解决VHDL测试台中两路信号并行生成的问题

你的问题出在:主Simulation进程是顺序执行的,调用parametre过程后,parametre_1会跑完所有延迟、高低电平的wait操作,才会轮到parametre_2执行,导致第二路信号只能等第一路完全结束才启动,自然没法并行。

下面给两种可行的解决方案:

方案1:拆分独立并行进程(通用兼容所有VHDL版本)

VHDL里,架构块下的多个进程是并行运行的,把两路信号的生成逻辑分别放到独立进程里,就能让它们各自按参数独立工作,互不干扰。

修改后的完整代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;

library work;
use work.all;

entity paralell is
end paralell;

architecture paralell_arch of paralell is

constant c_CLOCK_PERIOD : time := 40 ns;
signal r_CLOCK : std_logic := '0'; -- 补原代码漏写的时钟信号定义
signal L1      : std_logic := '0';
signal L2      : std_logic := '0';  

begin
    UUT : entity work.paralel
     port map (
       clk   => r_CLOCK,
       sig1  => L1,
       sig2  => L2
     );   

  -- 时钟生成进程
  p_CLK_GEN : process is
  begin
    wait for c_CLOCK_PERIOD/2;
    r_CLOCK <= not r_CLOCK;
  end process p_CLK_GEN;

  -- 单独生成L1信号的进程
  p_GEN_L1 : process is
    -- 直接在这里定义L1的参数,也可以改成外部传入的信号/常量
    constant PERIOD1  : time := 400 us;
    constant DUTY1    : time := 200 us;
    constant DELAY1   : time := 10 ns;
  begin
    L1 <= '0';
    if DELAY1 >= 0 ns then
      wait for DELAY1;
    end if;
    -- 如果需要持续生成周期性信号就保留loop,只需要单次脉冲就删掉loop
    loop
      L1 <= '1';
      wait for DUTY1;
      L1 <= '0';
      wait for (PERIOD1 - DUTY1);
    end loop;
  end process p_GEN_L1;

  -- 单独生成L2信号的进程
  p_GEN_L2 : process is
    constant PERIOD2  : time := 100 us;
    constant DUTY2    : time := 50 us;
    constant DELAY2   : time := 20 ns;
  begin
    L2 <= '0';
    if DELAY2 >= 0 ns then
      wait for DELAY2;
    end if;
    loop
      L2 <= '1';
      wait for DUTY2;
      L2 <= '0';
      wait for (PERIOD2 - DUTY2);
    end loop;
  end process p_GEN_L2;

  -- 可选:控制仿真结束的进程
  p_SIM_END : process is
  begin
    wait for 1 ms; -- 设定仿真总时长,按需调整
    report "Simulation finished successfully!" severity note;
    wait;
  end process p_SIM_END;

end paralell_arch;

核心改动:

  • 把原来的信号生成过程拆成两个独立进程p_GEN_L1和p_GEN_L2,这俩会同时启动,各自走自己的时间逻辑。
  • 补了原代码里漏掉的r_CLOCK信号声明,不然编译会报错。

方案2:用VHDL 2008的fork...join(需要编译器支持)

如果想保留过程封装的形式,VHDL 2008及以后版本支持fork...join结构,可以让两个过程同时启动并行执行,不用等前一个做完。

修改后的Simulation进程代码:

Simulation : process   -- main testing
  procedure parametre_2(T6 : time; D6 : time; Delay6 : time) is
  begin
    L2 <= '0';
    if Delay6 >= 0 ns then
      wait for Delay6;
    end if;
    -- 按需添加loop实现周期性信号
    loop
      L2 <= '1';
      wait for D6;
      L2 <= '0';
      wait for (T6 - D6);
    end loop;
  end procedure parametre_2;
  
  procedure parametre_1(T5 : time; D5 : time; Delay5 : time) is
  begin
    L1 <= '0';
    if Delay5 >= 0 ns then
      wait for Delay5;
    end if;
    loop
      L1 <= '1';
      wait for D5;
      L1 <= '0';
      wait for (T5 - D5);
    end loop;
  end procedure parametre_1;
  
  procedure parametre(T3 : time; D3 : time; Delay1 : time; T4 : time; D4 :time; Delay2 : time)is
  begin
    -- 用fork...join让两个过程并行启动
    fork
      parametre_1(T3, D3, Delay1);
      parametre_2(T4, D4, Delay2);
    join
  end procedure parametre;
begin
  parametre(400 us, 200 us, 10 ns , 100 us , 50 us,20 ns);
  report " Simulation finished successfully!" severity note;
  wait;
end process;

注意事项:

  • 要确保你的仿真器(比如ModelSim、Vivado Simulator)开启了VHDL 2008标准支持,不然会编译失败。
  • 如果只需要单次脉冲,删掉过程里的loop就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:15:11