2013-05-24 2 views
0

UART RS232 연결을 통해 전송 된 패킷을 재구성하려하지만 패킷을 완전히 재구성하여 패킷을 분리하고 물건을 사용하여 완료 할 수 있는지 확실하지 않습니다. 그것.Verilog에서 가변 크기 패킷 재구성

문제는 한 번에 1 바이트를받을 때 해당 바이트를 8 비트 레지스터에 저장하고 다음 바이트를 수신 할 때 8 비트 씩 첫 번째 바이트를 시프트 할 수 있기를 원합니다. 새로운 바이트를 끝에 추가하십시오. 이것은 레지스터가 너무 작아서 (8 비트 대 다음 바이트를 저장하기위한 16 비트) 문제가됩니다. 또한 모든 레지스터가 정적이어야하므로 런타임시 패킷 크기에 따라 레지스터 크기를 변경하는 방법을 볼 수 없으며 패킷의 정확한 크기를 알아야합니다. 그것을 처리하십시오.

패킷을 보관할 엄청나게 큰 레지스터를 설정하고 레지스터에 복사 된 유효 바이트 수를 세는 가능성이 있습니다. 그러나 볼 수없는 더 좋은 방법이 있다고 확신합니다.

이 모든 작업은 Xilinx ISE를 사용하여 수행됩니다.

답변

0

Verilog는 물리적 디자인을 모방하기 위해 정적입니다. 지원할 수있는 최대 바이트 수를 알아야합니다. 입력 크기를 알기 위해서는 데이터 바이트가 변할 때 카운터를 사용하지 마십시오. 동적 크기를 갖는 유일한 방법은 합성 불가능한 비헤이비어 모델링의 경우 C 코드를 사용하여 디자인 (PLI/VPI/DPI) 또는 SystemVerilog 대기열 (IEEE Std 1800-2012 섹션 7.10)에 연결할 수 있다는 것입니다. 관심이 있으시면 SystemVerilog에 대한 정보를 읽으십시오.

추시는의 Verilog 큰 시프트 레지스터의 예는 다음과 같습니다에 "미친 듯이 큰 레지스터"당신이 시뮬레이터를 처리 할 수 ​​있도록 청크로 store을 중단해야 할 수도와

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 

; 일부 시뮬레이터는 reg [2**32-1:0] store;을 처리 할 수 ​​없습니다. Sudo 코드 예 :

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

고마워요! 이렇게하면 내 문제를 해결하는 데 필요한 세부 정보를 얻을 수 있습니다. – fysloc