关于获得4值逻辑VHDL的" X" es的警告

时间:2015-06-17 02:28:45

标签: vhdl

我收到警告说算术操作有X,所以结果总是X,尽管我正在将信号初始化为0s。有人可以帮忙吗?

N.B。我收到XZ_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; 

1 个答案:

答案 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',则不会加载该值。使用elsifelse会更好更清洁。此外,合成目标通常不支持异步加载。异步设置/重置很好,但在您的情况下异步加载到值X可能会有问题。