реклама на сайте
подробности

 
 
> MIPSfpga и VGA, Проблемы с интеграцией VGA в MIPSfpga
Boris92
сообщение May 2 2016, 09:45
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 16-07-15
Пользователь №: 87 592



Здравствуйте. Я новичок в этой теме. При интеграции VGA интерфейса в MIPSfpga, возникла проблема.
VGA я реализовал следующим образом:

module mipsfpga_ahb_vga (
input wire pixel_clock, //тактирующий сигнал
input wire [11:0] rgb_ahb, // цвет который нужно вывести на экран

output reg hsync, // синхроимпульсы
output reg vsync, // синхроимпульсы
output reg [11:0] rgb, //цвет который выводится на экран
//output reg [11:0] char_count,
output reg visible, //флаг указывающий находится ли

output reg [11:0] line_count_out, // номер строки которая выводится
output reg [11:0] pixel_count_out, // номер пикселя в строке который выводится
);

Считываются данные с vga-модуля с помощью шины AHB, считываются pixel_count_out, line_count_out, visible. Исходя из этих данных на шину уже записывается цвет который нужно записать по нужным координатам. Программу я написал на языке С. Где просто считывал по шине где сейчас происходит отрисовка, и записывал нужный цвет. Частота для vga-блока 25MHz, частота ядра MIPS 50MHz. Плата на которой было реализовано это DE0-CV.
Во всяком случае как то так я увидел реализацию этого блока. Получилось как то не очень. При попытка нарисовать квадрат, границы по левой и правой грани дергаются.

Код программы.
if(MFP_PIXEL_COUNT>200 && MFP_PIXEL_COUNT<250){
if(MFP_LINE_COUNT>200 && MFP_LINE_COUNT<250)
MFP_VGA_RGB = 0x00F;
else
MFP_VGA_RGB = 0x0F0;
}
MFP_PIXEL_COUNT - координаты рисуемого пикселя в строке и MFP_LINE_COUNT - координаты рисуемой строки. Мне кажется это из за того что есть очень большая временная разница между координатами которые нужно записать и получением цвета который мы и запишем в блок.
Как реализовать этот блок что бы избежать этого?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
johan
сообщение May 3 2016, 19:18
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 3-09-12
Пользователь №: 73 371



Уложился ли проект по таймингам?
Делаете-ли какую-то двойную буферизацию?


--------------------
Go to the top of the page
 
+Quote Post
Boris92
сообщение May 7 2016, 05:33
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 16-07-15
Пользователь №: 87 592



Цитата(johan @ May 3 2016, 20:18) *
Делаете-ли какую-то двойную буферизацию?

Как выполнить буферизацию в таком проекте? Я вижу только один способ ядро накидывает в модуль vga нужные для отображения данные когда массив для его хранения заполняется vga модуль начинает считывание их и отображение?
Go to the top of the page
 
+Quote Post
johan
сообщение May 7 2016, 09:00
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 3-09-12
Пользователь №: 73 371



Цитата(Boris92 @ May 7 2016, 08:33) *
Как выполнить буферизацию в таком проекте? Я вижу только один способ ядро накидывает в модуль vga нужные для отображения данные когда массив для его хранения заполняется vga модуль начинает считывание их и отображение?


Перечитал Ваше первое сообщение более внимательно, и понял, что вопрос с двойной буферизацией был лишним - я его задал на автомате.

Про тайминги вы всё-таки ответьте, потому что лучше было бы, если бы они укладывались wink.gif

Цитата
Мне кажется это из за того что есть очень большая временная разница между координатами которые нужно записать и получением цвета который мы и запишем в блок.


Ммм, а почему бы не узнать какая задержка между координатами и получением цвета?
Например, просимулировать в ModelSim'e? MIPSfpga можно симулировать или там зашифрованный код?
Если нельзя, то почему бы не глянуть эту задержку в SignalTap'e?

Увидев эту задержку Вы сможете сделать вывод, может ли она приводить к такой картинке или нет.

Цитата
Как реализовать этот блок что бы избежать этого?

Как я понял, у вас плата DE0-CV, и судя по даташиту у нее четырехбитных VGA.
640 * 480 * ( 3 (RGB) * 4 (bits) ) = 3686400, что многовато, а, следовательно, если мы хотим такое изображение выводить, то нам нужно использовать внешнюю память.

На этой плате стоит внешняя 64MB SDRAM, чего должно нам хватить с лихвой.

Я бы сделал так:
1. Использую какую-то готовую корку от Альтеры (уверен, что в примерах к этой плате она идет, названия сейчас не скажу), которая позволяет писать/читать через интерфейс Avalon-MM в эту память.
2. Подключаю эту память к MIPSfpga, делаю какие-то функции/макросы которые позволяют писать/читать в эту память (т.е. просто чтение по какому-то оффсету).
3. Беру готовые альтеровские IP-ядра Frame Reader и Clocked Output из Altera VIP. Подключаю в систему.
4. Смотрю драйвер для Altera Frame Reader, портирую оттуда функции altvipfb_start_hw и altvipfb_disable_hw.
5. Настраиваю через Avalon-MM (csr) Altera Frame Reader, чтобы он начал читать например с нулевого адреса внешней памяти.
6. Через Avalon-MM с помощью функций, разработанных в п.2 пишу нужные мне цвета в нужных пикселях (адресах). Они отобразятся на экране.

В таком подходе вы используете готовые компоненты, однако по ресурсам (FPGA) это будет дорогое удовольствие sm.gif

Двойной буферизации в таком варианте нет, и если у вас будет картинка быстро динамически менятся, то эти эффекты возможно будут видны. Я примерно всё это проделывал, когда поднимал VGA на плате с Cyclone V SoC в linux'e (т.е. делал линуксовый фреймбуфер), и там этих эффектов не заметил, хотя выводил и GUI (window manager).

UPD:
Схему приложил в аттаче.
Стрелки идут от мастера к слейву.

Сообщение отредактировал johan - May 7 2016, 09:21
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 15:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016