Jump to content

    
Sign in to follow this  
lotor

Подсчет количества единиц

Recommended Posts

Люди, не подскажите, как можно посчитать количество единиц в 8 разрядном результате ацп с помощью цифровых микросхем? Хотя бы идею.

Я научен мыслить микропроцессорной схемотехникой, а тут курсовик. И как назло препод-динозавр. Говорит, можешь делать курсач на МК, но количество единиц покажешь мне, как считать на микросхемах.

Мне на ум приходит только такая схема, что кварц формирует импульсы, по каждому импульсу из регистра выталкивается разряд, который подается на счетчик. Счетчик срабатывает только при единичном уровне на входе. Результат счетчика - параллельный код...

Edited by Lotor

Share this post


Link to post
Share on other sites

Принципиально не помогаю студентам-двоечникам, но раз Вы "научены мыслить микропроцессорной техникой", сделаю исключение. Идея: используем сумматор - логическую схему. Надеюсь, легко разберётесь.

Share this post


Link to post
Share on other sites

Очень просто. Поставить на выход АЦП ПЗУ. Минимум 256х3.

Каждое значение АЦП в диапазоне 0-255 будет адресом ПЗУ. Ну а запрограммировать ПЗУ так, чтобы в соот. адресе было число, которое показывает число единиц в этом адресе. Тут хватит всего три бита.

 

Это самая простая схема.

 

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

 

Но идея такова.

Записываете логическое выражение зависимость конкретного разряда выхода от состояния всях входов.

Минимизируете ее. Оставшееся - реализуете на элементах И-НЕ или ИЛИ-НЕ. Но чтобы вам тут все это рассказать нужно примерно 1 семестр времени и сотня килобайт текста.

Share this post


Link to post
Share on other sites
Принципиально не помогаю студентам-двоечникам

 

Никогда не понимал людей, которые дают подобные характеристики. Вам было так трудно ответить без этой фразы? Кстати, спасибо за ответ, но. Попросил дать идею в ветке для начинающих - получил себе характеристику. И что Вас в моем сообщении натолкнуло на подобное? Да, представьте, научен делать и делаю микропроцессорные системы. И, в принципе, это уже считается вчерашним днем, что уж говорить о рассыпухе. Удачи.

Share this post


Link to post
Share on other sites

Специалист, который не умеет делать на рассыпухе - никто. Это радиолюбитель. Для дома, для семьи. Сделай сам. И пр.

Надо учиться. Надо.

Share this post


Link to post
Share on other sites

Давайте только без громких фра. =) Вот я 2 года как разрабатываю приборы на микроконтроллеров (хотя больше программы к ним пишу) и не разу не потребовались счетчики, сумматоры, логические И. И зачем мне учиться рассыпухе, если она не используется? И не надо говорить, что я никто. Начальство не жалуется. =)

И кстати, я тут нигде не утверждал, что не знаю как это все работает. Попросил всего-то идею, как считать единицы. Вы же тут слепили выводы, что Вам пишет двоечник, ничего не понимающий, ничего не знающий. Ну давайте, расскажите обо мне еще чего нового. =))

Share this post


Link to post
Share on other sites

А если поставить преобразователь из параллельного в последовательный код, а потом просто подсчитывать кол-во импульсов счетчиком. Преобразователь и счетчик реализуются несложным образом на триггерах, ну и всю эту бодягу надо будет затактировать генератором, который можно собрать на И-НЕ, например. Хотя решение с сумматором мне кажется проще.

Share this post


Link to post
Share on other sites
А если поставить преобразователь из параллельного в последовательный код, а потом просто подсчитывать кол-во импульсов счетчиком. Преобразователь и счетчик реализуются несложным образом на триггерах, ну и всю эту бодягу надо будет затактировать генератором, который можно собрать на И-НЕ, например.

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

Share this post


Link to post
Share on other sites
Люди, не подскажите, как можно посчитать количество единиц в 8 разрядном результате ацп с помощью цифровых микросхем? Хотя бы идею.

Я научен мыслить микропроцессорной схемотехникой, а тут курсовик. И как назло препод-динозавр. Говорит, можешь делать курсач на МК, но количество единиц покажешь мне, как считать на микросхемах.

Мне на ум приходит только такая схема, что кварц формирует импульсы, по каждому импульсу из регистра выталкивается разряд, который подается на счетчик. Счетчик срабатывает только при единичном уровне на входе. Результат счетчика - параллельный код...

 

