2012-03-09 2 views
2

У меня есть горячая линия, которую я хочу использовать для выбора диапазона проводов. Например, если моя селекторная линия 0001 Я хочу выбрать some_wire[2:0], если это 0010 Я хочу выбрать some_wire[5:3], если это 0100 Я хочу выбрать some_wire[8:6] и т. Д. В настоящее время я делаю это с огромным аргументом, но это не так, t, если, например, я хочу параметризовать модуль. Есть ли более сжатый способ сделать это?Выбор диапазона проводов на основе битмаски

ответ

4

Барабанные переключатели могут быть эффективно синтезированы, поэтому стоит сравнить любое решение с базой, где вы конвертируете селектор обратно в двоичную кодировку и используете сдвиг. Например, что-то вроде:

shift = 0; 
for(i=0;i<N;i=i+1) 
begin 
    if (selector[i]) 
    begin 
    shift = i; 
    end 
end 

shifted_wire = some_wire >> shift; 
output = shifted_wire[2:0]; 

В качестве альтернативы, можно использовать цикл для вычисления каждого бита независимо с помощью:

for(i=0;i<N;i=i+1) 
begin 
    output[i] = | ((some_wire>>i) & selector); 
end 
+0

Это типа для заявления действующего в Verilog? – blcArmadillo

+0

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

+0

Cool Я не понимал, что ты можешь это сделать. Я еще не пробовал, но дальнейший поиск в Google предлагает. Благодаря! – blcArmadillo

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