|
Подсчет числа одинаковых разрядов двоичного числа, ищется комбинаторная реализация |
|
|
|
Apr 28 2006, 06:41
|

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

|
Задача следующая: имеется 32-х разрядное число. Нужно вычислить, сколько у этого числа последовательных нулей или единиц, начиная со старшего разряда. Поясню на примере 8-разрядного числа: 0001xxxx или 1110xxxx дают результат 2 (3 одинаковых соседних бита в старших разрядах) 10xxxxxx или 01xxxxxx дают результат 0 (одинаковых соседних битов нет) 0000001x или 1111110x дают результат 5 (6 одинаковых соседних битов в старших разрядах) x означает, что значение этих битов уже не имеет значения. Задача тривиальна, если вычисления завязать на клок и строить внутри процесса (код пишется на Верилоге). Однако ищется возможность реализации на комбинационной логике (вопрос быстродействия стоит остро). Буду благодарен за любые конструктивные идеи.
|
|
|
|
|
Apr 28 2006, 07:28
|

МедвеД Инженер I
   
Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951

|
Цитата(glock17 @ Apr 28 2006, 10:41)  Задача следующая: имеется 32-х разрядное число. Нужно вычислить, сколько у этого числа последовательных нулей или единиц, начиная со старшего разряда. Поясню на примере 8-разрядного числа: 0001xxxx или 1110xxxx дают результат 2 (3 одинаковых соседних бита в старших разрядах) 10xxxxxx или 01xxxxxx дают результат 0 (одинаковых соседних битов нет) 0000001x или 1111110x дают результат 5 (6 одинаковых соседних битов в старших разрядах) x означает, что значение этих битов уже не имеет значения. Задача тривиальна, если вычисления завязать на клок и строить внутри процесса (код пишется на Верилоге). Однако ищется возможность реализации на комбинационной логике (вопрос быстродействия стоит остро). Буду благодарен за любые конструктивные идеи.  если всё упирается в быстродействие, тогда делаете таблично(ROM) адрес это ваши 0001xxxx и т.д. а на выходе уже получаете "ответ" за 1 такт а комбинационой логикой врядли получится быстрее
--------------------
Cogito ergo sum
|
|
|
|
|
Apr 28 2006, 07:55
|

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

|
Цитата А можно посмотреть на этот код? Какой код? Если этот Цитата Задача тривиальна, если вычисления завязать на клок и строить внутри процесса (код пишется на Верилоге). , то я его даже не писал, там никаких трудностей нет. Этот вариант написан на C, перевести его в верилог не проблема(будет время - переведу). Цитата int16 L32_exp(int32 x) { int16 exp = 0; if (!x) return 0;
while ((x ^ (x << 1)) > 0) { x <<= 1; exp++; } return (exp); } Но фишка в том, что такой вариант не катит.
|
|
|
|
|
Apr 28 2006, 08:10
|

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

|
Цитата если всё упирается в быстродействие, тогда делаете таблично(ROM) адрес это ваши 0001xxxx и т.д. а на выходе уже получаете "ответ" за 1 такт
а комбинационой логикой врядли получится быстрее Думал уже... Это какой же ROM нужен, чтобы таким макаром 32-х битное число обработать... Проблема в том, что эта процедура - мизерная часть офигенно развесистого алгоритма, который пишется для создания ASIC на его базе, поэтому затраты по площади (так же, как и быстродействие) - основные проблемы. Я уже попробовал минимизировать аналогичную функцию для 8-битного числа - результат впечатляет  С 32-битным даже пробовать не буду. Похоже, вариантов всего два - попытаться вообще исключить эту гнусную процедуру из алгоритма или все таки делать ее синхронно.
|
|
|
|
|
Apr 28 2006, 08:14
|
Участник

Группа: Свой
Сообщений: 51
Регистрация: 6-07-04
Пользователь №: 270

|
Если данные идут последовательно, то можно использовать счётчик. Сбрасывать его когда последующий бит не равен предыдущему.
|
|
|
|
|
Apr 28 2006, 08:26
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(glock17 @ Apr 28 2006, 01:41)  Задача следующая: имеется 32-х разрядное число. Нужно вычислить, сколько у этого числа последовательных нулей или единиц, начиная со старшего разряда. Поясню на примере 8-разрядного числа: 0001xxxx или 1110xxxx дают результат 2 (3 одинаковых соседних бита в старших разрядах) 10xxxxxx или 01xxxxxx дают результат 0 (одинаковых соседних битов нет) 0000001x или 1111110x дают результат 5 (6 одинаковых соседних битов в старших разрядах) x означает, что значение этих битов уже не имеет значения. Задача тривиальна, если вычисления завязать на клок и строить внутри процесса (код пишется на Верилоге). Однако ищется возможность реализации на комбинационной логике (вопрос быстродействия стоит остро). Буду благодарен за любые конструктивные идеи.  поток нужен ? или мона и ждайт ?
--------------------
|
|
|
|
|
Apr 28 2006, 10:08
|
Местный
  
Группа: Свой
Сообщений: 214
Регистрация: 26-05-05
Пользователь №: 5 397

|
To Gate: Это последовательный путь.. А надо параллельный, т.е. за 1 такт, тут задача на мой взгляд решается просто: Ставим 62 компаратора на (2,3,4..32 разряда), которые будут сравнивать наше слово с константами типа 11, 111, 1111,.... и т.д. 00, 000,0000... и т.д. соответсвтвенно цепляем на них старшие разряды шины и сравниваем со всеми одновременно выход будет работать по двоично-десятичной логике.
Сообщение отредактировал Magnum - Apr 28 2006, 10:09
|
|
|
|
|
Apr 28 2006, 10:37
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Цитата(sazh @ Apr 28 2006, 14:01)  To Gate В вашем примере неправильно будет интерпитироваться код все нули. Числа 31 не получить. При числе, состоящем из всех 1 или 0, выход из цикла произойдет с i=-1, result=31. Что неверно?Проблема только в вычислении a[-1] (синтезатор может и не ругнуться) - ну тогда надо индекс сдвинуть на +1 или переписать условие цикла. Впрочем, пускай глок проверяет, принцип ему три человека рассказали.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
Apr 29 2006, 10:08
|
carpe manana
  
Группа: Свой
Сообщений: 321
Регистрация: 2-06-05
Пользователь №: 5 659

|
Цитата(sazh @ Apr 28 2006, 14:01)  To Gate В вашем примере неправильно будет интерпитироваться код все нули. Числа 31 не получить. в исходном коде стоит if (!x) return 0;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|