循环缓冲区:选择包含环绕点的索引范围

Circular Buffer: Selecting Range of Indices that Include the Wraparound Point

我认为这个问题最好用一个例子来理解。所以我们开始吧:

假设定义了以下内容:

parameter number_of_points_before_point_of_interest = 4;

logic [15:0] test_data = 16'b0000111100001111;
logic [3: 0] point_of_interest;
logic [7: 0] output_data;

如果分配给 point_of_interest 的值是 1,而分配给 number_of_points_before_point_of_interest 的值是 4。我希望我的 output_data 是 {test_data[E: F ], test_data[5:0]} 或 8'b00111100.

所以本质上,我想从 (point_of_interest - number_of_points_before_point_of_interest) 开始到 (point_of_interest 结束 - number_of_points_before_point_of_interest + 7).

由于point_of_interest是一个可变数,以下两种索引方式无效:

为了让代码更简洁:point_of_interest --> pot

number_of_points_before_point_of_interest --> num_pt_before_pot

buffer[pot - num_pt_before_pot: 4'hF]  // Invalid since pot not constant
buffer[pot -: num_pt_before_pot]       // Part-select doesn't work either 

注意:在第二种情况下,锅的可变性不是问题,因为起点是可变的。无论如何,part-select 在此示例中未提供理想的结果。

非常感谢您的帮助。提前致谢

您可以做的一个简单技巧是复制您的 test_data,然后取其一部分

  output_data   = {2{test_data}}[16+pot-before_pot-:2*before_pot];