Полковник был большая сволочь и пасовал при 3 тузах. (Этот я о Вашем преподе)

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

Но как говориться за нас все делает синтезатор (пакеты для работы с программируемой логикой)

Главное правильно описать. И ВЫ как алгоритмист легко это сможете.

Вот пример на верилоге (уже все сделано)

Идея проста. Берется 32 разрядная переменная и обнуляется.

Потом в цикле берется каждый разряд последовательно и сравнивается с 1.

Если это единица к значению в переменной прибавляется 1.

После последнего разряда выходим их цикла и в переменной num_bits исконное значение

 

Этот пример предложен в пакете MAX+ Альтера.

Запустите в любом пакете, где есть просмотрщик того, во что (схема) это выльется.

А выльется это в цепочку чередующихся сумматоров и мультиплексоров. Длина цепочки прямо пропорциональна количеству разрядов на входе схемы.

Это сходу никто не нарисует. Да и глупо требовать это делать на рассыпухе, если адгоритмически все понятно.

 

// MAX+plus II Verilog Example

// Combinatorial Always Statement

// Copyright © 1994 Altera Corporation

 

module proc (d, q);

 

input [2:0] d;

output [1:0] q;

 

integer num_bits;

 

always @(d)

begin: block

integer i;

 

num_bits = 0;

for (i = 0; i < 3; i = i + 1)

if (d)

num_bits = num_bits + 1'b1;

end

 

assign q = num_bits;

 

endmodule

Share this post


Link to post
Share on other sites

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

 

Например, бит0 результата вычисляется как:

RES_Bit0 <= BIT0 xor BIT1 xor BIT2 xor ... BIT7;

 

Биты 1 и 2 результата будут чуть сложнее считатся, как - мне лень сейчас думать.

 

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

 

IN1: IN2: RESULT: CARRY:

0____0________0________0

0____1________1________0

1____0________1________0

1____1________0________1

 

те.

RESULT <= IN1 xor IN2;

CARRY <= IN1 and IN2;

 

...

Edited by Amper25

Share this post


Link to post
Share on other sites

Проще ПЗУ не придумать.

А раз человек не в курсе про схемотехнику, то подключать альтеру какую-нибудь чисто умается.

--

Есть еще один извратный способ, но очень простой.

Все выходы АЦП объединяются через резисторы, к примеру, 10 килоом. С точки объединения - на землю какой-нибудь резистор, килоом 100, например.

 

Тогда напряжение на выходе будет прямопропорционально числу единиц.

 

ставим крутой стрелочный прибор и градуируем его. Точность будет очень хорошей. Ибо всего 8 градаций. Это примерно 0.6 вольта на единицу при питании 5 вольт.

 

Очень круто будет. Hi-end измеритель чила единиц. Почти ламповый.

 

К тому же препод отвергнет идею с альтерой. Это не есть рассыпуха.

А вот ПЗУ под это дело подходит лучше. Формально - это рассыпуха.

Share this post


Link to post
Share on other sites

А что мешает сделать так. Разбиваем байт на "слова" по два бита, суммируем количество едениц в каждом из них (на это уйдет 4 однобитных сумматора), далее, получив четыре числа попарно суммируем их (еще два 2-битных сумматора) - получаем два числа. Просуммировав последние (еще один 3-битный сумматор) - получаем результат - количество единичных бит в байте

Share this post


Link to post
Share on other sites
Есть еще один извратный способ, но очень простой.

Все выходы АЦП объединяются через резисторы, к примеру, 10 килоом. С точки объединения - на землю какой-нибудь резистор, килоом 100, например.

Классная идея!

немного модифицирую:

с выходов АЦП делаем аналоговый сумматор на опере, далее ставим простенькое АЦП, 8 бит, например, и тогда его старшие 3 разряда как раз будут показывать количество единиц.

PS: не сочтите за издевательство, на самом деле классная идея!

Share this post


Link to post
Share on other sites
Классная идея!

немного модифицирую:

с выходов АЦП делаем аналоговый сумматор на опере, далее ставим простенькое АЦП, 8 бит, например, и тогда его старшие 3 разряда как раз будут показывать количество единиц.

PS: не сочтите за издевательство, на самом деле классная идея!

Очень похоже на: "чтобы понять рекурсию, нужно понять рекурсию" :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this