我收到警告说算术操作有X
,所以结果总是X
,尽管我正在将信号初始化为0s
。有人可以帮忙吗?
N.B。我收到X
和Z_count
RC_count_var
--RC counter
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
Entity RC_counter2 is
Port(load, Cplus, Cminus : In Std_logic;
X: In std_logic_vector (3 downto 0) :="0000";
Z_count: Out std_logic_vector (3 downto 0) :="0000");
end Entity;
Architecture behav of RC_counter2 is
signal RC_count_var: std_logic_vector(3 downto 0):="0000";
Begin
process(Cplus, load)
--variable RC_count_var: std_logic_vector(3 downto 0):="0000";
Begin
if load = '1' then
RC_count_var <= X;
end if;
if (Cplus'EVENT and Cplus = '1') then
RC_count_var <= RC_count_var + 1;
else
RC_count_var <= RC_count_var;
end if;
end process;
process(Cminus, load)
Begin
if load = '1' then
RC_count_var <= X;
end if;
if (Cminus'EVENT and Cminus = '1') then
RC_count_var <= RC_count_var - 1;
else
RC_count_var <=RC_count_var;
end if;
end process;
Z_count <= RC_count_var;
end Architecture;
答案 0 :(得分:0)
RC_Count_var
的值变为无效,因为它有多个冲突的驱动程序。
在VHDL中,每当在多个进程中分配信号时,它就意味着多个驱动程序。这些通常不支持合成,不完全推荐。为了确保您没有多个驱动程序,只需在一个进程中对信号进行所有分配。
此外,虽然不完全错误或有问题,但我建议您修改以下代码:
if load = '1' then
RC_count_var <= X;
end if;
if (Cplus'EVENT and Cplus = '1') then
RC_count_var <= RC_count_var + 1;
else
RC_count_var <= RC_count_var;
end if;
这不会给出多个驱动程序,但有几个问题。首先,在一个过程中对相同信号的连续分配将覆盖前一个。因此,如果cplus
正在上升且load
为'1'
,则不会加载该值。使用elsif
或else
会更好更清洁。此外,合成目标通常不支持异步加载。异步设置/重置很好,但在您的情况下异步加载到值X
可能会有问题。