Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
verilog中可变大小数据包的重构_Verilog_Cpu Registers_Packets - Fatal编程技术网

verilog中可变大小数据包的重构

verilog中可变大小数据包的重构,verilog,cpu-registers,packets,Verilog,Cpu Registers,Packets,我试图重建一个通过UART RS232连接发送的数据包,但不确定如何完整地重建数据包,这样数据包就可以被拆开,并且可以用它来完成一些事情 问题是,当我一次接收1个字节时,我将该字节存储到8位宽的寄存器中,当我接收到下一个字节时,我希望能够将第一个字节移位8位,然后将新字节添加到末尾。这成为一个问题,因为寄存器现在太小(8位对16位不能容纳下一个字节)。此外,我看不到一种方法可以在运行时改变寄存器的大小,使其根据数据包的大小而增长和收缩,因为所有寄存器都必须是静态的,而且我还必须知道数据包的确切大

我试图重建一个通过UART RS232连接发送的数据包,但不确定如何完整地重建数据包,这样数据包就可以被拆开,并且可以用它来完成一些事情

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

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


所有这些都是使用Xilinx ISE完成的。

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
// ...
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]};
// ...