Страница 1 из 3
Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 00:36:01
feodorsumkin
Добрый вечер, уважаемые Радиокоты, хочу просить совета.
Я не понимаю, как AVR-микроконтроллер производит сложение за один машинный такт.
Есть предположим в регистрах общего назначения (например R16 и R17) два числа.
Строкой
ADD R16, R17 мы за один такт складываем оба числа и перезаписываем результат в
R16.
А как же АЛУ умудряется за один такт извлечь число из
R16 и тут же перезаписать результат
обратно в
R16? Извлекает и записывает одновременно что ли?
АЛУ в AVR-микроконтроллерах прямо к РОНам подсоединено (судя по документации). Это как? Отдельная шина от АЛУ к РОНам что ли? Или всё же через общую шину данных обмен идёт, просто без промежуточных регистров-защёлок на входах АЛУ (тогда в принципе можно сказать, что АЛУ напрямую к РОНам подсоединено).
Но в любом случае это дело не меняет. Как можно извлекать информацию из регистра и тут же в него же что-то записывать ?
На диаграмме "Функционирование АЛУ" (из книги Евстифеева) в течение одного машинного такта производится и выборка данных, и сложение, и запись обратно. Как так получается? Там как-то временные сдвиги организуются между выборкой и записью? Тогда АЛУ получается работает не на 16 МГц, а на 48 МГц.
Или же фраза "сложить за один такт" несколько условна. Там же конвейерная обработка идёт. Пока идет выполнение команды, производится выборка и дешифровка следующей команды.
Тогда фраза "выполняется за один такт" просто-напросто означает, что никакие узлы микроконтроллера не простаивают. Что с каждым тактовым импульсом микроконтроллер один новый готовый результат выдаёт, нет никаких простоев и ожиданий в исполнительных узлах (АЛУ, Порты).
Содается иллюзия, что вроде как микроконтроллер за один такт инструцию выполняет, но на самом деле на выполнение сложения два такта нужно (извлечение из двух РОН + одновременное сложение >> запись в один из РОН).
Что скажете по этому поводу? Спасибо!
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 00:46:32
SII
Грубо говоря, извлекает оба требуемых значения одновременно по фронту тактового сигнала (предположим, что по фронту; детали реализации роли не играют). Чтобы получить два значения, используется двухпортовая регистровая память. Запись же фактически выполняется уже на следующем такте (тоже по фронту), но с одновременным чтением, причём если читать надо регистр, который записывается предыдущей командой, то вместо чтения этого регистра блок регистровой памяти прямо передаёт записываемое в этот момент значение на свой выход.
Между АЛУ и блоком регистров существует прямая связь уже давным-давно. Во всяком случае, двухпортовые блоки регистровой памяти с прямым подключением к АЛУ были нормой уже в 1960-е годы (только занимало это дело тогда куда больше места

).
Что же касается конвейера, то он, вероятно, учтён в числе тактов для команд переходов. Насколько помню, указывается по два такта, если переход выполняется, и один, если не выполняется. Лишний такт как раз требуется, чтобы прочитать команду по новому адресу и декодировать её.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 08:45:49
Goldsmith
feodorsumkin писал(а):Я не понимаю, как AVR-микроконтроллер производит сложение за один машинный такт.
...
Как можно извлекать информацию из регистра и тут же в него же что-то записывать ?
Вполне реально производить выборку данных по переднему фронту тактового сигнала, а запись модифицированных данных - по заднему фронту. На работу АЛУ остается запас времени полтакта.
feodorsumkin писал(а):Или же фраза "сложить за один такт" несколько условна. Там же конвейерная обработка идёт. Пока идет выполнение команды, производится выборка и дешифровка следующей команды.
...
Содается иллюзия, что вроде как микроконтроллер за один такт инструцию выполняет, но на самом деле на выполнение сложения два такта нужно (извлечение из двух РОН + одновременное сложение >> запись в один из РОН).
Так реальная производительность никогда не достигнет команды на такт. Рассмотрите вариант, когда выполняется десяток сложений подряд. Предвыборка следующей команды тут ничего не даст, нужен более сложный конвейер.
Сложение
действительно выполняется за один такт, без иллюзий.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 11:59:37
HHIMERA
Goldsmith писал(а):Вполне реально производить выборку данных по переднему фронту тактового сигнала, а запись модифицированных данных - по заднему фронту. На работу АЛУ остается запас времени полтакта.
Эт чё за бред???
Возьим бумажку, ручку, нарисуй и посчитай...
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 12:43:25
SmarTrunk
Вот как АТмега умножение делает, за, кажется, два такта - это интереснее. Табличным способом?
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 12:44:48
Gudd-Head
SmarTrunk писал(а):Табличным способом?
С помощью умножителя

которого нет у Тинек.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 13:27:43
Goldsmith
HHIMERA писал(а):Эт чё за бред???

