2017-02-18 1 views
0

Я пытаюсь создать систему, которая принимает 8-байтовый ввод данных и 8-битный действительный ввод каждого такта, когда каждый бит на действительном входе либо проверяет, либо делает недействительным байт данных.Verilog: выравнивание допустимых и недопустимых байтов с динамического ввода

input wire [63:0] d_in; 
input wire [7:0] v_in; 

Программа должна обрабатывать d_in, выравнивая все допустимые байты следующим образом.

(где B является действительным байт и X является недействительным байт)

Instance 1:

d_in = B1 B2 X X B3 X B4 B5 

d_out = B1 B2 B3 B4 B5 X X X 

Instance 2:

d_in = X B1 B2 B3 X B4 B5 B6 

d_out = B1 B2 B3 B4 B5 B6 X X 

я в основном работал с алгоритмами, прежде где все манипуляции с битами были одинаковыми на каждой итерации, например assign d_out [7:0] = d_in [15:8];, но тот факт, что количество и порядок действительных байтов может меняться при каждом вводе данных, означает, что эта стратегия не может быть использована.

Мой вопрос:

Есть ли способ, чтобы реализовать эту функцию в использовании Verilog или VHDL? Если это так, кто-то может указать мне на решение высокого уровня или какое-то соответствующее чтение, чтобы я мог лучше понять эту концепцию. Я думаю, что если бы я понял на высоком уровне, тогда я смог бы нанести ему кодировку, но в настоящее время я даже не уверен, что мне нужно кодировать.

Благодаря Zach

+0

Ой! Если действительно нет установленного правила/шаблона, и это может быть любое количество байтов в любой позиции - тогда вы получите довольно глубокую логику. Зная это, вы должны использовать способность конвейерной обработки FPGA для предварительного расчета некоторых вложенных логик, разложения глубины и предоставления некоторого времени для инструментов. Предполагается, что вы не хотите буферизировать входные данные и смещать байты, но это в равной степени не будет тривиальным. –

+0

@fpga_magik Если вы не возражаете, можете ли вы расширить то, что вы подразумеваете под буфером, входной сигнал и смещение байтов? Меня интересует это решение. Спасибо – Zach

ответ

0

Поскольку вы просили высокий уровень я дам псевдокод примера того, что может работать, или, по крайней мере, получить вы собираетесь.

d_out = '0; //Assuming that the X bytes can be set to zero in the output. 
bytes = 0; 
for i in range(8) 
if v_in[i] 
    d_out[bytes*8 +: 8] = d_in[i*8 +: 8] //Note the +: notation which is not pseudo, but verilog. 
    bytes++ 

Теперь выполните этот последовательный код в всегда блоке, и вы должны быть установлены.

Примечание: как синтезированный результат из этого будет выглядеть, мне не ясно, но я подозреваю, что он будет генерировать довольно много аппаратного обеспечения.

+0

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

+0

Вы правы, чтобы беспокоиться об этом. Я подозреваю, что логика будет глубокой. Однако его должно быть достаточно легко реализовать, чтобы вы могли дать ему качели и посмотреть, что получится. Что касается конвейерной обработки, я не думаю, что это решение очень помогает. Но мысль о слиянии произошла со мной. То есть, вроде типа merge-sort, но только при сортировке X байтов до конца массива байтов. Не уверен, что это жизнеспособное решение. – Hida

+0

Удалось выполнить конвейерное решение, создав экземпляр каждой итерации цикла как отдельный модуль с регистрами между ними для хранения выходов модуля для создания конвейера. Это неприятно с точки зрения площади, но эффективный дизайн в области не является требованием, поскольку он просто необходим для функциональной работы и удовлетворения требований времени. Там определенно более элегантные решения, хотя – Zach

0

У меня есть нечто похожее, но не совсем.

Ввод данных в FIFO, предварительное вычисление байтового включения с помощью записей FIFO. На стороне вывода прочитайте части включения байта и используйте их для смещения байтов. Таким образом, есть только восемь условий для удовлетворения для байта позволяют ...

1 byte, byteEn(0 downto 1) = "10", shift left 1 byte 
2 bytes, byteEn(0 downto 2) = "110", shift left 2 bytes 
3 bytes, byteEn(0 downto 3) = "1110", shift left 3 bytes 

... и так далее ...

Как вы переносите, прочитать в следующем слове используя FIFOs читать включить. Обратите внимание, что вам нужно будет позаботиться о том, что FIFO пуст, но не остановите трубопровод, так что данные, которые уже присутствуют, продолжают меняться.

Не уверен, насколько это будет сложно, поскольку я немного замалчивал его.

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