реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Подсчет числа одинаковых разрядов двоичного числа, ищется комбинаторная реализация
sazh
сообщение Apr 29 2006, 19:31
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Уважаемый id_gene. Дело в том, что я не программист. И хотя текст этот понимаю, в железе освоил только FO, а вот условие в while ну никак осилить не могу. Ошибку выдает. Может Вы мне поможете. Написать пару формул.
Go to the top of the page
 
+Quote Post
DS
сообщение Apr 29 2006, 20:27
Сообщение #17


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



По моему делается из 31 элемента XOR, который сводит 0 к 1 в соотвествии с первым разрядом и приоритетного шифратора. Как его сделать, написано в любой книжке по цифровой логике. Чтобы не делать многовходовых функций, он каскадируется.



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


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Apr 30 2006, 18:02
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
DS
сообщение Apr 30 2006, 18:24
Сообщение #19


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



А как Вы думаете, что построится по Вашим IF ? Это и будет приоритетный шифратор. Собрать 16 входов физически нельзя, и поскольку компилятор не понимает сущности задачи, он его нарежет произволльным образом и либо вентилей получится больше чем надо, либо логических уровней.А скорее всего вообще будет построен коммутатор на 32 входа, который вектора от 0 до 31 на выход пропускает.

Лучше об этом самому подумать. А то потом возникает удивление, почему в микросхеме площади не хватает.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Gate
сообщение Apr 30 2006, 18:24
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 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)

Код неверен, т.к. поразрядный ксор будет выдавать парити.


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post
glock17
сообщение May 1 2006, 00:58
Сообщение #21


Частый гость
**

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



Всем откликнувшимся - большое спасибо!
Проблема на предварительном уровне решена.
Докладываю результаты проверки smile.gif :
- конструкция, предложенная sazh, заработала без проблем, так что беру её на карандашик (sazh, отдельное спасибо)
- кроме того, есть собственный вариант (после отладки опубликую).
- все остальные варианты пока досконально не ковырял (я пишу "досконально", потому что сразу они не заработали, каждый нуждается в доделках (на что пока не было времени), хотя идеи практически везде правильные). Единственное замечание из личного опыта: использование конструкции while допустимо при создании функционального кода, при синтезе лучше такой конструкции избегать, так как часто это выливается в неоправданное расходование ресурсов.

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

Тем не менее, тема пока не закрыта, поэтому дальнейшие предложения приветствуются.

Еще раз спасибо всем участникам дискуссии. a14.gif
Go to the top of the page
 
+Quote Post
Chudik
сообщение May 1 2006, 01:10
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Цитата(DS_ @ Apr 30 2006, 11:24) *
А как Вы думаете, что построится по Вашим IF ? Это и будет приоритетный шифратор.
Лучше об этом самому подумать. А то потом возникает удивление, почему в микросхеме площади не хватает.

Да я как-то и не спорю с этим wink.gif. Насколько я понимаю, эти IF выродятся именно в то, что я написал чуть выше. Только более короткая форма в программе. Собственно, вопрос в том, что автору топика важнее: время или количечство занимаемого силикона. Если второе, то можно просто сдвигать и счимтать количество одинаковых битов. Если важнее первое, то приоритетный шифратор - вот он smile.gif

Цитата(Gate @ Apr 30 2006, 11:24) *
Код неверен, т.к. поразрядный ксор будет выдавать парити.

Да, пожалуй. Он хорошо работает с лидирущими нулями. С нечётным количеством лидирующих единиц приведёт к неправильному результату. Значит, к сожалению придётся ставить поразрядные & и |. Какая неприятность.... wacko.gif
Go to the top of the page
 
+Quote Post
sazh
сообщение May 2 2006, 06:48
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



А разве мой первый вариант это разве не XOR в связке с преоритетным шифратором?. Другое дело : при таком описании синтезатор сумматоры задействовал. так можно и без сумматоров. А можно и с клоком на конвейере. А лучше синтезатора (ручками) приоритетный шифратор все равно не сделаете.
module comp32p
(
input [31:0] in,
output [4:0] out
);


reg temp;
integer temp_a;

integer i;

always @(in) begin
temp=1;
temp_a=31;
for (i=31; i>0; i=i-1) begin
if ((in[31] != in[i-1]) & temp) begin
temp_a = 31-i;
temp = 0;end end
end
assign out = temp_a[4:0];

endmodule
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016