【问题标题】:Array search for 1s and 0s数组搜索 1 和 0
【发布时间】:2019-10-09 05:37:16
【问题描述】:

我想遍历一个 32 位的逻辑向量,找到值为 1 和 0 的索引,并将它们存储在两个单独的数组中。

我会通过一个输入知道数组中的个数。

索引数组将是二维的。

我还希望使用组合逻辑和可综合来实现这一点。

如果没有推断出锁存器,我无法想到任何逻辑。

logic [31:0] data ; // Array to be traversed
logic [31:0] [ONES_NUM-1:0]    one_index;// One's indices in array
logic [31:0] [32-ONES_NUM-1:0]   zero_index;//Zeros indices in array

always @(*)
   while(j < ONES_NUM)
      while ( i < 32)
      if(data[i]==1) begin
         one_index[j][31:0] = i;
         j++;
         i++;
         end
      else
         i++; //Here prob is no else statement so latch inferred.

对于零索引也类似 always@(*)。

我也怀疑while循环是否可合成。

请帮助逻辑。

【问题讨论】:

  • "and store them..." 除非您有时钟,否则您无法存储数据。无论你做什么:没有时钟,你就会得到闩锁。在编写 HDL 时,您应该多阅读一下 HDL 编码的工作原理,因为它是 C 代码。
  • @*被触发时,i,j,one_index等。具有将被评估和修改的未知值。您每次都需要在 always 块中初始化它们。 while 循环未合成; for 静态展开可以合成的循环。

标签: arrays verilog system-verilog hdl


【解决方案1】:
logic [31:0] data ;
   logic  [31:0][(ONES_NUM-1):0] one_index; // One's indices in array
   logic  [31:0][(32-ONES_NUM-1):0] zero_index; // Zeros indices in array
   bit clk;
   int j,k;
   always@(posedge clk)
    for(i=0;i<32;i++)
      begin
        if(data[i]==1)
          begin
            one_index[j]=i;
            j++;
          end
        else
          begin
            zero_index[k]=i;
            k++;
          end
      end

您必须使用时钟来避免闩锁。

您可以参考此链接https://www.edaplayground.com/x/kZ6 以获得更好的理解。

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2010-09-26
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多