-
Chaosorg
-
Автор темы
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
В связи с проектом цифрового осциллографа с имитацией фосфора на марсоходе 2 учусь использовать полную двухпортовую память.
Один канал только для записи точек оцифрованного сигнала. Тут все просто - wren постоянно активен, меняется только адрес. Тактируется вместе с АЦП. Все работает и пишется нормально.
Второй канал первоначально работал только на чтение, чтобы показывать осциллограмму на экране. wren был постоянно неактивен. Картинка выводилась хорошо.
Теперь надо прикрутить постепенное затухание точек. Я вычитаю яркость только что прочитанной из памяти очередной точки и пока она показывается на экране хочу успеть записать новое значение ее яркости обратно в память. Получаю черный экран или еще какие-то сбои. Почитал документацию от Altera. На диаграмах везде wren показывают какой-то долгий очень. Как бы для записи группы слов. А мне надо понять какова его минимально возможная длительность. Что читать или какой проект подсмотреть? Или может так просто подскажет кто-нибудь?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Проект желательно делать полностью синхронным (с одним клоком), так существенно меньше проблем. Значение wren важно только в момент активного фронта клока, остальное - забота Квартуса.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
Автор темы
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Заработало все как надо, но, к сожалению, все-таки не до конца понятно каким образом. У меня первоначально один клок и был. И были проблемы. Работоспособность удалось достичь тем, что изменение адреса записи сигнала осциллографа (т.е. то, что и так хорошо работало) я стал делать по ниспадающему клоку. Таким образом в момент прихода активного (положительного) фронта клока значение адреса стало стабильным. Точно так же уже было сделано раньше для второго канала, по которому читал, а теперь еще и пишет видеоконтроллер.
Как изменение момента адреса на одном канале "починило" процедуру записи другого канала - непонятно. Сигналы синхронизации или wren не трогал ведь. wren и так раньше менялся по ниспадающему клоку, чтобы иметь определенное значение к моменту нарастающего клока.
Я ожидал других проблем от того, что делал столько вычислений с адресом и операций чтения записи памяти по положительному клоку - что будет мусорное значение адреса, но этого не происходило. Видимо дело в том, что соседние значения адреса у меня подобны - видеоадаптер так вообще увеличивает их на 1, а дигитайзер тоже чертит линию, т.е. работает с соседними адресами.
Такое впечатление, что контроллер памяти как-то реагирует на изменение адреса самого по себе.
Вроде как получается, что вывод можно сделать такой - хватает длительности wren от одного ниспадающего клока памяти до следующего ниспадающего, т.е. минимально возможного при работе с одним клоком.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Квартус не гарантирует правильную работу блочной памяти при одинаковых адресах на разных каналах, это написано в handbook.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
Автор темы
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Leka пишет: Квартус не гарантирует правильную работу блочной памяти при одинаковых адресах на разных каналах, это написано в handbook.
Да - это я читал. Но если осциллограф в отсутсвие сигнала и незапущенной развертке ждет триггера и чертит одну только точку внизу слева, а видеоадаптер сканирует все поле точек, то где же совпадение и конфликт адресов? Осциллограф занимает время памяти при этом, конечно, но по одному адресу вдали от остальной картинки. Для формируемой им картинки это настолько не критично, что я даже не отслеживаю эту ситуацию, как рекомендуется. Написано, что запишутся случайные данные - пусть.
Окончательная ясность будет, я так понял, после того как я научусь делать симуляцию и смотреть сигналы. Сейчас я свои диаграммы черчу вручную. Квартус сразу после установки почему-то пишет, что не указан путь к соответствующему инструментарию, хотя путь какой-то уже прописан.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Я вычитаю яркость только что прочитанной из памяти очередной точки и пока она показывается на экране хочу успеть записать новое значение ее яркости обратно в память.
Пример (a - адрес, q - прочитанное значение, d - новое значение): always@(posedge clk) if(en) begin
a <= a+1;
d <= q-1;
end Все по одному фронту одного клока, управление фазами/паузами/... - по сигналам разрешения клока.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Chaosorg
-
Автор темы
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Leka пишет: Я вычитаю яркость только что прочитанной из памяти очередной точки и пока она показывается на экране хочу успеть записать новое значение ее яркости обратно в память. Пример (a - адрес, q - прочитанное значение, d - новое значение):always@(posedge clk) if(en) begin
a <= a+1;
d <= q-1;
end Все по одному фронту одного клока, управление фазами/паузами/... - по сигналам разрешения клока.
Я хочу понять как решились сложности с wren. С тем, что Вы показали проблем не было. У меня достаточно времени, чтобы посчитать новый адрес и новое значение яркости, но адрес-то должен поменяться позже. Показанный Вами вариант похож на мои ранние версии и тогда у меня была бегущая строка :) Т.е. новое значение яркости попадало в точку справа.
Попробую сформулировать вопрос иначе. Есть некий видеоадаптер - он читает память и выводит ее на экран. Размер пикселей удвоен. Т.е. каждая точка на экране показывается два клока, а не один. Во время второго клока есть желание записать неким образом модифицированное значение той же (!) точки (а не a+1) обратно в память. В моем случае это было уменьшение яркости. Визуально это выглядит как постепенное затухание картинки.
Оно теперь у меня все работает, но... Я хочу понять, почему на работоспособность этого всего повлиял выбор момента смены адреса на соседнем канале двухпортовой памяти. Я черчю диаграммы и получается, что я активизирую wren за такт раньше, чем надо и тогда работает.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Я понял, что надо, но привел неверный код. Адрес надо пропускать через дополнительный регистр, чтобы получить сдвиг на такт по отношению к данным: always@(posedge clk) if(we) a <= a+1;
always@* d = q-1;
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
Автор темы
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
В процессе работы над своим процессором, работающим с двухпортовой памятью (второй канал использует видеоадаптер), я стал замечать всякие "мистические глюки". Например, на работу той или иной команды процессора может повлиять добавленное просто для тестовых целей неблокирующее присваивание единицы в регистр, связанный с светодиодом. Я так понимаю это влияет на количество потребителей у синхросигнала - чем их больше, тем "заваленнее" его фронт и событие происходит чуть позже. Долго мучился, а потом попробовал другую тактовую частоту для процессора и его канала памяти - уменьшил с 100 мегагерц до 20. И все заработало как надо.
Исходя из этого вопросы
1. какова максимальная скорость у двухпортовой памяти марсохода 2? Я так понимаю, что указанная в справочнике скорость 300 с лишним мегагерц относится к однопортовому варианту? или это действительно "честная" двухпортовая память?
2. надо ли как-то сдвигать относительно друг друга синхроимпульсы разных каналов памяти, чтобы их момент срабатывания не совпадал?
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Если память без дополнительного выходного регистра, то надо учитывать дополнительную задержку на распространение данных. Меняется логика в проекте --> меняются пути --> меняется задержка.
Проще всего делать один клок на весь проект (синхронный дизайн), и проверять максимальную частоту этого клока по отчету STA.
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.163 секунд