Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Специфический Crossbar Switch
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
LeonY
Вдруг возникла на первый взгляд простейшая задача, но при попытке реализации "уткнулся в стену" - ничего разумного в голову не приходит twak.gif . Может у кого-то что-то подобное уже было (есть) или будут удачные мысли help.gif .

Задача в следующем:
- есть черный ящик с
  • n входами In(0) ... In(n-1)

  • m выходами Out(0) ... Out(m-1)

  • m всегда меньше n

  • n-битовая управляющая шина C(0) ... C(n-1)

  • количество активных ("1") бит на шине С всегда меньше или равно m (если это не соблюдается, то желательно выставлять сигнал ошибки, но это не проблема)


- требуется
  • для каждого активного бита из С (например C(k)) подключать соответствующий вход In (в данном случае In(k)) к любому из выходов Out (я написал к "любому", но можно и более определенно - если C(k) является наименее значимым (LSB) из всех активных битов - то подключать к Out(0), для следующего активного бита - к Out(1) и так далее, хотя это несущественно).


Реальные значения для моей задачи таковы:
- максимальное n - 32
- максимальное m - 8
- ширина шин In и Out - 64 бита (а может и 72 - пока не решил)

Хочется все это сделать на комбинаторной логике, а не на State Machine - второй вариант тривиален, но потребует буферирования на FIFO всех 32-х входных каналов, чего хочется избежать любыми способами из-за ограничений силикона, и достаточно экономично (по тем-же причинам). Но на данный момент я не могу придумать не только экономичного решения, но вааще никакого, так что help.gif help.gif help.gif

Нажмите для просмотра прикрепленного файла
barabek
Цитата(LeonY @ Feb 10 2011, 05:44) *
Вдруг возникла на первый взгляд простейшая задача, но при попытке реализации "уткнулся в стену" - ничего разумного в голову не приходит twak.gif . Может у кого-то что-то подобное уже было (есть) или будут удачные мысли help.gif .

Самое простое - отдать все на откуп синтезатору. Тогда

Код
    
    // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    input [3:0] In0;
    input [3:0] In1;
    input [3:0] In2;
    input [3:0] In3;
    input [3:0] In4;
    input [3:0] In5;
    input [3:0] In6;
    input [3:0] In7;
    input [7:0] C;
    output [3:0] Out0;
    output [3:0] Out1;
    output [3:0] Out3;
    output [3:0] Out2;
    
    localparam N=8;
    localparam M=4;
    int c_i,out_i;
    logic [N-1:0][3:0]In_arr;
    logic [N-1:0][3:0]Out_arr;
    always_comb begin
        In_arr[0]=In0;
        In_arr[1]=In1;
        In_arr[2]=In2;
        In_arr[3]=In3;
        In_arr[4]=In4;
        In_arr[5]=In5;
        In_arr[6]=In6;
        In_arr[7]=In7;
    end
    always_comb begin
        Out0=Out_arr[0];
        Out1=Out_arr[1];
        Out2=Out_arr[2];
        Out3=Out_arr[3];
    end    
    always_comb begin
        for(out_i=0;out_i<N;out_i++)Out_arr[out_i]=0;
        out_i=0;
        for(c_i=0;c_i<N;c_i++)begin
            if(C[c_i])begin
                Out_arr[out_i]=In_arr[c_i];
                out_i=out_i+1'b1;
            end
        end
    end

Это по-быстрому, без задействования серого вещества sm.gif, в качестве отправной точки
dvladim
Цитата(LeonY @ Feb 9 2011, 22:44) *
Хочется все это сделать на комбинаторной логике, а не на State Machine - второй вариант тривиален, но потребует буферирования на FIFO всех 32-х входных каналов, чего хочется избежать любыми способами из-за ограничений силикона, и достаточно экономично (по тем-же причинам).

Наверное не совсем то, но все же: http://citeseerx.ist.psu.edu/viewdoc/downl...p1&type=pdf
Таким образом у вас получится m мультиплексоров (с n входами для full или n-m+1 входами для minimal) и останется задача выбора входа для каждого мультиплексора в соответствии с поданными единицами на C.
Если у вас full или mininal crossbar, то выбор входов мультиплексоров относительно прост, если же точек коммутации меньше, то выбор нужных - фактически трассировщик с решением конфликтов.
XVR
Можно сделать коммутатор реализующий произвольную перестановку шин (n->n), и обрезать ему выход до m
См. в Гугле по ключевым словам Benes Network. К сожалению для управления ею шина С напрямую не подойдет, понадобятся промежуточные вычисления (причем явно не в голом железе).
id_gene
отдаленное похожие задачи обсуждали: раз, два, три и четыре.
Может какие-то подходы найдете.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.