Цитата(Derek @ Jun 17 2008, 11:08)

Ок, спасибо!
Мне тоже приходил в голову первый способ, но я решил, что он не корректный и думал есть иной вариант.
Второй вариант понятен с точки зрения программы, зная адрес каждого бита регистра , можно
легко установить или сбросить тот или иной бит. Но как это реализовать аппаратно. Ведь у нас есть только сигналы PSEL, PWRITE, PWDATA, PENABLE. Такая организация позволяет писать только словом. Даже если на мост приходит команда записать бит, как дальше идет сигнал? То есть, кроме тех 4 сигналов я могу на мост добавить еще несколько сигналов, которые позволят аппаратно реализовать поддержку команды работы с битом? Такие вопросы у меня возникли после прочтения ответа. До этого я просмотрел всю информацию по AMBA(скачал с сайта ARM), и изучил как строятся системы на ней. А вот в ядро ARM пока не влазил.
Откуда такой интерес? Все просто , у нашей фирмы заказ на периферийный блок, который взаимодействует с ядром ARM по APB. Так поставлена задача.
Вот еще вопрос: в спецификации на AMBA они не рекомендуют сажать регистры и периферические блоки на PCLK (APB), так как это приводит к резкому возрастанию потребляемой мощности. Почему такое ограничение именно на PCLK? Иной тактовый сигнал не вызовет скачка потребления? Запись в регистр я веду по фронту PENABLE.
На APB шине вы про команды ничего не знаете, у вас есть только Чтение PWRITE = 0 и запись PWRITE = 1. О том что за команда в процессоре сейчас вам занть не к чему. К вам вообще может обращаться например контроллер DMA.
кроме PSEL, PWRITE, PWDATA, PENABLE есть еще PADDR ну и еще некоторые. Вот на PADDR и смотрите.
условно быстрый набросок, компилироваться не будет
reg [31:0] PWM_CNT;
always @(posedge PCLK)
if (PADDR == 0x10 & PSEL & PENABLE) PWM_CNT <= PWDATA;
else if (PADDR == 0x100 & PSEL & PENABLE) PWM_CNT[0] <= |PWDATA;
else if (PADDR == 0x101 & PSEL & PENABLE) PWM_CNT[1] <= |PWDATA;
else if (PADDR == 0x102 & PSEL & PENABLE) PWM_CNT[2] <= |PWDATA;
...
else if (PADDR == 0x120 & PSEL & PENABLE) PWM_CNT[31] <= |PWDATA;
т.е. если обращение по адресу 0х10, то записываем все слово, если по другим адресам то если нам записывают СЛОВО (32 бита) которое больше нуля, то мы взводим ОДИН бит, иначе очишаем бит.
Т.е. записи все равно словные, но модифицируется только один бит.
Все в ARM ведется по клокам. Про запрет записи по PCLK вам показалось, есть рекомендации по клок гейтингу, т.е. пропускать сигнал PCLK только в в том случае, если он дейтсвительно нужен. т.е. если у вас ваш контроллер PWM будет отключен, то PCLK надо за гейтить на входе, что бы он не ходил внутрь. Тут опять таки зависит от вашей концепции разработки, если у вас есть специальный блок генератора тактовых сингналов на весь кристалл, то гейтить надо там, если нет, то прям у себя, но опять таки, один бит, PWM_EN - который разрешает работу всему PWM должен быть доступен всегда. Имеено он гейтит PCLK внутри PWM. Вообщем то клок гейтинг это отдельный большой вопрос.
А фирма какая если не секрет ?