CaPpuCcino 0 18 марта, 2007 Опубликовано 18 марта, 2007 · Жалоба подскажите пожалуйста как сделать параметризируемый коммутатор 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 кто как решает такую задачу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shamil 2 18 марта, 2007 Опубликовано 18 марта, 2007 · Жалоба 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladv 0 18 марта, 2007 Опубликовано 18 марта, 2007 · Жалоба Если в 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 18 марта, 2007 Опубликовано 18 марта, 2007 · Жалоба ну да, спасибочки. :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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shamil 2 19 марта, 2007 Опубликовано 19 марта, 2007 · Жалоба жутковато однако :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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 19 марта, 2007 Опубликовано 19 марта, 2007 · Жалоба а 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 19 марта, 2007 Опубликовано 19 марта, 2007 · Жалоба спасибо, ребята всё понял. мне всё-таки кажется что путь с маскированием немного сложновато потом читать будет (я конечно понимаю что тут похоже дело либо музыку либо ехать) - но всё-таки код не самодокументируемым получается - трудно в таком переключатель разглядеть однако решпект Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 5 апреля, 2009 Опубликовано 5 апреля, 2009 · Жалоба похожая задача, но с небольшим отклонением: вот то, что хочу получить, но чтобы 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" - не массив и присутствует в единственном экземпляре, поэтому в вариантах с генерейтом получается мультиприсвоение. Вышеизложенный вариант с маскированием вроде как можно применить, но уж больно некрасиво получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 5 апреля, 2009 Опубликовано 5 апреля, 2009 · Жалоба вот то, что хочу получить, но чтобы 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serg_Fry 0 6 апреля, 2009 Опубликовано 6 апреля, 2009 · Жалоба я пишу на 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" из названия переменной, просто хотел сохранить терминологию, чтобы было проще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться