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

问题描述 投票:0回答:1

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

想象以下定义:

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

point_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 

注意:在第二种情况下锅的可变性不是问题,因为起点可以变化。无论如何,在此示例中,部分选择不能提供理想的结果。

非常感谢您的帮助。在此先感谢

verilog system-verilog circular-buffer
1个回答
0
投票

您可以做的一个简单技巧就是复制您的test_data,然后对其进行切片

  output_data   = {2{test_data}}[16+pot-before_pot-:2*before_pot];
© www.soinside.com 2019 - 2024. All rights reserved.