0

我正在尝试重建通过 UART RS232 连接发送的数据包,但不确定如何完整地重建数据包,以便可以将数据包拆开并使用它来完成工作。

问题是,当我一次接收 1 个字节时,我将该字节存储到 8 位宽的寄存器中,当我收到下一个字节时,我希望能够将第一个字节移动 8 位,然后添加新的字节到最后。这成为一个问题,因为寄存器现在太小(8 位与 16 位无法容纳下一个字节)。此外,我看不到在运行时更改寄存器大小以根据数据包大小增长和收缩的方法,因为所有寄存器都必须是静态的,而且我还必须知道数据包的确切大小才能处理它。

有可能设置一个非常大的寄存器来保存数据包,并计算有多少有效字节被复制到寄存器中,但我确信有更好的方法来做到这一点,但我没有看到。

所有这些都是使用赛灵思 ISE 完成的。

4

1 回答 1

0

Verilog 是静态的以模仿物理设计。您需要知道可以支持的最大字节数。要知道输入的大小,只需在数据字节移位时使计数器无能。获得动态大小的唯一方法是,如果这是用于不可综合的行为建模,那么您可以使用 C 代码链接到您的设计 (PLI/VPI/DPI) 或 SystemVerilog 队列(IEEE Std 1800-2012 第 7.10 节)。如果您有兴趣,请阅读有关 SystemVerilog 的信息。

下面是一个大移位寄存器的 Verilog 示例:

parameter SIZE = 2**10;
reg [SIZE*8-1:0] store;
always @(posedge clk or negedge rst_n) begin
  if ( !rst_n ) begin
     counter <= 0;
     store <= {(SIZE*8){1'b0}};
  end
  else if ( push_in ) begin
     counter <= first_byte ? 0 : (counter+1);
     store <= {store[SIZE*8-1-8:0], data_in[7:0]};
  end
end

使用“非常大的寄存器”,您可能需要将其分解store成块,以便模拟器可以处理它;一些模拟器无法处理reg [2**32-1:0] store;。须藤代码示例:

// ...
storeN <= {store3[SIZE*8-1-8:0], storeM[7:0]};
// ...
store1 <= {store1[SIZE*8-1-8:0], store0[7:0]};
store0 <= {store0[SIZE*8-1-8:0], data_in[7:0]};
// ...
于 2013-05-24T17:05:54.073 回答