If statement 比较if()条件vhdl中的std_逻辑_向量

If statement 比较if()条件vhdl中的std_逻辑_向量,if-statement,hex,vhdl,intel-fpga,If Statement,Hex,Vhdl,Intel Fpga,我试图将计数值(标准逻辑向量)与定义的十六进制值进行比较。但我并没有像下面那样得到结果 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"; -

我试图将计数值(标准逻辑向量)与定义的十六进制值进行比较。但我并没有像下面那样得到结果

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;
信号计数:标准逻辑向量(res_位-1降到0):=x“0000”--res_位=16
信号轮:标准逻辑向量(res_位-1向下至0):=x“0000”;
信号cnt:STD_逻辑_向量(res_位-1向下至0):=x“0000”--res_位=16
工艺(clk_50)
开始
如果(下降沿(clk_50)),则

首先:你认为标准逻辑向量是什么
std\U逻辑\U向量
std\U逻辑
的数组<代码>标准逻辑
是一个已解决的
标准逻辑
std_ulogic
是一种定义数字电路中电线状态的类型。但更重要的是:
std\u逻辑[\u向量]
不是一种整数类型

如果要使用
+
-
运算符进行算术运算,应该使用算术类型<代码>有符号的和
无符号的
(在
数字标准
中定义)最适合于此。因此,不要使用
使用ieee.std\u logic\u arith.all
(非标准),而是使用
使用ieee.numeric\u std.all
(在标准中定义)


接下来,一些信息包括重置信号。如果您决定将
res\u位设置为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
。我帮不了你

然后看案例陈述<代码>案例(临时)为…
。我看到了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;

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

  • 想象一下,当过程开始时,cnt=799=x“031F”和
    temp
    =0001”

  • case
    语句中,
    cnt第一件事:你认为标准逻辑向量是什么
    std\U逻辑\U向量
    std\U逻辑
    的数组<代码>标准逻辑
    是一个已解决的
    标准逻辑
    std_ulogic
    是一种定义数字电路中电线状态的类型。但更重要的是:
    std\u逻辑[\u向量]
    不是一种整数类型

    如果要使用
    +
    -
    运算符进行算术运算,应该使用算术类型<代码>有符号的和
    无符号的
    (在
    数字标准
    中定义)最适合于此。因此,不要使用
    使用ieee.std\u logic\u arith.all
    (非标准),而是使用
    使用ieee.numeric\u std.all
    (在标准中定义)


    接下来,一些信息包括重置信号。如果您决定将
    res\u位设置为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
    。我帮不了你

    然后看案例陈述<代码>案例(临时)为…
    。我看到了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;
    

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

    • 想象一下,当过程开始时,cnt=799=x“031F”和
      temp
      =0001”

    • case
      语句中,
      cnt请编辑您的问题,使其具有并提供更好的问题解释。您确实意识到不同大小的std_逻辑_向量上的相等运算符定义为始终返回false,对吗?不,您没有添加其余代码。请提供一份报告。你要求任何能帮助你击中移动目标的人以渐进的方式提供更多信息。去掉count,使用cnt并与799进行比较。我已回滚您的最新编辑。在你问了最初的问题几周后,请不要对代码进行大的编辑。阅读你能做和不能做的事情。如果你对一段新代码还有疑问,可以问一个新问题。你能解释一下你最近的编辑吗???这对这个问题没有任何价值。。。你为什么要这么做?请编辑你的问题,让它有更好的解释问题。你知道不同大小的std_逻辑_向量上的相等运算符定义为总是返回false,对吗?不,你没有添加其余的代码。请提供一份报告。你要求任何能帮助你击中移动目标的人以渐进的方式提供更多信息。去掉count,使用cnt并与799进行比较。我已回滚您的最新编辑。在你问了最初的问题几周后,请不要对代码进行大的编辑。阅读你能做和不能做的事情。如果你对一段新代码还有疑问,可以问一个新问题。你能解释一下你最近的编辑吗???这对这个问题没有任何价值。。。为什么要这么做?当然,过程中的变量不会失去值,但如果使用时没有先赋值,确实会推断出闩锁,这可能被认为是有害的。“过程结束时变量会失去值”;你可以推断你是谁