VHDL中的过程从不返回值

时间:2018-08-31 11:19:25

标签: vhdl procedure

我有一个永远不会返回值的过程。

procedure gen_start_impulse (
    signal rising_signal        : out std_logic;                             
    signal carier_clk           : in std_logic;
    constant duration           : in integer)    is                         
variable clk_counter    : integer := 0;
begin 
    if (rising_edge(carier_clk)) then
        if (clk_counter = duration) then
            rising_signal <= '0';
            clk_counter := 0;
        else
            rising_signal <= '1';
            clk_counter := clk_counter + 1;
        end if;
    end if;
end gen_start_impulse;

我在这里叫它

process (start)
begin
    if (start = '1') then
        gen_start_impulse(start_impulse, clk, 1);           
    end if;
end process;

在测试台中,start_impulse未初始化。

Result of testbench

我不明白为什么波形中的start_impulse未初始化。

1 个答案:

答案 0 :(得分:1)

欢迎使用Stackoverflow。您的问题很有趣,但实际上并没有包含足够的信息来获得完整的答案(如果愿意,快速浏览help center,尤其是How to create a Minimal, Complete, and Verifiable example部分可能会帮助您改进问题)

无论如何,让我们尝试猜测。每当start更改时,您的过程就会恢复,并且由于您的if语句,仅当gen_start_impulse的新值为start时,它才会调用'1'过程。因此,为澄清起见,我们可能会展平您的模型并像这样重写您的过程:

process (start)
    variable clk_counter: integer := 0;
    constant duration: integer := 1;
begin
    if (start = '1') then
        if (rising_edge(clk)) then
            if (clk_counter = duration) then
                start_impulse <= '0';
                clk_counter := 0;
            else
                start_impulse <= '1';
                clk_counter := clk_counter + 1;
            end if;
        end if;
    end if;
end process;

重要说明:这并不完全等同于您的初始代码,因为在您的代码中,每次在此处调用clk_counter过程时,gen_start_impulse变量都会被重新初始化它保持以前的值。

现在,如果start是同步的,您会怎么办?也就是说,是否总是在clk的上升沿之后才改变?简单:条件:

if (rising_edge(clk)) then

声明始终为假,并且从未执行对start_impulse的信号分配。这是因为startclk永远不会同时更改。它们之间始终至少有一个仿真步骤(“ 增量周期”)。

如果您设计一个同步系统,请等待或检查时钟的上升沿,然后测试其他信号,而不是相反。示例:

procedure gen_start_impulse (
    signal rising_signal        : out std_logic;                             
    signal starter              : in std_logic;
    constant duration           : in integer)    is                         
    variable clk_counter    : integer := 0;
begin 
    if (starter = '1') then
        if (clk_counter = duration) then
            rising_signal <= '0';
            clk_counter := 0;
        else
            rising_signal <= '1';
            clk_counter := clk_counter + 1;
        end if;
    end if;
end gen_start_impulse;
...
process (clk)
begin
    if (rising_edge(clk)) then
        gen_start_impulse(start_impulse, start, 1);           
    end if;
end process;

重要说明:由于每次调用clk_counter过程时都会初始化gen_start_impulse变量(请参见前面的说明),因此无法按预期工作。如果您希望这样做,您将需要重新做一些操作,要么完全删除该过程(顺便说一下,为什么需要它?),而仅使用一个同步过程,或者添加第四个inout clk_counter变量的过程参数,并将其声明为过程变量。