如何在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
相关产品推荐
相关产品推荐

