我试图将计数值(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;
答案 0 :(得分:1)
首先要做的是:您认为std_logic_vector是什么? std_logic_vector
是std_logic
的数组。 std_logic
已经解决了std_ulogic
。 std_ulogic
是一种定义数字电路中电线状态的类型。但更重要的是:std_logic[_vector]
不是整数类型。
如果要对+
和-
运算符进行算术运算,则应使用算术类型。在signed
中定义的unsigned
和numeric_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。您应该在过程中使用变量作为临时值。但请注意你正在做的事情:当过程结束时,变量会失去它们的值,并且永远不应该在过程之外使用。