VHDL中的过程从不返回值

VHDL中的过程从不返回值,vhdl,procedure,Vhdl,Procedure,我有一个程序,它永远不会返回值 procedure gen_start_impulse ( signal rising_signal : out std_logic; signal carier_clk : in std_logic; constant duration : in integer) is v

我有一个程序,它永远不会返回值

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;
在测试台上,启动脉冲未初始化


我不明白为什么波形中的启动脉冲未初始化。

欢迎使用Stackoverflow。你的问题很有趣,但它并没有包含足够的信息来获得完整的答案。如果你愿意,快速浏览一下,特别是这一部分可能会帮助你改进它

不管怎样,让我们试着猜一猜。每次start更改时,您的进程都会恢复,并且由于您的if语句,只有当start的新值为“1”时,它才会调用gen_start_PULSE过程。因此,为了澄清问题,我们可能会将您的模型展平,并将您的流程改写为:

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;
语句总是错误的,您的启动脉冲信号分配永远不会执行。这是因为start和clk从不同时更改。在它们之间的增量循环中,始终至少有一个模拟步骤

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

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_计数器变量在每次调用gen_start_PULSE procedure(发电机启动脉冲程序)时都会重新初始化。请参见前面的说明,这不会像您预期的那样工作。如果你想让它工作,你需要重新做一点,或者完全删除程序,顺便问一下,你为什么需要它?并且只使用一个同步进程,或者为clk_计数器变量向过程添加第四个inout参数,并将其声明为过程变量。

问题是什么?VHDL过程不会返回值。这是它们与函数的区别之一。我不明白为什么波形中的start_脉冲未初始化。非常感谢您的解释,但实现仍然不起作用。启动脉冲总是“1”哦,我向你们展示的不是一个有效的解决方案,它只是我设计同步系统的一个例子。还有其他几个原因导致它仍然不起作用。例如,每次调用过程时,过程中的局部变量(例如clk_计数器)都会重新初始化。过程的局部变量表现不同。但是,由于您没有显示MCVE,我们无法找到所有的原因。你真的应该考虑去拜访并用一个真实的问题来改善你的问题。
if (rising_edge(clk)) then
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;