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

LAS9891

Участник
  • Постов

    352
  • Зарегистрирован

  • Посещение

Весь контент LAS9891


  1. Здравствуйте! Прошу совета. Задача следующая. Требуется вывести видеоизображение с КМОП матрицы на стандартный монитор. Проект реализую на 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. При такой реализации возникают такие вопросы. В случае если кадр на монитор выведен, а новый еще не считался, можно будет повторить вывод старого кадра, после чего вывести новый кадр. Но вот в чем проблема, матрица выдает кадры друг за другом без остановки, и если новый кадр не считался (не успел) точно к моменту, когда старый закончил выводиться на монитор, то будет постоянно выводиться старый кадр. Как добиться этой синхронности? или необходимо считывать кадры с матрицы не постоянно, а только по требованию? типа считал первый кадр, начинаешь выводить первый и считывать второй, выводишь первый кадр несколько раз, до тех пор, пока не считается второй, когда считался второй, начинаем выводить второй и писать третий и так по кругу.
  2. Пробую разобраться с работой микросхемы SDRAM. Нашёл перевод описания на микросхему от фирмы Micron: Micron_SDRAM__________.pdf Возник вопрос с настройкой регистра управления. В описании написано: "3.2. Длина пакета Доступ к SDRAM по чтению и по записи пакетно­ориентированный, при этом длина пакета программируется, как показано на рис. 1. Длина пакета определяет максимальное число ячеек, которые могут быть доступны для поданной команды чтения или записи. Пакеты длиной 1, 2, 4 или 8 слов могут быть последовательными или чередующимися, ..." Вот в этом абзаце слова "ячейка" и "слово" одно и то же? Далее. Допустим размерность одной ячейки 16 бит и я хочу использовать длину пакета в 1 слово. Тогда при поступлении команды чтения или записи будет доступна одна ячейка. Пока все ясно. Далее написано следующее: "При подаче команды чтения или записи выбирается блок ячеек колонки, равный длине пакета. Все ячейки для этого пакета размещаются в пределах этого блока." - т.е. в моём случае выбирается одна ячейка из колонки, пакет равен одной ячейке и соответственно блок тоже равен одной ячейке. Пока все ясно. Далее: "Это означает, что если будет достигнута граница блока, то пакет вернётся к его началу." - ??? Кто куда вернётся? И самое непонятное: "Блок однозначно выбирается линиями A1­A9 (x4), A1­A8 (x8) или A1­A7 (x16), когда длина пакета равна 2; A2­A9 (x4), A2­A8 (x8) или A2 A7 (x16), когда длина пакета равна 4; и A3­A9 (x4), A3­A8 (x8) или A3­A7 (x16), когда длина пакета равна 8. " - допустим выбрал бы я длину пакета 2, что означают сиволы x4, х8, х16? Что за алгоритм такой?
  3. В MegaWizarde видел только для DDR SDRAM, или вы имеете ввиду где нибудь скачать?
  4. Решил использовать ниос, потому что там есть готовый контроллер SDRAM и на данный момент вывод изображения из буфера SDRAM уже работает.
  5. А в роли FIFO выбрать Avalon-ST Dual Clock FIFO Core ?
  6. Допустим блок есть и читает он данные из АЦП, только что вы подразумеваете под внутренней памятью? АЦП оцифровывает целый кадр изображения размером 800x600 точек и каждый пиксель кодируется 8-ю битами. Внутренней памяти на кадровый буфер не хватит. Поэтому автономный блок должен быстренько считать данные о первом пикселе (один байт), быстренько отправить этот байт в кадровый буфер номер 1 в SDRAM, и заново читать АЦП - уже второй пиксель, и так до конца первого кадра. Затем второй кадр читается уже во второй буфер в SDRAM, а первый кадр выводится на монитор. Для реализации такого наверно более подходит вариант со специальным ДМА контроллером. А есть про неё что-нибудь на русском языке? Имеете в виду это: АЦП->автономный блок->Avalon шина->DMA->SDRAM
  7. Для начала как подружить автономным блок с mm_bridge? Вот считал я данные с АЦП, они лежат в каком-то регистре, как их отправить на этот mm_bridge?
  8. Ага. Есть АЦП, с которого данные считываются автономным блоком, далее автономный блок передает данные через mm_bridge в SDRAM, потом Nios читает данные из SDRAM. Так?
  9. А теперь все сразу и заново. Есть АЦП, с которого данные считываются автономным блоком, далее автономный блок передает данные в Nios через Avalon Master. Nios через какой-то mm_bridge записывает данные в SDRAM, а потом опять Nios читает данные из SDRAM. Так?
  10. Тогда выходит нужно будет ещё и контроллер SDRAM написать в железе
  11. Т.е. запись в SDRAM и прерывание нужно производить без участия NIOS?
  12. Неподскажите пример подобной реализации?
  13. А как данные с автономного блока попадут в Nios и далее в SDRAM? Через чтение PIO?
  14. Имеется проект на NiosII c SDRAM. В SDRAM организован кадровый буфер. Поставлена задача считать данные с АЦП, записать данные в SDRAM и затем отобразить их на мониторе. Возник вопрос каким образом тактировать АЦП и считывать данные с него? Просто через PIO? Какой способ эффективнее для решения такой задачи?
  15. А если учесть что значение n (n<=n+1'b1) и значение temp (temp[n] <= 1'b1;) должны измениться одновременно? Какая переменная изменится раньше? Если n раньше, то temp[0] останется нулём, а если temp раньше, то temp[0] будет равно 1. Как это предугадать? Во втором случае, я полагаю temp[0] будет равно 1'b1. Я прав?
  16. Исправил. Но это и не важно. Меня интересует, что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ?
  17. Возник такой тупой вопрос. Есть такой код: 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
  18. Сигнал CMOS_DOUT1 в дальнейшем не будет использоваться. Я буду использовать вместо него сигнал DOUT1 синхронный с CLOCK. Допустим период CMOS_DOUT1 равен 1 мкс. Про взаимоотношения: CMOS_DOUT1 - внешний сигнал (импульсы), CLOCK - сигнал генерируемый PLL внутри ПЛИС, сигнал CMOS_DOUT1 асинхронен (скорее всего) CLOCK. Как это все описать? Предлагаете отслеживать состояние DOUT (синхронного CLOCKу) по фронту/срезу CLOCK?
  19. ОК. Как тогда писать? Так?: create_generated_clock -source [get_registers {*|DOUT1}] -name DOUT1 [get_registers {*|DOUT1}] Снова куча варнингов.
  20. А правильно ли я указал в строчке -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.
  21. Имеется такой код: 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] Как правильно описать подобный сигнал?
×
×
  • Создать...