在 if() 条件 vhdl 中比较 std_logic_vector

Compare std_logic_vector in a if() condition vhdl

我正在尝试将计数值 (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;

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

如果您想使用 +- 运算符进行算术运算,您应该使用算术类型。在 numeric_std 中定义的 signedunsigned 最适合于此。所以不要使用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 将所有位设置为“0”以获得最大的灵活性。即

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

现在让我们看看这个过程...嗯。 temp 有很多赋值......但你永远不会定义 temp。帮不了你...

接着看case语句。 case (temp) is...。我看到 1、2、4、7、8 等的时间...但是当 temp 是例如0?您需要为所有可能性定义一个 when。但是,如果您不想为这些情况做任何事情怎么办? ... 就做 null 吧!例如

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;

然后关于信号分配。在 下一个 增量周期之前,不会应用应用于信号的值。但是这个增量循环直到 after 过程完成后才会发生。例如:

  • 想象一下 cnt=799=x"031F" 和 temp="0001" 当进程启动时。
  • case 语句中,选择了 cnt <= cnt + 1。此操作安排在下一个增量周期,nut cnt 将暂时保持 799。
  • 因此,在 count <= cnt;,799 将被安排分配给 count,而不是 800!但由于此操作也已安排,因此 count 目前仍具有旧值(可能是 798)。
  • 这意味着在 if (count =,计数仍将被视为 798。由于推断出额外的寄存器,count 还需要两个时钟周期才能达到 800。

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