omercury, тогда может так? Сдвинуть 5битный цвет влево до 8?
Вид для печати
omercury, тогда может так? Сдвинуть 5битный цвет влево до 8?
5 бит
I_RED => vga_r & vga_r(4 downto 2),
I_GREEN => vga_g & vga_g(4 downto 2),
I_BLUE => vga_b & vga_b(4 downto 2),
то есть сдвигаешь влево до конца и остаток добиваешь тем же цветом от старшего разряда вниз, насколько хватит.
2 бита (мой для ленина, например)
I_RED => VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I,
I_GREEN => VGA_Green & VGA_I & VGA_Green & VGA_I & VGA_Green & VGA_I & VGA_Green & VGA_I,
I_BLUE => VGA_Blue & VGA_I & VGA_Blue & VGA_I & VGA_Blue & VGA_I & VGA_Blue & VGA_I,
Правильней всего так.
omercury, Спасибо, начинает доходить.
Ну и еще вопрос , если я сейчас к твоему ленинграду прикручу сей HDMI - должно на экране появится что- мусор или?
- - - Добавлено - - -
А как здесь получается сдвиг?
Типа 5бит + 3бита , биты из левой части автоматом сдвигает на количество правой?
При конкатенации складываются сами сигналы?
Мусор. :)
Я ж совсем забыл про твой ХДМИ...
Угу, заполнение начинается справа, если в ноликах или downto ошибёшься, отрежет всё, что выше 8 бит.
Ничего не складывается, просто объединяются в одну именованную шину.
Ну да , имелось в виду количество проводников.
Блин у меня уже каша в голове.
- - - Добавлено - - -
Вот-вот, лучше б я платы прикупил...
Ну да ладно. Похоже сейчас будет адский винегрет.
Verlog я не знаю, хотя и VHDL почти так же.
Пробовать добавить твой видеогенератор с SDRAM из ленинграда в свой проект?
- - - Добавлено - - -
Ж... я снова в ступоре...
У тебя же верилог.
Я даже в топе ничего не поменяю...
Угу, кактусу хорошо в отличии от меня... :)))))
Ну да ладно, буду описывать свои потуги :
Обрезал твой проект под самые помидоры -
https://a.radikal.ru/a39/1909/25/6b9460cc6a4e.jpg
Далее буду прикручивать HDMI .
Надо добавить еще выхлоп 2х тактовых с PLL0 , естественно вопрос - какие данные у VGA генератора - 640x480?
Да и полез сравнивать SDRAM , у тебя HY57V641620FTP-7 у меня mt48lc16m16a2
- - - Добавлено - - -
Стал конфигурить PLL0 для HDMI и VGA генератора для 800x600"60Hz, надо частоты 140МГц,200МГц и 40МГц.
140МГц не дает ставить - недостижимые множитель/делитель...
- - - Добавлено - - -
как мне перевести сие в верилог ?
Пробую :Цитата:
U_HDMI: entity work.hdmi
generic map (
FREQ => 25200000,
FS => 48000,
CTS => 25200,
N => 6144)
port map (
I_CLK_VGA => clk_vga,
I_CLK_TMDS => clk_tmds, -- 472.6 MHz max
I_HSYNC => vga_hsync,
I_VSYNC => vga_vsync,
I_BLANK => vga_blank,
I_RED => vga_r,
I_GREEN => vga_g,
I_BLUE => vga_b,
I_AUDIO_PCM_L => "0000000000000000",
I_AUDIO_PCM_R => "0000000000000000",
O_TMDS => TMDS);
Гонит ошибкиЦитата:
hdmi HDMI1((FREQ ==25200000),(FS --48000),(CTS ==25200),(N ==6144),.I_CLK_VGA(clk_40MHz));
лучшие таблички по VGA
http://tinyvga.com/vga-timing
переводить если надо несколько строк, а если модуль цельнотянутый - то подключать без перевода. Удобнее и быстрее.
а так да, первые четыре строки присваиванием делаем, а следующие - с точИчкой. желательно в столбЕК.
и смотрим в какой строка вылазиет ошибка. скорее всего синтаксическая.
ругаетсяЦитата:
U_HDMI: entity work.hdmi
generic map (
FREQ => 25200000,
FS => 48000,
CTS => 25200,
N => 6144)
port map (
I_CLK_VGA => clk_vga,
I_CLK_TMDS => clk_tmds, -- 472.6 MHz max
I_HSYNC => vga_hsync,
I_VSYNC => vga_vsync,
I_BLANK => vga_blank,
I_RED => vga_r,
I_GREEN => vga_g,
I_BLUE => vga_b,
I_AUDIO_PCM_L => "0000000000000000",
I_AUDIO_PCM_R => "0000000000000000",
O_TMDS => TMDS);
Error (10170): Verilog HDL syntax error at lenin_rzrd.v(99) near text "entity"
ну да, entity - это для вэхэдээля.
вот, нашел свой вга-генератор. У мну тайминги прибиты гвоздями. Надо менять разрешение - ну и меняем цифры на нужные
Код://VGA
parameter
hsync_end = 10'd95,
hdat_begin = 10'd143,
hdat_end = 10'd783,
hpixel_end = 10'd799,
vsync_end = 10'd1,
vdat_begin = 10'd34,
vdat_end = 10'd514,
vline_end = 10'd524;
каждый раз ругается на последнюю строчку как добавляю новые:Цитата:
hdmi HDMI1(
(FREQ ==25200000),
(FS ==48000),
(CTS ==25200),
(N ==6144),
.I_CLK_VGA (clk_40MHz),
.I_CLK_TMDS (clk_200MHz),
.I_HSYNC (1'b0),
.I_VSYNC (1'b0),
.I_BLANK (1'b0),
.I_RED (1'b0),
.I_GREEN (1'b0),
.I_BLUE (1'b0));
Error (10267): Verilog HDL Module Instantiation error at lenin_rzrd.v(111): cannot connect instance ports both by order and by name
- - - Добавлено - - -
zebest, ошибка в первой же строке
Error (10170): Verilog HDL syntax error at lenin_rzrd.v(100) near text "="Цитата:
hdmi HDMI1(
FREQ = 10'd25200000,
FS = 10'd48000,
CTS = 10'd25200,
N = 10'd6144,
ты заголовок модуля делаешь неверно. В VHDL и в Verilog-e совершенно разный синтаксис. с моей т.з.
Первые 4 строка наверное можно через параметр
//VGA
parameter
FREQ = 25200000,
FS = 48000,
CTS = 25200,
N = 6144;
а дальше
hdmi HDMI1(
.I_CLK_VGA (clk_40MHz),
.I_CLK_TMDS (clk_200MHz),
.I_HSYNC (1'b0),
.I_VSYNC (1'b0),
.I_BLANK (1'b0),
.I_RED (1'b0),
.I_GREEN (1'b0),
.I_BLUE (1'b0));
ну попробуй так. или проект куда нибудь)
да, только в скобочках не нули, а реальные сигналы пропиши :)
Да нули уже от безисходности стал шлепать.
А parametr пишется в самой сущности а не в экземпляре я так понял.
В экземпляре заполнение параметров
#(bla,bla, bla). Я так понял.
Завтра продолжу...
Один хрен PLL не дает делать 140MHz,200MHz,40MHz..
Да, как то так. По разному можно.
Обычно делают какую то одну частоту. Ну 200 например. а потом уже делителями.
Это елси PLL дает стока сделать. от плиски зависит и поколения оной
Если проект для U16 - то дает сделать 200, 142,85 и 40
Зависит, насколько тебе критично именно 140.
Да, это если для одной PLL
Сделай во второй 140, как вариант, ну или делителями из 200
Я еще только тыркаюсь, пытаюсь чужие наработки под себя переделать.
За пинки спасибо!
Можно и поднять заного пЫк32, только боюсь времени всободного не будет скоро...
Именно. Вот так делал Pll с параметрами EP1_PLL #(14, 1) PLL(.inclk0(osc_clk), .c0(Gclk));
Дык надо просто подправить под твои частоты.
И на память и на синхрогенератор подавать 125МГц
Вложение 70012
- - - Добавлено - - -
А куда тебе 40?
На какой именно ПЛИС все эти опыты происходят?
Дык на HDMI подается вга клок и тдмс клок.
40 MHz это тактовая вга исходя из таймингов 800x600@60Hz где пикселклок должен быть 40MHz а на тдмс надо подавать в 5 раз выше, тобишь 200
- - - Добавлено - - -
Bolt, сразу говорю , что это создание некого полигона/дебагера для изучения FPGA в целом а в частности реализаций переферии подключенной к реверсU16.
Да, действительно PLL не может выдать 200 и 140, тогда VCO получается 1400 МГц, по даташиту максимум 1300.
140 "лишняя". 125, 200, 40 - может. А лучше выходы PLL не занимать, а взять с него, допустим, 200, 300, 240, и поделить на сколько надо.
Ну, ок. Я вон тоже себе полигон строю :)
Ага, а вот эти деления внесут задержки и метастабильность , так?
Вот тут не понял. Что, если взять с PLL две разных частоты и завести на два триггера, то автоматически избавимся от метастабильности?
Картинку с "плывущей" фазой двух синхросигналов относительно друг друга рисовать или сами представите?
Выходы PLL синхронизируются от VCO, поэтому и идут без задержек относительно друг друга, в отличие от триггеров, которые имеют свои задержки.
Вот тур по-русски структура выходов есть на картинке для лучшего понимания.
http://www.naliwator.narod.ru/CIII_01_05_2.pdf
Для лучшего понимания чего?
Взлетело так :
Параметры с именем сущности , провода в экземпляре.Цитата:
hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (clk_40MHz),
.I_CLK_TMDS (clk_200MHz),
.I_HSYNC (1'b0),
.I_VSYNC (1'b0),
.I_BLANK (1'b0),
.I_RED (1'b0),
.I_GREEN (1'b0),
.I_BLUE (1'b0));
omercury, Как пересчитать частоты под тактовую 125МГц - раз, а два в VGA генераторе нет I_BLANK...
- - - Добавлено - - -
Сейчас общее выглядит так:
https://c.radikal.ru/c34/1909/13/f1d44f08aba2.jpg
Модуль випсан так.
Но чую что-то не так с сигналами RGB , что такое 7'NC-- NOT Connected ?Цитата:
hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (clk_40MHz),
.I_CLK_TMDS (clk_200MHz),
.I_HSYNC (VGA_h_sync),
.I_VSYNC (VGA_v_sync),
.I_BLANK (1'b0),
.I_RED (VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I),
.I_GREEN (VGA_Green & VGA_I & VGA_Green & VGA_I & VGA_Green & VGA_I & VGA_Green & VGA_I),
.I_BLUE ( VGA_Blue & VGA_I & VGA_Blue & VGA_I & VGA_Blue & VGA_I & VGA_Blue & VGA_I),
.O_TMDS (TMDS));
https://d.radikal.ru/d06/1909/ff/d2367c3845b1.jpg
Это не 8 проводов, это логический элемент "8И". Остальные 7 проводов, естественно, NC.Цитата:
.I_RED (VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I),
Провода в пучок собираются фигурными скобками через запятую
I_REG ({VGA_Red, VGA_I, VGA_Red, VGA_I, VGA_Red, VGA_I, VGA_Red, VGA_I}),
Bolt, спасибо.
Вроде что-то вышло ...
https://a.radikal.ru/a08/1909/ee/6681a7e31152.jpg
- - - Добавлено - - -
omercury, повесил на I_BLANK 1 - монитор видит сигнал но все черное...
omercury, плюнул на это гиблое дело.
Надо было сразу делать на внутреней RAM , отладить и лишь потом внешнюю подключать.
Ну и вопросы...
800x600x8bit влезет ли?
Можно ли встроенную память инициализировать рандомным значением в визарде?
EP4CE22 имеет 66 блоков M9K, условно 66 килобайт.
800 x 600 x 8 bit = 480000 байт
Никак не влезет. 1 бит, и то целиком займёт.
320 x 240 x 4 bit = 37.5 килобайт. Так влезет :) Это 640x480 с удвоенными пикселями и строками.
Рандомным значением инициализировать по-моему нельзя, только нулями или из файла. Кажется.
А файл можно и рандомом заполнить.
Леш, ты предупреждай, на каком языке пишешь, а то я тебе на VHDL подсказывал...
- - - Добавлено - - -
1 бит с извращениями.
Для начала на VGA потренируйся с даблингом.
- - - Добавлено - - -
Откусываешь от любого видеофайла нужное количество байт, переименовываешь в .bin, а дальше бинтухекс.
Ну или скрипт какой...
omercury, да хрен с ним. :)
Я вообще-то говорил что пока еще пишу левой ногой.:)
Вытираю, копирую части в исходнике. Иногда думаю и что то пишу. :))))
Вообще почти полный ноль.
Счас буду пробовать создать блок памяти и сканер под него , ну или скандаблер...
Такс, понял. 800x600 бум делать даблинг, т.е. 800x600 плавно трансформируются в 400x300 или что там ближе к стандарту, но hdmi будет 800x600.
- - - Добавлено - - -
Чего надумалось.
Сделать окно в верхней части дисплея, может даже не половине а трети. А остальное добивать константой.
Потом , когда сдрам прикручу будет проще на весь экран развернуть.
Ага, 400*300=120 килобайт...
Делай с четырёхкратным (так проще) даблингом, 200*150=30000 байт, подразумеваем матрицу 256х256=64К.
Можешь у меня подсмотреть, там (когда понимаешь) вообще просто.
Или для тренировки повтори спек какой.
48 у тебя полностью в BRAM влезет.
https://cloud.mail.ru/public/kdLw/2ba9DDq4V
Ну дык , полный растр 800x600,
выкусываем треть , а лучше четверть - 200x600.
И вот это окно даблим, триблим, квадриблим.
Вообщем короче делаем аналог LCD дисплея для выхлопа дебаг инфы с 8051.
В том числе и при отладке SDRAM ..
Завтра буду осознавать твои исходники видеогенератора , переваривая с изучением верилога...
Вообщем веселуха, есть чем заняться...
И да, не хочу я спек...
Дык, у 8051 XRAM незарелизина, так что с нуля.
А экран (окно)200x150 => реальное 200 x600.
Ага, то есть Гарвардская архитектура - отдельно память программ, отдельно память данных, так?
Поскольку ты упорно хочешь 800х600, то пиксельклок 40МГц, но так как готов на 8 битный цвет, то видеопамяти надо 600 килобайт.
Поскольку BRAM у тебя столько нет, а SRAM нет на плате остаётся SDRAM.
Так как в сингл-доступе она стопроцентно не успеет, остаётся поточное обращение к памяти.
Поскольку видеосканер и память надо делать синхронными, то у нас остаётся линейка из кратных 40 мегагерцам частот - 80-120-160-200МГц.
Так как 160МГц потянет не каждая память, остаётся 120МГц.
Контроллер SDRAM будем делать двухпортовый, чтоб избежать коллизий между запросами ЦПУ и видеоадаптером.
Поскольку SDRAM 16-битная, то чтение видеоданных будет целыми словами.
Теперь немного расчётов, в странных попугаях, но они дадут нам представление - получится у нас что-либо или нет:
Так как ты упорно хочешь 800х600 @8 бит, то пиксельклок получается 40МГц, но так как чтение видеоданных будет по 16 бит, то условно получаем 20МГц.
SDRAM наиболее эффективна при поточных операциях чтения/записи, на 120МГц Cas Latency=3 и минимальное время чтения 1 слова - 8 тактов, то есть 120/8=15МГц.
На чтение 4 слов уходит всего на 3 такта больше, чем на 1 слово, то период запросов контроллера SDRAM будет 8+3=11 тактов, а на самом деле 12 тактов или 10МГц.
При пиксельклоке (условном) в 20МГц и длине бюрста 4 получаем условную частоту запросов 20/4=5МГц, но так как контроллер у нас двухпортовый, то за 1 цикл запроса видеоданных он должен успевать делать по 2 обращения к памяти, то есть 10/2=5МГц, что впритык перекрывает необходимое.
Пока что проходим.
Вроде бы...
Если не будем успевать, то попробуем либо увеличить тактовую памяти, либо удлиним поток вдвое. А лучше и то и другое, если получится.
Осталось решить, какой ширины будем делать доступ к памяти со стороны процессора.
Вероятно 8 бит.
Теперь по организации памяти, я предлагаю такую - Вложение 70020
Да у процессора 2 8ми битных порта чисто вход и 2 чисто выход.