我正在尝试将计数值(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;
发布于 2017-04-18 09:14:10
首先要做的是:你认为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
-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;
然后是信号分配。应用于信号的值直到下一个增量周期才会被应用。但是直到这个过程完成之后,这个增量循环才会发生。例如:
cnt
=799=x"031F“和temp
="0001”。case
语句中,选择cnt <= cnt + 1
。这个操作被安排在下一个增量周期,坚果cnt
现在将保持799。count <= cnt;
,799将被安排分配给count
,而不是800!但由于此操作也是计划的,count
目前仍将具有其旧值(可能为798 )。if (count =
中,count仍将被视为798。由于推断出额外的寄存器,count
还需要两个时钟周期才能达到800。您可能应该在流程中为临时值使用变量。但是要注意你在做什么:变量在进程结束时失去了它们的值,并且永远不应该在进程之外使用。
https://stackoverflow.com/questions/43459885
复制相似问题