|
Подсчет числа одинаковых разрядов двоичного числа, ищется комбинаторная реализация |
|
|
|
Apr 29 2006, 20:27
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
По моему делается из 31 элемента XOR, который сводит 0 к 1 в соотвествии с первым разрядом и приоритетного шифратора. Как его сделать, написано в любой книжке по цифровой логике. Чтобы не делать многовходовых функций, он каскадируется. Если полагаться, что компилятор Вам такую штуку придумает по поведенческому описанию, то в ней может оказаться тысяч сто вентилей
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Apr 30 2006, 18:02
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Я тоже, почитав ответы, пришёл к выводу об использовании XOR. Можно каскадированием, как предложил DS_, но при этом, имхо, это будет последовательное сравнение, т.е. тратим время. Я бы, возможно, сделал примерно так: Код if (!(^data[31:0])) cnt = 31; else if (!(^data[31:1])) cnt = 30; else if (!(^data[31:2])) cnt = 29; ... else if (!(^data[31:30])) cnt = 1; else cnt=0 или, если хочется короче: Код for(i=0; i<32; i=i+1) if(!(^data[31:i]) begin cnt = 31 - i; break; end всё это, естественно, под always @(data)
Сообщение отредактировал Chudik - Apr 30 2006, 18:05
|
|
|
|
|
Apr 30 2006, 18:24
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
А как Вы думаете, что построится по Вашим IF ? Это и будет приоритетный шифратор. Собрать 16 входов физически нельзя, и поскольку компилятор не понимает сущности задачи, он его нарежет произволльным образом и либо вентилей получится больше чем надо, либо логических уровней.А скорее всего вообще будет построен коммутатор на 32 входа, который вектора от 0 до 31 на выход пропускает.
Лучше об этом самому подумать. А то потом возникает удивление, почему в микросхеме площади не хватает.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Apr 30 2006, 18:24
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Цитата(Chudik @ Apr 30 2006, 22:02)  Я тоже, почитав ответы, пришёл к выводу об использовании XOR. Можно каскадированием, как предложил DS_, но при этом, имхо, это будет последовательное сравнение, т.е. тратим время. Я бы, возможно, сделал примерно так: Код if (!(^data[31:0])) cnt = 31; else if (!(^data[31:1])) cnt = 30; else if (!(^data[31:2])) cnt = 29; ... else if (!(^data[31:30])) cnt = 1; else cnt=0 или, если хочется короче: Код for(i=0; i<32; i=i+1) if(!(^data[31:i]) begin cnt = 31 - i; break; end всё это, естественно, под always @(data) Код неверен, т.к. поразрядный ксор будет выдавать парити.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
May 1 2006, 00:58
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 3-09-04
Пользователь №: 586

|
Всем откликнувшимся - большое спасибо! Проблема на предварительном уровне решена. Докладываю результаты проверки  : - конструкция, предложенная sazh, заработала без проблем, так что беру её на карандашик (sazh, отдельное спасибо) - кроме того, есть собственный вариант (после отладки опубликую). - все остальные варианты пока досконально не ковырял (я пишу "досконально", потому что сразу они не заработали, каждый нуждается в доделках (на что пока не было времени), хотя идеи практически везде правильные). Единственное замечание из личного опыта: использование конструкции while допустимо при создании функционального кода, при синтезе лучше такой конструкции избегать, так как часто это выливается в неоправданное расходование ресурсов. Окончательный вариант пока не выбран, точку в этом деле поставим после синтеза (жду, когда заработает FTP, что бы сразу использовать синтезатор, указанный заказчиком). Вариант sazh намного компактнее нашего по коду, однако насчет компактности при синтезе я пока не уверен. Тем не менее, тема пока не закрыта, поэтому дальнейшие предложения приветствуются. Еще раз спасибо всем участникам дискуссии.
|
|
|
|
|
May 1 2006, 01:10
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(DS_ @ Apr 30 2006, 11:24)  А как Вы думаете, что построится по Вашим IF ? Это и будет приоритетный шифратор. Лучше об этом самому подумать. А то потом возникает удивление, почему в микросхеме площади не хватает. Да я как-то и не спорю с этим  . Насколько я понимаю, эти IF выродятся именно в то, что я написал чуть выше. Только более короткая форма в программе. Собственно, вопрос в том, что автору топика важнее: время или количечство занимаемого силикона. Если второе, то можно просто сдвигать и счимтать количество одинаковых битов. Если важнее первое, то приоритетный шифратор - вот он  Цитата(Gate @ Apr 30 2006, 11:24)  Код неверен, т.к. поразрядный ксор будет выдавать парити. Да, пожалуй. Он хорошо работает с лидирущими нулями. С нечётным количеством лидирующих единиц приведёт к неправильному результату. Значит, к сожалению придётся ставить поразрядные & и |. Какая неприятность....
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|