2013-05-24 2 views
0

Я пытаюсь восстановить пакет, который был отправлен через соединения UART RS232, но я не уверен, как полностью восстановить пакет, чтобы пакет можно было разделить, и все может быть выполнено с использованием Это.Реконструкция пакетов с переменным размером в verilog

Проблема заключается в том, что когда я получаю 1 байт за один раз, я сохраняю этот байт в регистр шириной 8 бит, и когда я получаю следующий байт, я хочу иметь возможность сдвинуть первый байт на 8 бит, затем добавьте новый байт до конца. Это становится проблемой, так как регистр теперь слишком мал (8 бит против 16 бит для хранения следующего байта). Кроме того, я не вижу способа изменить размер регистра во время выполнения, чтобы расти и уменьшаться в зависимости от размера пакета, поскольку все регистры должны быть статическими, и я также должен знать точный размер пакета, чтобы обрабатывать его.

Существует возможность создания безумно большого регистра для хранения пакета и подсчета количества действительных байтов, скопированных в регистр, но я уверен, что есть лучший способ сделать это, которого я не вижу.

Все это делается с использованием Xilinx ISE.

ответ

0

Verilog является статическим для имитации физического дизайна. Вам нужно будет узнать максимальное количество байт, которые могут поддерживаться. Чтобы узнать размер ввода, просто некомпетентный счетчик, поскольку сдвиг байтов данных. Единственный способ иметь динамический размер - это если это не синтезируемое моделирование поведения, тогда вы можете использовать C-код для ссылки на ваш проект (PLI/VPI/DPI) или Queue 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;. Пример кода 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

Смежные вопросы