我有一个永远不会返回值的过程。
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未初始化。
我不明白为什么波形中的start_impulse未初始化。
答案 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
的信号分配。这是因为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_counter
过程时都会初始化gen_start_impulse
变量(请参见前面的说明),因此无法按预期工作。如果您希望这样做,您将需要重新做一些操作,要么完全删除该过程(顺便说一下,为什么需要它?),而仅使用一个同步过程,或者添加第四个inout
clk_counter
变量的过程参数,并将其声明为过程变量。