Бред - твое обычное состояние, редкий твой пост без него обходится (что и оценено по достоинству).
HHIMERA писал(а):Возьим бумажку, ручку, нарисуй и посчитай...
Бери, рисуй и считай, художник-счетовод. Есть что сказать по делу - говори, нет - промолчи, появится хотя бы призрачный шанс сойти за умного.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:01:46
ibiza11
да чего вы тут ругаетесь то? взяли даташит и прочитали, блин.

Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:16:42
Kavka
SII писал(а):Запись же фактически выполняется уже на следующем такте (тоже по фронту), но с одновременным чтением, причём если читать надо регистр, который записывается предыдущей командой, то вместо чтения этого регистра блок регистровой памяти прямо передаёт записываемое в этот момент значение на свой выход.
SII по делу написал!
А если сложить высказанное SII предположение и "параллельный сумматор", то оно вполне складывается...
IMHO, у AVR все операции выполняющиеся 1 такт типа регистр-регистр и регистр-непосредственный_операнд укладываются в такую же схему. Да же без PLL, который можно предположить глядя на рис.6 из раздела 6 (6.7 для 48-й меги) спецификации.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:21:40
Gudd-Head
Kavka писал(а):у AVR все операции выполняющиеся 1 такт типа регистр-регистр и регистр-непосредственный_операнд укладываются в такую же схему
Это потому что машинное слово двухбайтное.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:24:13
HHIMERA
Goldsmith писал(а):Бред - твое обычное состояние.
Да нет уж...
Не надо стрелки переводить... стрелочник...
Запостил фигню (и уже не первый раз), так будь добр, признайся... а не истери, как "пионер на торжественной линейке"...
Не знаешь нихрена - промолчи лучше... или в даташит загляни...
Сам хоть почитай, чё за бред ты нацарапал... с такими мыслеизвращениями, как у тебя, и до "немцев на танчиках" внутри АВР договориться можно...

Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:26:56
ibiza11
дизайн всегда либо по переднему, либо по заднему фронту! Иначе - неоптимальное извращение.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 14:49:52
Goldsmith
HHIMERA писал(а):Не надо стрелки переводить... стрелочник...

Посмотри глазами, а не другим местом, диаграмму, которую привел
ibiza11. Там отчетливо видно, что по положительному фронту такта начинается выборка данных из регистрового файла, к середине на выходе АЛУ появляется результат, и по отрицательному фронту в течение второй половины такта инициируется запись результата. К началу следующего такта операция завершается, освобождая регистровый файл для очередной выборки. Она обязана завершиться, потому что результат может быть задействован в следующей команде, которая начнется по следующему положительному фронту.
HHIMERA писал(а):Не знаешь нихрена - промолчи лучше... или в даташит загляни...
Кабы ты сам следовал этому мудрому правилу, мог бы претендовать на вменяемость,а так - увы, как всегда, одни невнятные междометия, как у перевозбужденного павиана... Так что поиграй лучше в танчики с соседями по палате №6, если по делу сказать нечего.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 15:01:39
HHIMERA
Глаза разуй... неграмотный...
Графики впервые в жизни видишь??? В школу... за парту!!!:)))
Угу... внутри АВРа команды, как тараканы, сами по себе бегают... не тактируясь...
Сам хоть веришь в свой продолжающийся бред??? К доктору... срочно!!!
А теперь мысленно подели T1 и T2 пополам... что... теперь всё становится логичным???
И подсказка была...
Kavka писал(а):PLL, который можно предположить глядя на рис.6 из раздела 6 (6.7 для 48-й меги) спецификации.
Goldsmith ! Читай даташит... и не пори фигню!!!

Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 18:10:30
Kavka
Gudd-Head, я так понял, что тут никак не могут понять "как это он так за один так делает". Наводящие вопросы и подсказки не помогают. В результате...
HHIMERA, не надо из контекста выдёргивать.
Kavka писал(а):PLL, который можно предположить глядя на рис.6 из раздела 6 (6.7 для 48-й меги) спецификации.
Эта моя реплика была к тому, что можно по одному фронту и без PLL.
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 18:33:13
HHIMERA
Мля... "броненосцы в потёмках" !!!
Приведённый Figure 6 внимательнее посмотрите...
Fcpu в два раза выше Fclk (clkCPU)...
Нарисуйте Fcpu над Fclk и всё сами увидите... "Всё для фронта, всё для Победы!"(С)

Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 18:48:59
Kavka
SmarTrunk писал(а):Вот как АТмега умножение делает, за, кажется, два такта - это интереснее. Табличным способом?
Не только табличным.
Вот, например:
http://paralichka85.px6.ru/5cpu/glava05_11.htm
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 19:06:25
Kavka
HHIMERA писал(а):Мля... "броненосцы в потёмках" !!!
Приведённый Figure 6 внимательнее посмотрите...
Ты по делу давай, по делу, а не ля-ля. Если смайликов наставил, так и лапки к верху.
HHIMERA писал(а):
Fcpu в два раза выше Fclk (clkCPU)...
Нарисуйте Fcpu над Fclk и всё сами увидите... "Всё для фронта, всё для Победы!"(С)

Чего? Fcpu? Fclk? Это ты приводишь свою точку зрения - ты и рисуй, доказывай. А то взялся тут - "нарисуйте" да "посчитайте".
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 19:29:45
HHIMERA
Танунах...
Я что... и конфеты за вас есть должен??? Вот лентяи!!!
А чё тогда со мной спорите... если даже рисовать не умеете, не то чтобы логически мыслить???
Не может ничего выполняться по задне-переднему или параллельно-перпендикулярному фронту... тем более посредине и как попало... это хоть, надеюсь, понятно???
Всё строго тактируется... всегда... везде... и не только в АВР... кроме асинхронных таймеров и некоторых других приблуд периферии...
Re: Как AVR умудряется произвести сложение за один такт
Добавлено: Чт дек 13, 2012 19:42:12
Engineer_Keen
Собирал на ПЛИСке ядро AVR и MCS51, оба в "однотактном" варианте (естественно с конвеером). Тактировал
от кнопки на отладочной плате, простые инструкции типа сложить/скопировать в регистр делались реально за 1 такт, подключал шины данных и адресов на светодиоды, было видно характерное изменение по обоим фронтам такта. Насколько я знаю никакого PPL-а там не было (их в ПЛИСке всего 4 штуки, аппаратных и они задействованы не были точно). Да и какой PLL в статическом режиме

Конечно не факт, что те куски из которых я собирал работают действительно как железное ядро AVR, но факт остается фактом: один такт - одна операция.