在FPGA实现中,经常会遇到由上位机循环下发数据(文件),底层FPGA按照所要求的帧长度和帧间隔发送出去的情况。一般这个时候上位机下发的数据位宽为32位,如果文件总长度不是4字节的整数倍,则会在末尾补零构成32位数据。这个时候FPGA下发数据是就需要将数据中无效的0数据去除掉。由于上位机会告知FPGA文件的有效数据长度值,FPGA则根据有效数据长度值,计算末尾所补得0字节的个数,然后根据有效长度值依次取数,并按照帧长度和帧间隔发送数据。下面为该情况处理的FPGA代码:
reg [1:0] S_complement;//定义余数
always @ (posedge clk or posedge fifo_rst)
begin
if(fifo_rst)
S_complement <= 0;
else
S_complement <= S_VALID_LENGTH % 4;
end
reg [31:0] S_REAL_LENGTH;//实际下发的数据长度
always @ (posedge clk or posedge fifo_rst)
begin
if(fifo_rst)
S_REAL_LENGTH <= 0;
else
case(S_complement )
0:S_REAL_LENGTH <= S_REAL_LENGTH;
1:S_REAL_LENGTH <= S_REAL_LENGTH + 3;
2:S_REAL_LENGTH <= S_REAL_LENGTH + 2;
3:S_REAL_LENGTH <= S_REAL_LENGTH + 1;
endcase
end
然后再根据实际的数据长度和有效数据长度,将补的0字节剔除掉就可以了。