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

параметризируемый декодер (коммутатор)

подскажите пожалуйста как сделать параметризируемый коммутатор N к 1

(селектор "one-hot", т.е. 0001000 0010000 10000000 и т.д.)

кроме как вот так что-то ничего в голову не идёт (сложность в том что не знаю как явно дать тонять что if не приоритетный а параллельный)

 

parameter N=x;

wire [N-1:0] one_hot_selector;

wire [N-1:0] bus_for_selection;

wire selected_signal;

 

always_comb

_ _ begin

_ _ _ _ selected_signal=1'b0;

_ _ _ _ for (int i =0; i<N; i++)

_ _ _ _ _ _ begin

_ _ _ _ _ _ _ _ if (one_hot_selector==1'b1) // _ _ _ _ _ _хочется чтоб из этого получался parallel_case

_ _ _ _ _ _ _ _ _ _ selected_signal=bus_for_selection;

_ _ _ _ _ _ end

_ _ end

 

кто как решает такую задачу?

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


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

always_comb

_ _ begin

_ _ _ _ selected_signal=1'b0;

_ _ _ _ for (int i =0; i<N; i++)

_ _ _ _ _ _ begin

_ _ _ _ _ _ _ _ if (one_hot_selector==1'b1) // _ _ _ _ _ _хочется чтоб из этого получался parallel_case

_ _ _ _ _ _ _ _ _ _ selected_signal=bus_for_selection;

_ _ _ _ _ _ end

_ _ end

Если в one_hot_selector может быть только одна единица,

то выше приведенный код, по моему, можно записать так:

 

wire selected_signal = ((one_hot_selector & bus_for_selection)!=0);

 

Или в one_hot_selector может быть больше одной единицы и надо

делать приоритетную выборку из bus_for_selection ?

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


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

Если в one_hot_selector может быть только одна единица,

то выше приведенный код, по моему, можно записать так:

 

wire selected_signal = ((one_hot_selector & bus_for_selection)!=0);

 

Или в one_hot_selector может быть больше одной единицы и надо

делать приоритетную выборку из bus_for_selection ?

 

Или:

selected_signal = |(one_hot_selector & bus_for_selection);

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


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

ну да, спасибочки. :cheers:

ток я как-то не подумав свёл задачу к частному случаю - в более общем предполагается

 

parameter N=x;

parameter M=y;

wire [N-1:0] one_hot_selector;

wire [N-1:0][M-1:0] bus_for_selection;

bit [M-1:0]selected_signal; //(<=>selected_bus)

;)

поэтому в сторону маскирования как-то даже и не подумалось

 

как с этим-то быть ?!?

неужели вот так ?

 

bit [N-1:0][M-1:0] bus_bundle_mask;

bit [N-1:0][M-1:0] bus_bundle_maskED;

 

always_comb

_ begin

_ _ _ for (i=0;i<N;i++)

_ _ _ _ _ for (j=0;j<M;j++)

_ _ _ _ _ _ _ bus_bundle_mask[j]=one_hot_selector;

_ end

 

always_comb

_ bus_bundle_maskED=bus_for_selection & bus_bundle_mask;

 

always_comb

_ begin

_ _ _ bit [M-1:0]selected_bus_temp=bus_bundle_maskED[0];

_ _ _ for (i=0;i<N-1;i++)

_ _ _ _ selected_bus_temp=bus_bundle_maskED[i+1] | selected_bus_temp;

_ _ _ selected_signal=selected_bus_temp;

_ end

 

жутковато однако :cranky:

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


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

жутковато однако :cranky:

А вот так не устроит ?

    wire [N-1:0] one_hot_selector;
    wire [N-1:0][M-1:0] bus_for_selection;
    reg [M-1:0]selected_signal;

    always_comb
    begin
        for (i=0;i<N;i++)
            if(one_hot_selector[i])
                selected_signal = (selected_signal | bus_for_selection[i]);
    end

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


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

а generate не запрещено использовать?

 

    wire [N-1:0] one_hot_selector;
    wire [N-1:0][M-1:0] bus_for_selection;
    wire [M-1:0]selected_signal;
    genvar i;

    generate for (i=0; i<M; i=i+1) begin: gen_block
        assign selected_signal[i] = |(bus_for_selection[i] & one_hot_selector);
    end endgenerate

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


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

спасибо, ребята

всё понял. мне всё-таки кажется что путь с маскированием немного сложновато потом читать будет (я конечно понимаю что тут похоже дело либо музыку либо ехать) - но всё-таки код не самодокументируемым получается - трудно в таком переключатель разглядеть

однако решпект

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


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

похожая задача, но с небольшим отклонением:

вот то, что хочу получить, но чтобы N было параметром

 

wire [N-1:0] hot_selector;  // может быть выставлено несколько бит, выбирается по приоритету самый младший/старший (не важно)
wire [M-1:0] bus_for_selection [0:N-1];
wire [M-1:0] selected_signal;

assign selected_signal = (  hot_selector[0] ? bus_for_selection[0][M-1:0]:
                            hot_selector[1] ? bus_for_selection[1][M-1:0]:
                            hot_selector[2] ? bus_for_selection[2][M-1:0]:
                                               ...
                            hot_selector[N-1] ? bus_for_selection[N-1][M-1:0]: 0 );

 

 

сложность в том, что сигнал "selected_signal" - не массив и присутствует в единственном экземпляре,

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

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


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

вот то, что хочу получить, но чтобы N было параметром

если я правильно понял, что требуется, то тут ничего сложного - заводите цикл for и выскакиваете по break как только встретится первая единица. схема-то в любом случае приоритетная получается, а не параллельная. (у вас небольшая путанница - если может быть установлено несколько бит - то это уже не параллельный one_hot)

for (int i=0; i<N;i++) begin
if (selector[i]==1'b1)
  selected_signal=bus_for_selection[i];
break; end

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


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

я пишу на Verilog, break - вроде как есть только в SystemVerilog

сделал через while:

 

function integer my_sel (input [N-1:0] p_hot_selector);
begin    
      integer j; 
      j = 0;
      while ( (j<(N-1))&&(!p_hot_selector[j]) ) // loop
                                                j = j+1;
      my_sel = j;      
end
endfunction

...

assign selected_signal = bus_for_selection[my_sel(hot_selector)];

 

ЗЫ: путаницы с one_hot нету, поэтоу я убрал "one" из названия переменной, просто хотел сохранить терминологию, чтобы было проще.

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


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

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

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

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

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

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

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

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

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

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