Перейти к содержанию
    

Специфический Crossbar Switch

Вдруг возникла на первый взгляд простейшая задача, но при попытке реализации "уткнулся в стену" - ничего разумного в голову не приходит :twak: . Может у кого-то что-то подобное уже было (есть) или будут удачные мысли :help: .

 

Задача в следующем:

- есть черный ящик с

  • 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: :help: :help:

 

post-164-1297277452_thumb.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вдруг возникла на первый взгляд простейшая задача, но при попытке реализации "уткнулся в стену" - ничего разумного в голову не приходит :twak: . Может у кого-то что-то подобное уже было (есть) или будут удачные мысли :help: .

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

 

    
    // {{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

Это по-быстрому, без задействования серого вещества :), в качестве отправной точки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочется все это сделать на комбинаторной логике, а не на 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, то выбор входов мультиплексоров относительно прост, если же точек коммутации меньше, то выбор нужных - фактически трассировщик с решением конфликтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно сделать коммутатор реализующий произвольную перестановку шин (n->n), и обрезать ему выход до m

См. в Гугле по ключевым словам Benes Network. К сожалению для управления ею шина С напрямую не подойдет, понадобятся промежуточные вычисления (причем явно не в голом железе).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отдаленное похожие задачи обсуждали: раз, два, три и четыре.

Может какие-то подходы найдете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...