【问题标题】:Maximum block of bits of 1 in a 32 bits array Verilog32 位数组 Verilog 中 1 的最大位块
【发布时间】:2016-04-07 13:30:22
【问题描述】:

我是 Verilog 的初学者,我有这个任务。

max_pass 电路过滤一个 32 位的数组,使得最大长度为 1 的块保持在原位,其他的都为 0。

一个块/集由至少 2 位 1 组成。

电路必须是组合的,max_pass模块的接口是:

input  [31:0] din  ;
output [31:0] dout ;

电路没有记忆。输出会立即看到输入的任何变化。

建议使用模块化和分层设计。

示例

Example 1   
input:      01011100111111111111011100101010
output:     00000000111111111111000000000000
The maximum length of a block is 12.

Example 2   
input:      00100111111001001011111100101101
output:     00000111111000000011111100000000
Two blocks of maximum length of 6.

Example 3   
input:      11011011011011011011011011011011
output:     11011011011011011011011011011011
Eleven blocks of maximum length of 2.

【问题讨论】:

  • 因为这不是一个代码编写服务,如果你能展示你尝试过的东西会很好。首先是在 Verilog 中编写接口。
  • 电路只允许通过最大1位块。

标签: arrays module verilog bits maxlength


【解决方案1】:

正在进行的一些工作:找到存在的最大块大小,并计算位置向量。

block_is[i] 表示当块大小为 i 或更大时。

确定最大块大小和 OR 移位的位置向量数量以创建输出。

module tb;
  reg [15:0] seq;
  reg [15:0] loc_vector;
  reg [15:0] block_detect;



  initial begin
    #1ps seq = 16'b0101_1100_0110_1110;
    #10ns;
    $displayb(loc_vector);
    $displayb(block_detect);
    $finish();
  end

  reg [15:0] block_is = 16'b0;
  reg  [3:0] max_block;  //integer max of block_is 

  always @* begin
    block_is[0] = ~|seq; //All 0
    block_is[1] = |seq;  //Atleast 1
    block_is[2] = 
    (seq[15:14] == 2'b11) |
    (seq[14:13] == 2'b11) |
    (seq[13:12] == 2'b11) |
    (seq[12:11] == 2'b11) |
    (seq[11:10] == 2'b11) |
    (seq[10: 9] == 2'b11) |
    (seq[ 9: 8] == 2'b11) |
    (seq[ 8: 7] == 2'b11) |
    (seq[ 7: 6] == 2'b11) |
    (seq[ 6: 5] == 2'b11) |
    (seq[ 5: 4] == 2'b11) |
    (seq[ 4: 3] == 2'b11) |
    (seq[ 3: 2] == 2'b11) |
    (seq[ 2: 1] == 2'b11) |
    (seq[ 1: 0] == 2'b11) ; 

    block_is[3] =
    (seq[15:13] == 3'b111) |
    (seq[14:12] == 3'b111) |
    (seq[13:11] == 3'b111) |
    (seq[12:10] == 3'b111) |
    (seq[11: 9] == 3'b111) |
    (seq[10: 8] == 3'b111) |
    (seq[ 9: 7] == 3'b111) |
    (seq[ 8: 6] == 3'b111) |
    (seq[ 7: 5] == 3'b111) |
    (seq[ 6: 4] == 3'b111) |
    (seq[ 5: 3] == 3'b111) |
    (seq[ 4: 2] == 3'b111) |
    (seq[ 3: 1] == 3'b111) |
    (seq[ 2: 0] == 3'b111) ; 

    //etc complete for block_is 4 to 14

    block_is[15] = &seq; //AND reduction all 1's

    loc_vector = seq;
    if (block_is[1]) begin
      //always do first shift if have block of 1
      loc_vector = loc_vector & (seq << 1);
    end
    if (block_is[2]) begin
      //do second shift if have at least a block of 2
      loc_vector = loc_vector & (seq << 2);
    end

    //Find max Block Size
    for (int i=0; i<16; i=i+1) begin
      if (block_is[i]) begin
        max_block = i;
      end
    end

    block_detect = loc_vector;
    //Turn Location Vectors in to max_blocks
    for (int i=2; i<16; i=i+1) begin
      if ( max_block >=i )
        block_detect = block_detect | (loc_vector >> (i-1));
    end
  end

endmodule

哪些输出:

0001000000001000
0001110000001110

【讨论】:

  • 好。现在有了位置向量,我应该如何生成输出?
  • 添加了最后部分来回答以生成所需的输出。
【解决方案2】:

@摩根

我已经想到了一个解决方案。使用 MUX-DMUX 电路,我可以比较 2 个 2 位数字,假设 M,N 并且如果 M>N 函数返回 1(如果 M=N=11 也可以修改为返回 1)。所以,我有一个 32 位数组并开始使用这个算法进行比较。 现在,我不知道如何找到最长的块。

2 numbers M=ab N=cd

MUX-DMUX circuit

【讨论】:

  • 我认为最初需要一个 for 循环来识别最大的块。我也不认为应该组合解决这个问题。如果 32 位值可以串行(逐位)输入,那么状态机可以对其进行分析以识别最大块。
  • @Morgan 我找到了解决方案,但我需要实施帮助
  • 另一种解决方案还是上面提到的那个?
  • @Morgan 另一个解决方案
  • 如果你能更新问题,你提出的解决方案会显示你可以做什么,那就太好了。
【解决方案3】:

我们以 16 位为例。

输入:0101 1100 0110 1110 我们有 2 个 3 位的最大块。

位置向量:0001 0000 0000 1000

输出应如下所示:0001 1100 0000 1110

位置向量包含一个 1 位,它与最大块的最左侧 1 位对齐。 位置向量是通过将输入向左移动1,然后在两个数组之间进行AND运算,重复这个过程直到我们得到向量。

例子:

         Input:   0101 1100 0110 1110
    Shift left:   1011 1000 1101 1100   
 AND operation:   0001 1000 0100 1100
Shift left again: 0011 0000 1001 1000
AND with input:   0001 0000 0000 1000  --> Location vector

输出在与位置向量相同的位置有一个 1 位(在本例中为位置 3 和 12,从右到左计数)。

对于位置 3 中的 1: 当且仅当位置 3 的输出为 1 且输入向量的位置 2 为 1 时,前一个位置(位置 2)的输出为 1。 当且仅当位置 2 的输出为 1 且输入向量的位置 1 为 1 时,位置 1 的输出为 1。

对于第 12 位的 1: 当且仅当位置 12 的输出为 1 且输入向量的位置 11 为 1 时,前一个位置(位置 11)的输出为 1。 当且仅当位置 11 的输出为 1 且输入向量的位置 10 为 1 时,位置 10 的输出为 1。

你知道这将如何将最大块位级联到输出吗?本质上,位置向量中的位用作触发器,输入向量中的位用于将 1 位的脉冲持续到输出,只要它们持续存在。

问题是我不确定如何实现此行为代码以及这是否是一个好的解决方案。

我正在等待您的意见和想法。谢谢!

【讨论】:

  • 因为它是组合的,所以您必须计算所有移位 (16) 并忽略不基于最大块大小的移位。
  • @Morgan 我不明白。
  • 在这个例子中你换了 2 次,是什么让你停止换档?你怎么知道轮班多少次?
  • 移动 maxLenthofBlock - 1 @Morgan
  • 没错,你怎么知道最大块大小存在?正在为这一点寻找答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2011-01-28
相关资源
最近更新 更多