【问题标题】:Compare std_logic_vector in a if() condition vhdl在 if() 条件 vhdl 中比较 std_logic_vector
【发布时间】:2017-04-17 21:24:53
【问题描述】:

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

【问题讨论】:

  • 请编辑您的问题,使其具有minimal reproducible example 并提供更好的问题解释。
  • 您确实意识到不同大小的 std_logic_vectors 上的相等运算符被定义为始终返回 false,对吧?
  • 不,你还没有添加其余的代码。请提供Minimal, Complete, and Verifiable example。您正在询问任何可以帮助您击中移动目标的人,从而逐渐增加更多信息。去掉 count,使用 cnt 并与 799 进行比较。
  • 我已回滚您的最新编辑。在您提出最初的问题几周后,请不要对代码进行大量编辑。阅读here 你能做什么和不能做什么。如果您对新代码仍有疑问,请提出新问题。
  • 你能解释一下你最近的编辑吗???它没有为这个问题增加任何价值......你为什么要努力?

标签: if-statement hex vhdl intel-fpga


【解决方案1】:

第一件事:你认为 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-statements 的另一件事。将情况与管道符号结合起来。

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

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

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

您可能应该在过程中使用变量作为临时值。但请注意您正在做的事情:变量在流程完成时会失去其值,并且永远不应该在流程之外使用。

【讨论】:

  • 进程中的变量自然不会丢失值,但如果在没有先赋值的情况下使用,确实会推断出一个锁存器,这可能被认为是有害的。
  • "过程结束时变量会失去其值";您可以使用变量来推断寄存器,所以我想知道这是否是您真正的意思?
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多