【问题标题】:Circular Buffer: Selecting Range of Indices that Include the Wraparound Point循环缓冲区:选择包含环绕点的索引范围
【发布时间】:2020-05-17 11:53:43
【问题描述】:

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

想象一下定义如下:

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。

所以本质上,我想取 8 位,从 (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 在这个例子中并没有提供理想的结果。

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

【问题讨论】:

  • 在第二种情况下,'num_pt_before_port' 必须是一个常量。 'pot' 可以是一个变量。
  • 是的,没错。但是,当您想要环绕缓冲区时,部分选择不起作用。我将进行编辑以表明这一点。
  • 在系统verilog中,部件选择的宽度必须是常量。 (硬件中没有可变尺寸的线束)。如果不能使其成为常数,则不能使用此部件选择。尝试使用单个元素(宽度 == 1)的不同方法。

标签: verilog system-verilog circular-buffer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多