循环缓冲区:选择包含环绕点的索引范围
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];
我认为这个问题最好用一个例子来理解。所以我们开始吧:
假设定义了以下内容:
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];