Перейти к содержанию
    

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

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

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

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

Изменено пользователем Lotor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Принципиально не помогаю студентам-двоечникам

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Люди, не подскажите, как можно посчитать количество единиц в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sazh , большое спасибо! И, извиняюсь за оффтоп, всех с победой сборной России по хоккею! :08:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Например, бит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;

 

...

Изменено пользователем Amper25

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

--

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

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

 

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

 

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...