LAS9891
Участник-
Постов
352 -
Зарегистрирован
-
Посещение
Весь контент LAS9891
-
А можно подробнее?
-
Вывод видео на монитор.
LAS9891 опубликовал тема в Работаем с ПЛИС, области применения, выбор
Здравствуйте! Прошу совета. Задача следующая. Требуется вывести видеоизображение с КМОП матрицы на стандартный монитор. Проект реализую на Cyclone IV. На плате также имеется SRAM 2 MB и SDRAM 64 MB. Пиксельная частота камеры 2 МГц, пиксельная частота монитора 40 МГц. Разрешение кадра 800х600. Матрица выдает кадры друг за другом без остановки. Поскольку частоты не совпадают необходимо использовать кадровый буфер. Предполагаю два варианта: 1) организовать кадровый буфер в SRAM на два кадра. При этом считывать данные из матрицы сначала в FIFO1 затем в SRAM. Когда первый кадр будет записан в SRAM начать выводить первый кадр SRAM->FIFO2->Монитор, при этом записывать второй кадр. При такой реализации возникают вопросы. Поскольку частоты разные, что делать, в случае, если первый кадр выведен на монитор, а второй кадр еще не считан? Шина адреса и шина данных у SRAM одни для записи и чтения, поэтому придется обеспечить корректное чередование записи и чтения? Как этого добиться? 2) организовать кадровый буфер на два кадра в разных микросхемах: в SRAM первый кадр, в SDRAM второй кадр. В этом случае шины адреса и шины данных раздельные и можно одновременно писать второй кадр в SDRAM и считывать первый из SRAM. При такой реализации возникают такие вопросы. В случае если кадр на монитор выведен, а новый еще не считался, можно будет повторить вывод старого кадра, после чего вывести новый кадр. Но вот в чем проблема, матрица выдает кадры друг за другом без остановки, и если новый кадр не считался (не успел) точно к моменту, когда старый закончил выводиться на монитор, то будет постоянно выводиться старый кадр. Как добиться этой синхронности? или необходимо считывать кадры с матрицы не постоянно, а только по требованию? типа считал первый кадр, начинаешь выводить первый и считывать второй, выводишь первый кадр несколько раз, до тех пор, пока не считается второй, когда считался второй, начинаем выводить второй и писать третий и так по кругу. -
В оригинале написано так же: 42S16320B_86400B.pdf
-
В оригинале написано так же: 42S16320B_86400B.pdf
-
Инициализация SDRAM.
LAS9891 опубликовал тема в Работаем с ПЛИС, области применения, выбор
Пробую разобраться с работой микросхемы SDRAM. Нашёл перевод описания на микросхему от фирмы Micron: Micron_SDRAM__________.pdf Возник вопрос с настройкой регистра управления. В описании написано: "3.2. Длина пакета Доступ к SDRAM по чтению и по записи пакетноориентированный, при этом длина пакета программируется, как показано на рис. 1. Длина пакета определяет максимальное число ячеек, которые могут быть доступны для поданной команды чтения или записи. Пакеты длиной 1, 2, 4 или 8 слов могут быть последовательными или чередующимися, ..." Вот в этом абзаце слова "ячейка" и "слово" одно и то же? Далее. Допустим размерность одной ячейки 16 бит и я хочу использовать длину пакета в 1 слово. Тогда при поступлении команды чтения или записи будет доступна одна ячейка. Пока все ясно. Далее написано следующее: "При подаче команды чтения или записи выбирается блок ячеек колонки, равный длине пакета. Все ячейки для этого пакета размещаются в пределах этого блока." - т.е. в моём случае выбирается одна ячейка из колонки, пакет равен одной ячейке и соответственно блок тоже равен одной ячейке. Пока все ясно. Далее: "Это означает, что если будет достигнута граница блока, то пакет вернётся к его началу." - ??? Кто куда вернётся? И самое непонятное: "Блок однозначно выбирается линиями A1A9 (x4), A1A8 (x8) или A1A7 (x16), когда длина пакета равна 2; A2A9 (x4), A2A8 (x8) или A2 A7 (x16), когда длина пакета равна 4; и A3A9 (x4), A3A8 (x8) или A3A7 (x16), когда длина пакета равна 8. " - допустим выбрал бы я длину пакета 2, что означают сиволы x4, х8, х16? Что за алгоритм такой? -
В MegaWizarde видел только для DDR SDRAM, или вы имеете ввиду где нибудь скачать?
-
Решил использовать ниос, потому что там есть готовый контроллер SDRAM и на данный момент вывод изображения из буфера SDRAM уже работает.
-
А в роли FIFO выбрать Avalon-ST Dual Clock FIFO Core ?
-
Допустим блок есть и читает он данные из АЦП, только что вы подразумеваете под внутренней памятью? АЦП оцифровывает целый кадр изображения размером 800x600 точек и каждый пиксель кодируется 8-ю битами. Внутренней памяти на кадровый буфер не хватит. Поэтому автономный блок должен быстренько считать данные о первом пикселе (один байт), быстренько отправить этот байт в кадровый буфер номер 1 в SDRAM, и заново читать АЦП - уже второй пиксель, и так до конца первого кадра. Затем второй кадр читается уже во второй буфер в SDRAM, а первый кадр выводится на монитор. Для реализации такого наверно более подходит вариант со специальным ДМА контроллером. А есть про неё что-нибудь на русском языке? Имеете в виду это: АЦП->автономный блок->Avalon шина->DMA->SDRAM
-
Для начала как подружить автономным блок с mm_bridge? Вот считал я данные с АЦП, они лежат в каком-то регистре, как их отправить на этот mm_bridge?
-
Ага. Есть АЦП, с которого данные считываются автономным блоком, далее автономный блок передает данные через mm_bridge в SDRAM, потом Nios читает данные из SDRAM. Так?
-
А теперь все сразу и заново. Есть АЦП, с которого данные считываются автономным блоком, далее автономный блок передает данные в Nios через Avalon Master. Nios через какой-то mm_bridge записывает данные в SDRAM, а потом опять Nios читает данные из SDRAM. Так?
-
Тогда выходит нужно будет ещё и контроллер SDRAM написать в железе
-
Т.е. запись в SDRAM и прерывание нужно производить без участия NIOS?
-
Неподскажите пример подобной реализации?
-
А как данные с автономного блока попадут в Nios и далее в SDRAM? Через чтение PIO?
-
ADC->NiosII+SDRAM->VGA
LAS9891 опубликовал тема в Системы на ПЛИС - System on a Programmable Chip (SoPC)
Имеется проект на NiosII c SDRAM. В SDRAM организован кадровый буфер. Поставлена задача считать данные с АЦП, записать данные в SDRAM и затем отобразить их на мониторе. Возник вопрос каким образом тактировать АЦП и считывать данные с него? Просто через PIO? Какой способ эффективнее для решения такой задачи? -
А если учесть что значение n (n<=n+1'b1) и значение temp (temp[n] <= 1'b1;) должны измениться одновременно? Какая переменная изменится раньше? Если n раньше, то temp[0] останется нулём, а если temp раньше, то temp[0] будет равно 1. Как это предугадать? Во втором случае, я полагаю temp[0] будет равно 1'b1. Я прав?
-
Исправил. Но это и не важно. Меня интересует, что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ?
-
Тупой вопрос про Verilog
LAS9891 опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Возник такой тупой вопрос. Есть такой код: reg [7:0] temp = 8'h00; reg [3:0] n = 4'b0000; always@(posedge CLOCK) begin if(n<=3'b111) begin temp[n] <= 1'b1; n<=n+1'b1; end end Что будет содержаться в temp[0] при выполнении такой программы? Что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ? И что будет если код переписать так: reg [7:0] temp = 8'h00; reg [3:0] n = 4'b0000; always@(posedge CLOCK) begin if(n<=3'b111) begin temp[n] = 1'b1; n<=n+1'b1; end end -
Констрейн
LAS9891 ответил LAS9891 тема в Языки проектирования на ПЛИС (FPGA)
Сигнал CMOS_DOUT1 в дальнейшем не будет использоваться. Я буду использовать вместо него сигнал DOUT1 синхронный с CLOCK. Допустим период CMOS_DOUT1 равен 1 мкс. Про взаимоотношения: CMOS_DOUT1 - внешний сигнал (импульсы), CLOCK - сигнал генерируемый PLL внутри ПЛИС, сигнал CMOS_DOUT1 асинхронен (скорее всего) CLOCK. Как это все описать? Предлагаете отслеживать состояние DOUT (синхронного CLOCKу) по фронту/срезу CLOCK? -
Констрейн
LAS9891 ответил LAS9891 тема в Языки проектирования на ПЛИС (FPGA)
ОК. Как тогда писать? Так?: create_generated_clock -source [get_registers {*|DOUT1}] -name DOUT1 [get_registers {*|DOUT1}] Снова куча варнингов. -
Констрейн
LAS9891 ответил LAS9891 тема в Языки проектирования на ПЛИС (FPGA)
А правильно ли я указал в строчке -source [get_ports CLOCK], что источником сигнала является тактовый сигнал CLOCK? В действительности я считываю состояние внешнего сигнала CMOS_DOUT1, а по фронту CLOCK записываю это значение в DOUT1. Замена не помогла: Warning (332049): Ignored create_generated_clock at ___.sdc(19): Argument -source is an empty collection Info (332050): create_generated_clock -source [get_ports CLOCK] -name DOUT1 [get_registers {*|DOUT1}] Warning (332060): Node: READ_CMOS:READ_DATA|DOUT1 was determined to be a clock but was found without an associated clock assignment. -
Констрейн
LAS9891 опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Имеется такой код: reg DOUT1_flipflop = 1'b0; reg DOUT1 = 1'b0; always@(posedge RESET or posedge CLOCK) begin if(RESET) begin DOUT1_flipflop <= 1'b0; DOUT1 <= 1'b0; end else begin DOUT1_flipflop <= CMOS_DOUT1; DOUT1 <= DOUT1_flipflop; end end Где CLOCK - внешний тактовый сигнал, CMOS_DOUT1 - внешний сигнал. Далее я использую значение регистра DOUT1 как тактовый сигнал: always@(posedge RESET or posedge DOUT1) begin if(RESET) ; else ; end При компиляции Quartus сообщает варнинг: Warning (332060): Node: ... DOUT1 was determined to be a clock but was found without an associated clock assignment. Якобы я использую DOUT1 как тактовый сигнал, а в констрейнах его не прописал. Я пишу такую строчку в файл .SDC: create_generated_clock -source [get_ports CLOCK] -name DOUT1 [get_registers DOUT1] в ответ получаю еще варнинги: Warning (332174): Ignored filter at CMOS1300.sdc(19): DOUT1 could not be matched with a register Warning (332049): Ignored create_generated_clock at CMOS1300.sdc(19): Argument <targets> is an empty collection Info (332050): create_generated_clock -source [get_ports CLOCK] -name DOUT1 [get_registers DOUT1] Как правильно описать подобный сигнал?