输入数组:Ram = {D D D D D 3 3 3 3 7 7 7 9 9 8 8};
我期待输出如下:
Count = {0 0 0 4 0 0 0 3 2 2 0 0 0 5 0 0};
那就是计算出现的次数,比如有5个D,4个3个,3个7个,2个9个和2个8个,所以Count数组在Dth索引中有5个,在第3个索引中有4个,在第7个索引中有3个等等。
我的代码如下:
architecture behav of Bitcount is
signal cnt: count_type := (others=> (others=>'0'));
use ieee.numeric_std.all;
begin
Countproc:process(clk)
begin
if (clk'event and clk='1' ) then
if Enable='1' then
if (Read_bit='1') then
for k in 0 to 15 loop
for i in 0 to 15 loop
if ( Ram(k) = std_logic_vector(to_unsigned(i, 4)) )then
cnt(i) <= cnt(i) + "01";
end if;
end loop;
end loop;
end if;
end if;
Count <= cnt;
end if;
end process Countproc;
end behav;
答案 0 :(得分:2)
您的问题是cnt
是信号。它必须是变量。
进程中的代码行按顺序执行 。每当执行包含信号分配(<=
)的代码行时,就会在事件队列上放置一个事件来驱动目标信号(在这种情况下为cnt
)下一个增量周期(假设结果是目标信号有一些变化)。事件队列是模拟器&#34;做&#34;列表; delta周期是模拟器的一次迭代;一旦在当前迭代中执行的所有进程暂停,就会发生下一次迭代。
如果在任何执行过程期间遇到对同一目标信号的另一个信号分配,则(通常*)删除与该信号有关的事件队列上的任何其他事件。因此,在您的示例中,每次遇到此行时(它将是16 * 16 = 256次):
cnt(i) <= cnt(i) + "01";
不是递增cnt(i)
(这是我假设您期望发生的事情),而是删除与cnt(i)
相关的所有先前事件,并替换为新事件以驱动cnt(i)
流程开始执行前的值加一。信号cnt(i)
在完成执行(以及所有其他进程)之前不会获得其新值。
变量不会出现这种行为;变量的行为就像任何软件语言中的变量一样。当遇到带有变量赋值(:=
)的代码行时,该变量会立即更新,因此其值可立即用于进一步计算。
那么,如何将cnt
更改为变量:
architecture behav of Bitcount is
use ieee.numeric_std.all;
begin
Countproc:process(clk)
variable cnt : count_type;
begin
if (clk'event and clk='1' ) then
if Enable='1' then
if (Read_bit='1') then
cnt := (others=> (others=>'0'));
for k in 0 to 15 loop
for i in 0 to 15 loop
if ( Ram(k) = std_logic_vector(to_unsigned(i, 4)) )then
cnt (i) := cnt (i) + "01";
end if;
end loop;
end loop;
Count <= cnt;
end if;
end if;
end if;
end process Countproc;
end behav;
我无法确定这会有效,因为您还没有提供MCVE,所以我还没有对其进行测试。但是你原来的解决方案不会因为我给出的原因而起作用。
-
*这几乎总是正确的,因为VHDL模型以惯性延迟的方式延迟,在本例中肯定是正确的。但严格地说,并非总是如此。