在 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_vector
是 std_logic
的数组。 std_logic
是已解决的 std_ulogic
。 std_ulogic
是一种定义数字电路中电线状态的类型。但更重要的是:std_logic[_vector]
是 不是 整数类型。
如果您想使用 +
和 -
运算符进行算术运算,您应该使用算术类型。在 numeric_std
中定义的 signed
和 unsigned
最适合于此。所以不要使用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。
您可能应该在此过程中使用变量作为临时值。但是要注意你正在做的事情:当进程结束时变量会丢失它们的值并且永远不应该在进程之外使用。
我正在尝试将计数值 (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_vector
是 std_logic
的数组。 std_logic
是已解决的 std_ulogic
。 std_ulogic
是一种定义数字电路中电线状态的类型。但更重要的是:std_logic[_vector]
是 不是 整数类型。
如果您想使用 +
和 -
运算符进行算术运算,您应该使用算术类型。在 numeric_std
中定义的 signed
和 unsigned
最适合于此。所以不要使用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
。此操作安排在下一个增量周期,nutcnt
将暂时保持 799。 - 因此,在
count <= cnt;
,799 将被安排分配给count
,而不是 800!但由于此操作也已安排,因此count
目前仍具有旧值(可能是 798)。 - 这意味着在
if (count =
,计数仍将被视为 798。由于推断出额外的寄存器,count
还需要两个时钟周期才能达到 800。
您可能应该在此过程中使用变量作为临时值。但是要注意你正在做的事情:当进程结束时变量会丢失它们的值并且永远不应该在进程之外使用。