比较if()条件vhdl中的std_logic_vector

时间:2017-04-17 21:24:53

标签: if-statement hex vhdl intel-fpga

我试图将计数值(std_logic_vector)与定义的十六进制值进行比较。但我没有按照下面的方式得到结果

signal count : STD_LOGIC_VECTOR(res_bits-1 DOWNTO 0):= x"0000"; --res_bits =16
signal round : STD_LOGIC_VECTOR(res_bits-1 DOWNTO 0):= x"0000";
signal cnt : STD_LOGIC_VECTOR(res_bits-1 DOWNTO 0):= x"0000"; --res_bits =16
    process(clk_50)
begin
    if (falling_edge(clk_50)) then
        t(1)<=t(0); 
        t(0)<=A;
        t(3)<=t(2); 
        t(2)<=B;
        case (temp) is
            when "0001" => cnt<= cnt + '1';
            when "0010" => cnt<= cnt - '1';
            when "1000" => cnt<= cnt + '1';     
            when "1011" => cnt<= cnt - '1';

        end case;
        count <= cnt;
        if (count = x"0320") then --if count 800
            round <= round + '1';
            cnt <= x"0000";   -- reset cnt
            count <= x"0000";   -- reset count
        end if;
    end if;
end process;

1 个答案:

答案 0 :(得分:1)

首先要做的是:您认为std_logic_vector是什么? std_logic_vectorstd_logic的数组。 std_logic已经解决了std_ulogicstd_ulogic是一种定义数字电路中电线状态的类型。但更重要的是:std_logic[_vector] 不是整数类型。

如果要对+-运算符进行算术运算,则应使用算术类型。在signed中定义的unsignednumeric_std最适合此。所以不要使用use ieee.std_logic_arith.all(非标准),但请使用use ieee.numeric_std.all(在标准中定义)。

接下来,一些信息重置信号。如果您决定设置res_bits = 17,该怎么办?然后

signal count : STD_LOGIC_VECTOR(res_bits-1 DOWNTO 0):= x"0000";

不起作用。因此,请使用others将所有位设置为&#39; 0&#39;最大的灵活性。即。

signal count : UNSIGNED(res_bits-1 DOWNTO 0) := (others => '0');

现在让我们来看看这个过程......嗯。 temp有许多分配......但您永远不会定义temp。无法帮助你...

然后看一下案例陈述。 case (temp) is...。我看到1,2,4,7,8等的时间......但是temp例如是什么时候会发生什么? 0?您需要为所有可能性定义when。但是如果你不想为这些案件做任何事情呢? ......做null! E.g。

case (temp) is
    when "0001" => cnt<= cnt + '1';
    [...]
    when "1110" => cnt<= cnt + '1';
    when others => null; -- <== required
end case;

case的另一件事 - 陈述。将情况与管道符号组合在一起。

case (temp) is
    when "0001" | "0111" | "1000" | "1110" => cnt <= cnt + '1';
    when "0010" | "0100" | "1011" | "1101" => cnt <= cnt - '1';
    when others => null;
end case;

然后关于信号分配。在 next delta周期之前,不会应用应用于信号的值。但是,在过程结束后,才会发生此增量循环。 E.g:

  • 想象一下cnt = 799 = x&#34; 031F&#34;和temp =&#34; 0001&#34;当过程开始时。
  • case语句中,cnt <= cnt + 1被选中。此操作计划在下一个增量周期,坚果cnt现在将保持799。
  • 因此,在count <= cnt;,799将被安排分配到count,而不是800!但由于此操作也已安排,count现在仍将具有旧值(可能是798)。
  • 这意味着在if (count =时,计数仍将被视为798.由于推断了额外的寄存器,count需要另外两个时钟周期才能达到800。

您应该在过程中使用变量作为临时值。但请注意你正在做的事情:当过程结束时,变量会失去它们的值,并且永远不应该在过程之外使用。