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;