需要帮助阅读内存数组的内容并获取vhdl中的计数

时间:2017-03-09 13:43:24

标签: process vhdl

输入数组: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;

wave 但它不符合我的期望。请帮忙

1 个答案:

答案 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模型以惯性延迟的方式延迟,在本例中肯定是正确的。但严格地说,并非总是如此。