PDA

Просмотр полной версии : ПЛИС и всё что с ними связано



Страницы : 1 2 3 4 5 6 [7] 8

dosikus
14.09.2019, 17:37
Пока неудача. Проект скомпилися, на выходе бред.
Повесил выход uart на ubus DN 68 pin . Надеюсь ограничений на него нет.
Хотя времени в обрез, мог и напортачить.
Да , и напрягает что reset не могу вменяемо соорудить, временно прикошачил к USB_N_RESET.

- - - Добавлено - - -

AlexG, смотрел. Сдуру подумалось что это только с nios ...

dosikus
15.09.2019, 11:08
Заработало. Действительно нужно было RESET завести.
Снова нужна помощь.
В оригинале у автора есть синхронизация сброса от тактовой :


reset_async <= switches(9);

process(clk_50MHz)
begin
if clk_50MHz'event and clk_50MHz='1' then
reset_ffc <= reset_ffc(1 downto 0) & reset_async;
end if;
end process;
reset <= reset_ffc(2);

Где reset сброс 51ого а switches кнопки на DE1.

Как сие переделать чтобы сброс был не только от кнопки но и при старте системы?

dosikus
15.09.2019, 17:14
Мда, чудны дела твои господи...

Бинарник для 8051 что шел у аФФтора - где-то 1600 , бинарник сгенеренный новым SDCC - 2200 , кайло сгенерил 1100 ...

omercury
15.09.2019, 19:07
Где reset сброс 51ого а switches кнопки на DE1.

Как сие переделать чтобы сброс был не только от кнопки но и при старте системы?

PLL используешь?
Там есть выход locked, который устанавливается, когда PLL входит в режим.
Удобно для сброса при старте системы.


В оригинале у автора есть синхронизация сброса от тактовой :
4 такта на 50МГц для подавления дребезга, конечно, лучше, чем ничего...
Поскромней частоты нет?
Сделай хоть так, что ли...
reset <= reset_ffc(2) and reset_ffc(1) and reset_ffc(0) and reset_async;

- - - Добавлено - - -

P.S.
А вообще, никто с этим особо не заморачивается, просто сбрасывают проц 50 миллионов раз в секунду - и вся недолга. :)
ЕМНИП один Left Radio ещё в схематике со своим неилскопом этим вопросом заморачивался, когда на open-е я его на верилог подсаживал... ;)

dosikus
15.09.2019, 20:35
В оригинале PLL нет, но ставить буду ибо планирую тактовую 100МГц .
Спасибо , попробую , locked.

dosikus
16.09.2019, 09:26
Угу, все поехало... Тактовая 100МГц...

https://a.radikal.ru/a03/1909/5e/b4b995fd5dd0.jpg (https://radikal.ru)


Ну и вопрос.
Я же могу сколько угодно насоздавать экземпляров сущностей, хватило бы места.
Например 3 экземпляра MCU ?

dosikus
16.09.2019, 14:23
omercury, Ткни ссылкой на простой видеогенератор (800x600@60Hz)- данные выдираем с RAM реверса ...

omercury
16.09.2019, 18:43
Ну и вопрос.
Я же могу сколько угодно насоздавать экземпляров сущностей, хватило бы места.
Например 3 экземпляра MCU ?
Разумеется!
Не пиша дополнительно ни строчки кода.


omercury, Ткни ссылкой на простой видеогенератор (800x600@60Hz)- данные выдираем с RAM реверса ...
РАМ шибко разная бывает, например у Влада зачастую используется двухпортовая BRAM (блочная память внутри ПЛИС), а я тут недавно научился использовать SDRAM и для этих целей тоже.
Уточни, чего хочешь.

И да, тактовая какая?
Могу даже свой предложить. :)

dosikus
16.09.2019, 19:35
Тактовая набортная? 50МГц
Внутри я так понимаю могу до 500-600МГц юзать.
Для начада хочу разгрузить нутро и заюзать под видео буфер наружную SDRAM.

omercury
16.09.2019, 20:18
Тактовая набортная? 50МГц
Внутри я так понимаю могу до 500-600МГц юзать.
Чисто теоретически - да.
Практически зависит от построения внутренностей.
Плюс, BRAM работает на 250-280МГц.


Для начада хочу разгрузить нутро и заюзать под видео буфер наружную SDRAM.

Вот тут положил синхрогенератор с контроллером SDRAM с доступом по 8 слов х16 бит.
https://zx-pk.ru/threads/30740-voprosy-o-z84c00-i-ez80.html?p=1026214&viewfull=1#post1026214
Пока не "оценили" - контроллер SDRAM де много места занимает.
Вот то же самое с восьмибитным доступом, но пока не проверенное.
УДАЛЕНО
Качнёшь, скажи, чтоб удалил - пока не проверено на работоспособность.
Чисто спектрумовский вариант - тактовая кратна 14 МГц.
Сейчас клок памяти и синхрогенератора поставлен 140МГц, SDRAM настроена на CL-3.
В синхрогенераторе коэффициент деления тактовой задаётся строкой 47 (wire dotclock = (state == 4'b1011); ) и сейчас стоит 140/12=11,666МГц
Под неё и посчитаны все константы по горизонтали (надо будет, кстати, как нибудь параметризировать этот процесс для удобства).
Для тебя всё прозрачно - подключаешь к проекту VGA_and_SDRAM.v, в нём VGAxx - видеовыход (работает автоматом без твоего участия), сигналы "SD_RAM Interface" непосредственно к пинам памяти, "Интерфейс памяти" - соответственно то, к чему будет обращаться проц.
Единственное - надо настроить диапазон видеобуфера.

И загляни в файл .qsf
Там расписаны все пины, чтоб каждый наз в пинпланере не распределять - просто в новый .qsf копируешь и всё появляется.

dosikus
16.09.2019, 20:44
Спасибо, завтра солью и отпишусь.
Дома в будни сижу на смарте.

Bolt
16.09.2019, 21:51
Внутри я так понимаю могу до 500-600МГц юзать.
Надо смотреть даташит на конкретную ПЛИС, максимальная тактовая ограничена и сама по себе, и из-за логики между триггерами, сигнал на входе триггера появиться не успеет. У второго Циклона 400 МГц, по-моему, но 32-битный сумматор даёт задержку около 10 нс, то есть больше 100 МГц никак, а реально ещё меньше.

- - - Добавлено - - -


Чисто спектрумовский вариант - тактовая кратна 14 МГц.
Сейчас клок памяти и синхрогенератора поставлен 140МГц, SDRAM настроена на CL-3.
В синхрогенераторе коэффициент деления тактовой задаётся строкой 47 (wire dotclock = (state == 4'b1011); ) и сейчас стоит 140/12=11,666МГц
14 МГц * 9 = 126 МГц
126 МГц / 10 = 12.6 МГц, половина частоты 640x480x60, отклонение 0.1%

14 МГц * 10 = 140 МГц
140 МГц / 7 = 20 МГц, ровно половина частоты 800x600x60

А ещё можно сделать дробный делитель, соотношение вход-выход может быть вообще любым, только период на выходе будет немного прыгать.

omercury
16.09.2019, 22:52
14 МГц * 9 = 126 МГц
126 МГц / 10 = 12.6 МГц, половина частоты 640x480x60, отклонение 0.1%

14 МГц * 10 = 140 МГц
140 МГц / 7 = 20 МГц, ровно половина частоты 800x600x60
Сейчас строчная = 140 000 000/12/373=31,2779 кГц, отклонение 0,09% при 746 тиках на строку (вместо 800)
При этом активная часть экрана по горизонтали разделена на 21+256+21 (бордюр/окно/бордюр)
Делал и на 28МГц VGA, но там окошко даже меньше стандартного, один сплошной бордюр.(((

И не забывай, что dosikus собирается видеобуфер в SDRAM убрать, а ещё неизвестно, с каким периодом его процессор будет в память ломиться.
Ибо в ReVerSe16 нет SRAM, только SDRAM и до 66 килобайт BRAM, часть из которых будет занята под ПЗУ, по крайней мере поначалу.

Bolt
16.09.2019, 23:36
Процессор подождёт :)

14 * 9 / 10 = 12.6 МГц, по горизонтали 64+512+64, по вертикали 48+384+48, двойные точки.
13.333 МГц (вместо 14), по горизонтали 15+768+15 (двух пикселей не хватает), по вертикали 12+576+12, тройные точки.
Оба варианта по таймингам чистый VGA, без извращений.

dosikus
17.09.2019, 09:08
omercury, Слил оба.

- - - Добавлено - - -



Для тебя всё прозрачно - подключаешь к проекту VGA_and_SDRAM.v, в нём VGAxx - видеовыход (работает автоматом без твоего участия),

Я уже в ступоре. Затык с RGB выходом видеогенератора , у ленина они однобитные во втором проекте 5бит в проекте что терзаю 8бит...

omercury
17.09.2019, 11:46
omercury, Слил оба.

- - - Добавлено - - -



Я уже в ступоре. Затык с RGB выходом видеогенератора , у ленина они однобитные во втором проекте 5бит в проекте что терзаю 8бит...

Ну дык в спеке 3 бита по цветам и общий бит яркости.
Во втором 5+5+5 цифра условная - слово 16 бит, можно и 5+6+5 сделать. Причём тот контроллер читает и пишет потоком по 8 слов.
Ты скажи, что надо, какая организация буфера экрана планируется, какова глубина цвета видеовыхода?

dosikus
17.09.2019, 11:59
Ты мне подскажи тогда как в HDMI сериализаторе переделать под 5 бит или меньше.

https://dropmefiles.com/KbUYR

Думается что и 16 битный цвет будет много, у меня всего 2 порта 8ми битных чисто на вход, 2 чисто на выход.

omercury
17.09.2019, 13:00
Процессор подождёт :)

Если это классический i51 с 12 тактами на машцикл, то ещё куда ни шло, там латч адреса идёт на 1/6 клока ЦПУ.
Допустим dosikus запустил его на 50МГц, то к памяти он будет обращаться с частотой 8,33МГц.
SDRAM вероятнее всего потянет.

А если однотактовый?
Да на 100МГц, как (предположительно) хочет dosikus ?
Подождёт?



14 * 9 / 10 = 12.6 МГц, по горизонтали 64+512+64, по вертикали 48+384+48, двойные точки.
13.333 МГц (вместо 14), по горизонтали 15+768+15 (двух пикселей не хватает), по вертикали 12+576+12, тройные точки.
Оба варианта по таймингам чистый VGA, без извращений.
Тут нужен развёрнутый ответ, не сейчас.

dosikus
17.09.2019, 13:06
Сейчас смотрю релиз РК86 .
Что делает сия строка? Обрезает шину до 7бит или до одного старшего?

.I_R ({VGA_R,7'b0000000}),


// HDMI
hdmi tmds(
.I_CLK (clk250mhz),
.I_CLK_PIXEL (clk50mhz),
.I_R ({VGA_R,7'b0000000}),
.I_G ({VGA_G,7'b0000000}),
.I_B ({VGA_B,7'b0000000}),
.I_HSYNC (VGA_HS),
.I_VSYNC (VGA_VS),
.I_BLANK (vga_blank),
.O_TMDS_D0 (HDMI_D0),
.O_TMDS_D1 (HDMI_D1),
.O_TMDS_D2 (HDMI_D2),
.O_TMDS_CLK (HDMI_CLK));

assign HDMI_D1N = 1'b0;

omercury
17.09.2019, 13:14
Что делает сия строка? Обрезает шину до 7бит?
Ага, верилог.
Фигурные скобки - это конкатенция (объединение), то есть на старший бит подключается цвет, остальные 7 в ноль.
То же самое на VHDL: I_R => VGA_R & '0000000',

dosikus
17.09.2019, 13:22
omercury, тогда может так? Сдвинуть 5битный цвет влево до 8?

omercury
17.09.2019, 13:22
Ты мне подскажи тогда как в HDMI сериализаторе переделать под 5 бит или меньше.
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,

Правильней всего так.

dosikus
17.09.2019, 13:48
omercury, Спасибо, начинает доходить.

Ну и еще вопрос , если я сейчас к твоему ленинграду прикручу сей HDMI - должно на экране появится что- мусор или?

- - - Добавлено - - -


I_RED => vga_r & vga_r(4 downto 2)

А как здесь получается сдвиг?
Типа 5бит + 3бита , биты из левой части автоматом сдвигает на количество правой?
При конкатенации складываются сами сигналы?

omercury
17.09.2019, 14:04
Ну и еще вопрос , если я сейчас к твоему ленинграду прикручу сей HDMI - должно на экране появится что- мусор или?
Мусор. :)
Я ж совсем забыл про твой ХДМИ...



А как здесь получается сдвиг?
Типа 5бит + 3бита , биты из левой части автоматом сдвигает на количество правой?
Угу, заполнение начинается справа, если в ноликах или downto ошибёшься, отрежет всё, что выше 8 бит.


При конкатенации складываются сами сигналы?
Ничего не складывается, просто объединяются в одну именованную шину.

dosikus
17.09.2019, 14:27
Ну да , имелось в виду количество проводников.
Блин у меня уже каша в голове.

- - - Добавлено - - -


Я ж совсем забыл про твой ХДМИ...

Вот-вот, лучше б я платы прикупил...
Ну да ладно. Похоже сейчас будет адский винегрет.
Verlog я не знаю, хотя и VHDL почти так же.
Пробовать добавить твой видеогенератор с SDRAM из ленинграда в свой проект?

- - - Добавлено - - -

Ж... я снова в ступоре...
У тебя же верилог.
Я даже в топе ничего не поменяю...

omercury
17.09.2019, 14:41
Ж... я снова в ступоре...
У тебя же верилог.
Я даже в топе ничего не поменяю...
Никаких проблем - это тебе не Кейл.
Квартус поддерживает смешанные проекты, хоть все возможные форматы в одном проекте.

dosikus
17.09.2019, 16:02
Угу, кактусу хорошо в отличии от меня... :)))))

Ну да ладно, буду описывать свои потуги :

Обрезал твой проект под самые помидоры -

https://a.radikal.ru/a39/1909/25/6b9460cc6a4e.jpg (https://radikal.ru)

Далее буду прикручивать 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));

Гонит ошибки

zebest
17.09.2019, 16:11
какие данные у VGA генератора - 640x480?
лучшие таблички по VGA
http://tinyvga.com/vga-timing


как мне перевести сие в верилог

переводить если надо несколько строк, а если модуль цельнотянутый - то подключать без перевода. Удобнее и быстрее.

а так да, первые четыре строки присваиванием делаем, а следующие - с точИчкой. желательно в столбЕК.
и смотрим в какой строка вылазиет ошибка. скорее всего синтаксическая.

dosikus
17.09.2019, 16:30
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"

zebest
17.09.2019, 16:41
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;

dosikus
17.09.2019, 16:49
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, ошибка в первой же строке


hdmi HDMI1(
FREQ = 10'd25200000,
FS = 10'd48000,
CTS = 10'd25200,
N = 10'd6144,

Error (10170): Verilog HDL syntax error at lenin_rzrd.v(100) near text "="

zebest
17.09.2019, 16:59
ты заголовок модуля делаешь неверно. В 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));

ну попробуй так. или проект куда нибудь)
да, только в скобочках не нули, а реальные сигналы пропиши :)

dosikus
17.09.2019, 17:31
Да нули уже от безисходности стал шлепать.
А parametr пишется в самой сущности а не в экземпляре я так понял.
В экземпляре заполнение параметров
#(bla,bla, bla). Я так понял.
Завтра продолжу...
Один хрен PLL не дает делать 140MHz,200MHz,40MHz..

zebest
17.09.2019, 17:51
В экземпляре заполнение параметров
#(bla,bla, bla). Я так понял.
Да, как то так. По разному можно.

Один хрен PLL не дает делать 140MHz,200MHz,40MHz..
Обычно делают какую то одну частоту. Ну 200 например. а потом уже делителями.
Это елси PLL дает стока сделать. от плиски зависит и поколения оной
Если проект для U16 - то дает сделать 200, 142,85 и 40
Зависит, насколько тебе критично именно 140.
Да, это если для одной PLL
Сделай во второй 140, как вариант, ну или делителями из 200

dosikus
17.09.2019, 18:07
Я еще только тыркаюсь, пытаюсь чужие наработки под себя переделать.
За пинки спасибо!

zebest
17.09.2019, 18:30
Я еще только тыркаюсь, пытаюсь чужие наработки под себя переделать.
я так всю жизнь тыкаюсь ). Кстали кроме Марсохода на хабре неплохие проекты попадаются, под переделку :-))
А тебе спасибо за помощь с PIC32 и максимайтом и ардуинкой. РК-86 конечно не доделали, но кроме ты да я его никто так и не запустил) Даже в зеленом цвете.

dosikus
17.09.2019, 18:41
Можно и поднять заного пЫк32, только боюсь времени всободного не будет скоро...

omercury
17.09.2019, 19:28
#(bla,bla, bla). Я так понял.
Именно. Вот так делал Pll с параметрами EP1_PLL #(14, 1) PLL(.inclk0(osc_clk), .c0(Gclk));



Один хрен PLL не дает делать 140MHz,200MHz,40MHz..
Дык надо просто подправить под твои частоты.

И на память и на синхрогенератор подавать 125МГц
70012

- - - Добавлено - - -

А куда тебе 40?

Bolt
17.09.2019, 19:43
На какой именно ПЛИС все эти опыты происходят?

omercury
17.09.2019, 20:10
EP4CE22E22C8

- - - Добавлено - - -


Да нули уже от безисходности стал шлепать.
На входы можно нули шлёпать, а выходы лучше оставлять неподключенными - т.е с пустыми скобками ();

dosikus
17.09.2019, 20:19
Дык на HDMI подается вга клок и тдмс клок.
40 MHz это тактовая вга исходя из таймингов 800x600@60Hz где пикселклок должен быть 40MHz а на тдмс надо подавать в 5 раз выше, тобишь 200

- - - Добавлено - - -

Bolt, сразу говорю , что это создание некого полигона/дебагера для изучения FPGA в целом а в частности реализаций переферии подключенной к реверсU16.

Bolt
17.09.2019, 20:36
Да, действительно PLL не может выдать 200 и 140, тогда VCO получается 1400 МГц, по даташиту максимум 1300.
140 "лишняя". 125, 200, 40 - может. А лучше выходы PLL не занимать, а взять с него, допустим, 200, 300, 240, и поделить на сколько надо.

Bolt, сразу говорю , что это создание некого полигона/дебагера для изучения FPGA в целом а в частности реализаций переферии подключенной к реверсU16.
Ну, ок. Я вон тоже себе полигон строю :)

dosikus
17.09.2019, 20:50
Ага, а вот эти деления внесут задержки и метастабильность , так?

omercury
17.09.2019, 21:03
Ага, а вот эти деления внесут задержки и метастабильность , так?
Именно, поэтому с PLL надо брать по максимуму, для того оно и сделано.
Тем более всё равно они уже есть.

Bolt
17.09.2019, 21:13
Вот тут не понял. Что, если взять с PLL две разных частоты и завести на два триггера, то автоматически избавимся от метастабильности?
Картинку с "плывущей" фазой двух синхросигналов относительно друг друга рисовать или сами представите?

omercury
17.09.2019, 21:27
Выходы PLL синхронизируются от VCO, поэтому и идут без задержек относительно друг друга, в отличие от триггеров, которые имеют свои задержки.
Вот тур по-русски структура выходов есть на картинке для лучшего понимания.
http://www.naliwator.narod.ru/CIII_01_05_2.pdf

Bolt
17.09.2019, 22:17
Для лучшего понимания чего?

dosikus
18.09.2019, 09:06
Взлетело так :


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 (https://radikal.ru)

Модуль випсан так.


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));

Но чую что-то не так с сигналами RGB , что такое 7'NC-- NOT Connected ?


https://d.radikal.ru/d06/1909/ff/d2367c3845b1.jpg (https://radikal.ru)

Bolt
18.09.2019, 12:06
.I_RED (VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I & VGA_Red & VGA_I),
Это не 8 проводов, это логический элемент "8И". Остальные 7 проводов, естественно, NC.
Провода в пучок собираются фигурными скобками через запятую
I_REG ({VGA_Red, VGA_I, VGA_Red, VGA_I, VGA_Red, VGA_I, VGA_Red, VGA_I}),

dosikus
18.09.2019, 14:00
Bolt, спасибо.
Вроде что-то вышло ...

https://a.radikal.ru/a08/1909/ee/6681a7e31152.jpg (https://radikal.ru)

- - - Добавлено - - -

omercury, повесил на I_BLANK 1 - монитор видит сигнал но все черное...

dosikus
18.09.2019, 17:25
omercury, плюнул на это гиблое дело.
Надо было сразу делать на внутреней RAM , отладить и лишь потом внешнюю подключать.
Ну и вопросы...
800x600x8bit влезет ли?
Можно ли встроенную память инициализировать рандомным значением в визарде?

Bolt
18.09.2019, 18:40
EP4CE22 имеет 66 блоков M9K, условно 66 килобайт.
800 x 600 x 8 bit = 480000 байт
Никак не влезет. 1 бит, и то целиком займёт.

320 x 240 x 4 bit = 37.5 килобайт. Так влезет :) Это 640x480 с удвоенными пикселями и строками.

Рандомным значением инициализировать по-моему нельзя, только нулями или из файла. Кажется.
А файл можно и рандомом заполнить.

omercury
18.09.2019, 19:37
Модуль випсан так.
]
Леш, ты предупреждай, на каком языке пишешь, а то я тебе на VHDL подсказывал...

- - - Добавлено - - -



800x600x8bit влезет ли?1 бит с извращениями.
Для начала на VGA потренируйся с даблингом.

- - - Добавлено - - -


Можно ли встроенную память инициализировать рандомным значением в визарде?
Откусываешь от любого видеофайла нужное количество байт, переименовываешь в .bin, а дальше бинтухекс.
Ну или скрипт какой...

dosikus
18.09.2019, 20:07
omercury, да хрен с ним. :)
Я вообще-то говорил что пока еще пишу левой ногой.:)
Вытираю, копирую части в исходнике. Иногда думаю и что то пишу. :))))
Вообще почти полный ноль.

Счас буду пробовать создать блок памяти и сканер под него , ну или скандаблер...

Такс, понял. 800x600 бум делать даблинг, т.е. 800x600 плавно трансформируются в 400x300 или что там ближе к стандарту, но hdmi будет 800x600.

- - - Добавлено - - -

Чего надумалось.
Сделать окно в верхней части дисплея, может даже не половине а трети. А остальное добивать константой.
Потом , когда сдрам прикручу будет проще на весь экран развернуть.

omercury
18.09.2019, 20:24
Ага, 400*300=120 килобайт...
Делай с четырёхкратным (так проще) даблингом, 200*150=30000 байт, подразумеваем матрицу 256х256=64К.
Можешь у меня подсмотреть, там (когда понимаешь) вообще просто.

Или для тренировки повтори спек какой.
48 у тебя полностью в BRAM влезет.


https://cloud.mail.ru/public/kdLw/2ba9DDq4V

dosikus
18.09.2019, 20:29
Ну дык , полный растр 800x600,
выкусываем треть , а лучше четверть - 200x600.
И вот это окно даблим, триблим, квадриблим.
Вообщем короче делаем аналог LCD дисплея для выхлопа дебаг инфы с 8051.
В том числе и при отладке SDRAM ..

Завтра буду осознавать твои исходники видеогенератора , переваривая с изучением верилога...
Вообщем веселуха, есть чем заняться...
И да, не хочу я спек...

omercury
18.09.2019, 20:36
И да, не хочу я спек...
тогда определяйся с адресом видеобуфера и параметрами экрана.

dosikus
18.09.2019, 20:51
Дык, у 8051 XRAM незарелизина, так что с нуля.
А экран (окно)200x150 => реальное 200 x600.

omercury
18.09.2019, 23:05
Дык, у 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

dosikus
18.09.2019, 23:39
Да у процессора 2 8ми битных порта чисто вход и 2 чисто выход.

omercury
19.09.2019, 00:14
Вот тут не понял. Что, если взять с PLL две разных частоты и завести на два триггера, то автоматически избавимся от метастабильности?
Картинку с "плывущей" фазой двух синхросигналов относительно друг друга рисовать или сами представите?

Если на каждый из триггеров подать по разному клоку, то на их выходах получатся сигналы с частотой этих клоков, но задержанные на неопределённое время, зависящее от фазы луны, солнечного ветра и погоды на Марсе/Сникерсе/Баунти. И они не будут клоками.
Если на тактовые входы этих триггеров подать клок максимально имеющейся в системе частоты, а на входы данных триггеров подать 2 клока с PLL, то на выходах этих триггеров будут сигналы, сихронизированные с той максимальной частотой системы и они таки будут избавлены от метастабильности относительно этой самой частоты, но клоками они от этого не станут.
Если на тактовые входы всех триггеров, образующих систему тактирования, подать одну, максимально возможную частоту в системе тактирования, разместить их максимально близко друг к другу на отдельном кристалле (или максимально изолированной части общего кристалла) да запитать их от отдельного источника, то выходы этих триггеров, а вовсе не образующий их клок, подключенные к специально разведённым по площади всего кристалла линиям с минимальной задержкой, можно считать клоками, избавляющими от метастабильности те самые сигналы, описанные в предыдущем абзаце.



Для лучшего понимания чего?
Вот именно этого самого.
Те 2 триггера, если и будут подключены к клоковым линиям, то через несколько ключей, каждый из которых вносит свою, малопрогнозируемую задержку, помноженную на столь же малопрогнозируемую задержку соседнего ключа, включенного с предыдущим последовательно.

- - - Добавлено - - -


Да у процессора 2 8ми битных порта чисто вход и 2 чисто выход.
Но память-то у него куда-то подключена?
Хоть 256 байт-то есть?

(которую корку, кстати, юзаешь?)

dosikus
19.09.2019, 08:12
Ага, то есть Гарвардская архитектура - отдельно память программ, отдельно память данных, так?
Угу.


Теперь по организации памяти, я предлагаю такую - 70020
Я за. А что такое b7 и b15?

- - - Добавлено - - -




Но память-то у него куда-то подключена?
Хоть 256 байт-то есть?

(которую корку, кстати, юзаешь?)

ВотЪ - https://github.com/jaruiz/light52
Я так понимаю это продолжение сего https://opencores.org/projects/light52
На гите в доках вполне приличное описание .

256 bytes of IRAM -- fixed size

И сразу вопрос -
Автор использует свой конвертер hex => шаблон на VHDL , в верилоге я так понимаю можно hex сразу грузить?

dosikus
19.09.2019, 14:33
Нашел здесь генератор синхроимпульсов VGA640x480 http://baltazarstudios.com/poem-fpga/
Прикрутил его к своему HDMI, пока 640х480.

https://dropmefiles.com/WI44s

omercury, как в верилоге прописывать константы и условную компиляцию - хочу тайминги перевести на 800х600 и что бы их ручками не перебивать.



// Module VGA_SYNC
//
// Generates output sync signals to drive VGA display in 640x480 pixel mode:
//
// Refresh rate: 60 Hz
// Vert. refresh: 31.46 kHz
// Pixel frequency: 25.175 MHz
//
// Horizontal timing (pixels) Vertical timing (pixels)
// Visible area: 640 480
// Front porch: 16 10
// Sync pulse: 96 2
// Back porch: 48 33
// Whole line: 800 525

module vga_sync (

input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y // y-coordinate of an active pixel
);
//================================================== ====================

localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
localparam SYNC_OFF = 1'b1;

reg[9:0] line_count; // Line counter, current line
reg[9:0] pix_count; // Pixel counter, current pixel

always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
end else begin

pix_count <= pix_count + 1;// Increment a pixel counter every clock time!

// This is a state machine based on a pixel count. Since VGA modes timings are
// based on a multiple of pixel counts, we add them up and generate syncs at
// proper times
case (pix_count)
0: vga_hsync <= SYNC_OFF;
16: vga_hsync <= SYNC_ON;
112: vga_hsync <= SYNC_OFF;
800: begin
line_count <= line_count + 1;
pix_count <= 0;
end
endcase

// Properly toggle vertical sync based on the current line count
case (line_count)
0: vga_vsync <= SYNC_OFF;
10: vga_vsync <= SYNC_ON;
12: vga_vsync <= SYNC_OFF;
525: begin
line_count <= 0;
end
endcase

// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
if (line_count>=35 && line_count<515)
begin
if (pix_count>=160 && pix_count<800)
begin
disp_enable <= 1;
pix_x <= pix_count - 10'd160;
pix_y <= line_count - 10'd35;
end
end
end
end

endmodule

И здесь наверное надо добавить глобальный счетчик пикселей( АДРЕС) для вычитки из RAM?

omercury
19.09.2019, 18:56
как в верилоге прописывать константы
`define
parameter
localparam


и условную компиляцию
`ifdef / `ifndef - `elsif - `else - `endif



И здесь наверное надо добавить глобальный счетчик пикселей( АДРЕС) для вычитки из RAM?
Ага, и сделать его вычисляемым из всех параметров.
Вот здесь пример.

- - - Добавлено - - -


А что такое b7 и b15
Это я так старший бит данных обозвал.



в верилоге я так понимаю можно hex сразу грузить?
Да, можно как и свой .mif, так и интел хекс.

- - - Добавлено - - -



На гите в доках вполне приличное описание .
256 bytes of IRAM -- fixed size


Ага, но адресация 16-битная. :)


xdata_addr : out std_logic_vector(15 downto 0);

dosikus
20.09.2019, 11:01
Вот это ж...
Modelsim напрочь не хочет симулить винегрет из верилога и вхдл...

- - - Добавлено - - -

Нужна помощь.
Переделал видеогенератор что приводил выше .
Перенес синхроимпульсы с начала строки и кадра назад и изображение растянулось по горизонтали, монитор говорит что режим в порядке.


// Module VGA_SYNC
//
// Generates output sync signals to drive VGA display in 640x480 pixel mode:
//
// Refresh rate: 60 Hz
// Vert. refresh: 31.46 kHz
// Pixel frequency: 25.175 MHz
//
// Horizontal timing (pixels) Vertical timing (pixels)
// Visible area: 640 480
// Front porch: 16 10
// Sync pulse: 96 2
// Back porch: 48 33
// Whole line: 800 525

module vga_sync (

input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y // y-coordinate of an active pixel
);
//================================================== ====================

localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
localparam SYNC_OFF = 1'b1;

reg[9:0] line_count; // Line counter, current line
reg[9:0] pix_count; // Pixel counter, current pixel

always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
end else begin

pix_count <= pix_count + 1'b1;// Increment a pixel counter every clock time!

// This is a state machine based on a pixel count. Since VGA modes timings are
// based on a multiple of pixel counts, we add them up and generate syncs at
// proper times




case (pix_count)
0: vga_hsync <= SYNC_OFF;
656: vga_hsync <= SYNC_ON;
752: vga_hsync <= SYNC_OFF;
800: begin
line_count <= line_count + 1'b1;
pix_count <= 0;
end
endcase

// Properly toggle vertical sync based on the current line count

case (line_count)
0: vga_vsync <= SYNC_OFF;
490: vga_vsync <= SYNC_ON;
492: vga_vsync <= SYNC_OFF;
525: line_count <= 0;

endcase


// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
if (line_count>=0 && line_count<480)
begin
if (pix_count>=0 && pix_count<640)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
end
end
end
end

endmodule

Bolt
20.09.2019, 14:55
На первый взгляд всё правильно.
В коде нет формирования изображения, blank (disp_enable) правильно учитывается? Растянутость и странная яркость может быть из-за отсутствия гашения.
Фото растянутого экрана можно?

dosikus
20.09.2019, 15:00
Bolt, blank - disp_enable. Если оно подходит, в чем не уверен...
И все таки это какой-то глюк монитора на 640х480 .
Если я запускаю автонастройку на этом синхрогенераторе , что на переделанном что на оригинале - растягивает и все .
Помогает запуск чужой прошивки и автонастройка.

А может из-за того что я изображение по дикому делаю не учитывая ничего...

vga_r <= (px_x(6 downto 0)) and "11111111";
vga_b<= (px_x(6 downto 0)) and "11111111";


хрень какая-то ;)))))))

Вывел рамку по краям - все стало норм и автонастройка четко срабатывает.

vga_r <= "11111111" when px_x=0 or px_x=639 or px_y =0 or px_y=479 else (px_x(6 downto 0)) and "11111111";
vga_b<= "11111111" when px_x=0 or px_x=639 or px_y =0 or px_y=479 else (px_x(6 downto 0)) and "11111111";

Bolt
20.09.2019, 15:38
Вывел рамку по краям - все стало норм и автонастройка четко срабатывает.
Вот. Сам не могу понять этот эффект автонастройки, но влияет наличие не_чёрного во время гашения и синхроимпульсов. Может на RGB какие-то иголки с комбинационных схем пролазят, вот монитор и пытается их в кадр впихнуть?

dosikus
20.09.2019, 15:59
Переделал на 800х600"60Hz.
Работает , рамка вписалась . Счас перепишу с константами и дефайнами и можно будет заняться ROM и RAM.
omercury, Я тут чЁ подумал , может пока сделать ROM с знакогенератором? И объем внутренней памяти уменьшим и работу 51ого облегчим ...

dosikus
21.09.2019, 09:11
Продолжаю свою "эпопею".
Подключил к телевизору - все прекрасно, 800х600@60Hz.

dosikus
21.09.2019, 11:39
Вообщем как-то так. Покритикуйте плиз.


module vga_sync(

input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
output reg[19:0] v_addr // VRAM address
);
//================================================== ====================

localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
localparam SYNC_OFF = 1'b1;

localparam HSYNC_START = 840-1;
localparam HSYNC_END = 968-1;
localparam LINE_END = 1056-1;
localparam VSYNC_START = 601-1;
localparam VSYNC_END = 605-1;
localparam FRAME_END = 628-1;
localparam integer H_ACTIV = 800;
localparam integer V_ACTIV = 600;


reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] vaddr_count; // VRAM addres counter
always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
vaddr_count<= 0;
end else begin

pix_count <= pix_count + 1'b1;// Increment a pixel counter every clock time!
vaddr_count <= vaddr_count + 1'b1;
if(vaddr_count==(V_ACTIV*H_ACTIV))
vaddr_count <=0;

// This is a state machine based on a pixel count. Since VGA modes timings are
// based on a multiple of pixel counts, we add them up and generate syncs at
// proper times

case (pix_count)
0: vga_hsync <= SYNC_OFF;
HSYNC_START: vga_hsync <= SYNC_ON;
HSYNC_END: vga_hsync <= SYNC_OFF;
LINE_END: begin
line_count <= line_count + 1'b1;
pix_count <= 0;
end
endcase

case (line_count)
0: vga_vsync <= SYNC_OFF;
VSYNC_START: vga_vsync <= SYNC_ON;
VSYNC_END: vga_vsync <= SYNC_OFF;
FRAME_END: line_count <= 0;

endcase


// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
v_addr<=vaddr_count;
if (line_count>=0 && line_count<V_ACTIV)
begin
if (pix_count>=0 && pix_count<H_ACTIV)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
end
end
end
end

endmodule

dosikus
21.09.2019, 14:58
Снова затык .
reg [7:0] vram [0:4095]; initial $readmemb("vram.bin", vram);
Подсовываю ему бинарник - лается Error (10170): Verilog HDL syntax error at vram.bin(1) near text Ë

Делаю так и подсовываю intel hex
reg [7:0] vram [0:4095]; initial $readmemh("vram.hex", vram);
лается Error (10170): Verilog HDL syntax error at vram.hex(1) near text :

Эбическая сила, оказывается hex и bin это текстовые файлы, первый с форматом типа 0A второй 01010101010.
И это полный п...

Bolt
21.09.2019, 15:23
Binary и hex в понимании Verilog'а это немного другое.
Binary это текст 000 001 010 010...
Hex это текст 5A 00 FE D8...
https://timetoexplore.net/blog/initialize-memory-in-verilog

dosikus
21.09.2019, 15:59
Bolt, угу ужО осознал ...

- - - Добавлено - - -

Снова затык , растр полный но на экране мельтешение , нет ровной картинки.
Помогите...


module vga_sync(

input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
output reg[19:0] v_addr, // VRAM address count
output reg [7:0] data_out
);
//================================================== ====================

localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
localparam SYNC_OFF = 1'b1;

localparam HSYNC_START = 840-1;
localparam HSYNC_END = 968-1;
localparam LINE_END = 1056-1;
localparam VSYNC_START = 601-1;
localparam VSYNC_END = 605-1;
localparam FRAME_END = 628-1;
localparam integer H_ACTIV = 800;
localparam integer V_ACTIV = 600;

reg [7:0] vram [0:4095]; initial $readmemh("vram.txt", vram);

reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] vaddr_count; // Pixel counter, current pixel
reg[7:9] temp_data;
always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
vaddr_count<= 0;
v_addr =0;
end else begin

pix_count <= pix_count + 1'b1;// Increment a pixel counter every clock time!
vaddr_count <= vaddr_count + 1'b1;
if(vaddr_count==(V_ACTIV*H_ACTIV))
vaddr_count <=0;

// This is a state machine based on a pixel count. Since VGA modes timings are
// based on a multiple of pixel counts, we add them up and generate syncs at
// proper times

case (pix_count)
0: vga_hsync <= SYNC_OFF;
HSYNC_START: vga_hsync <= SYNC_ON;
HSYNC_END: vga_hsync <= SYNC_OFF;
LINE_END: begin
line_count <= line_count + 1'b1;
pix_count <= 0;
end
endcase

case (line_count)
0: vga_vsync <= SYNC_OFF;
VSYNC_START: vga_vsync <= SYNC_ON;
VSYNC_END: vga_vsync <= SYNC_OFF;
FRAME_END: line_count <= 0;

endcase


// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
v_addr<=vaddr_count;
if (line_count>=0 && line_count<V_ACTIV)
begin
if (pix_count>=0 && pix_count<H_ACTIV)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
//data_out <=vram[vaddr_count];
end
end





end
end

always @( posedge clk_in)
begin
data_out <= vram[vaddr_count[11:0]];
end
endmodule

Bolt
21.09.2019, 17:19
Снова затык , растр полный но на экране мельтешение , нет ровной картинки.
Что и как мельтешит?
Рябь? Вертикальные линии рассыпаются на пиксели? Или что?

dosikus
21.09.2019, 17:37
Такое ощущение что спрайты перемещаются .
Видно файлик я сгенерил монотонный, надо резкие участки добавить тогда лучше видно будет.
Может у меня начало RAM постоянно несовпадает с началом экрана?

Bolt
21.09.2019, 18:02
vaddr_count считает всегда, до значения V_ACTIV*H_ACTIV, и за один кадр успевает пройти больше одного цикла, вот картинка и бежит по экрану. Считать надо только если область видимая, и сбрасывать в ноль по синхроимпульсам.

dosikus
21.09.2019, 18:04
Благодарствую, бум исправлять.

dosikus
22.09.2019, 10:07
Привязал счетчик адресов vram к счетчикам пикселей. Усе взлетело .
Теперь буду знакогенератор осмысливать.

dosikus
23.09.2019, 14:05
Кстати , везде где не смотрю, на верилоге воротят нос от Case.
Чем оно так чревато и чревато ли?


case (line_count)
0: vga_vsync <= SYNC_OFF;
VSYNC_START: vga_vsync <= SYNC_ON;
VSYNC_END: vga_vsync <= SYNC_OFF;
FRAME_END: line_count <= 0;


По мне так вполне читаемый декодер получается, или у мну взгляд от С зашоренный?

IanPo
23.09.2019, 14:15
Я активно использую case, особенно, если много значений. Прочитал где-то, что длинные if then else хуже по быстродействию.
Главное - описать все значения анализируемого в case сигнала, особенно в асинхронных блоках, чтобы не получилось защелки.
Тут может помочь default.

HardWareMan
23.09.2019, 14:46
IanPo, case удобен только программисту. В железе он преобразуется в дешифратор а потом опять в шифратор, это всё прекрасно видно в RTL. Это не особо важно для жирной FPGA, но критично для CPLD. Правильно сказали за варианты: если case не полный (например, для 5ти битного числа следует описать все 32 варианта, так или иначе), то синтезатор начинает сходить с ума и мешает кашу.

А вот if это всего лишь атомарная логическая операция. При этом, даже сравнение вида Temp[4:0] == 5'h13 (которое в RTL показывается как сравнение) сворачивается в чипе в обычную AND функцию, которую, к слову, можно описать и самому (для вышеуказанного примера это будет Temp[4] & ~Temp[3] & ~Temp[2] & Temp[1] & Temp[0]). Если в кейсе всего 3 случая, то 3 таких if заметно выгодны, кроме организации варианта с default.

В конечном итоге, тем кто собрался всерьёз писать на xHDL я настоятельно советую изучать и цифровую схематехнику. Это позволяет описать будущую схему гораздо эффективнее.

omercury
23.09.2019, 20:36
Кстати , везде где не смотрю, на верилоге воротят нос от Case.
Чем оно так чревато и чревато ли?

По мне так вполне читаемый декодер получается,
Очень удобный оператор, для твоего случая - самое оно.
(в моём vgu можешь убедиться)

Сам использую где не чревато,
ибо чревато и ещё как...


Я активно использую case, особенно, если много значений. Прочитал где-то, что длинные if then else хуже по быстродействию.
Главное - описать все значения анализируемого в case сигнала, особенно в асинхронных блоках, чтобы не получилось защелки.
Тут может помочь default.

IanPo, case удобен только программисту. В железе он преобразуется в дешифратор а потом опять в шифратор, это всё прекрасно видно в RTL. Это не особо важно для жирной FPGA, но критично для CPLD.
Во, видишь?
Два диаметрально противоположных мнения
и оба неправильные... :)
Ща объясню...


или у мну взгляд от С зашоренный?
И это в том числе.

Видишь ли, в ПЛИС нет последовательных операций, логика не ждёт, когда закончится одна операция и начнётся другая, весь код выполняется одновременно.
То есть, условно говоря, основной цикл, все подпрограммы и прерывания работают одновременно, всем гуртом.

Ща:

В чём "цимус" оператора case?
В том, что он отрабатывает все условия внутри себя одновременно, в отличие от, допустим, if-elseif-else - они отрабатывают условия последовательно - сначала первое, потом второе и так далее до конца. На каждую обработку тратится время (задержка внутри компаратора и ключей, соединяющих всю требуху внутри ПЛИС в общую схему), на каждый цикл сравнения, а ведь все они находятся внутри тактового блока, и в конечном итоге задержка накопится до такой степени, что часть условий просто перестанет обрабатываться - на них тупо не хватит времени за период тактового сигнала, и это при в общем-то корректной схеме (IanPo тут прав, а неправ HardWareMan). С другой стороны, у параллельного оператора case есть свои ограничения - он не может выделять приоритеты (покажу ниже) (HardWareMan тут прав, а неправ IanPo), зато он более "высокочастотный". И тут снова алаверды HardWareMan-у, ибо рабочими лошадками тут являются в основном CPLD.
Либо жирные FPGA за несколько тыщ долларов штучка (снова HardWareMan прав)... :)

Рассмотрим такой пример: есть, кроме всего прочего, 2 сигнала, один из которых должен быть обработан в текущем цикле, но только один из них, независимо, пришли они раздельно или одновременно. Пока неважно, который именно, сейчас пусть будет любой.
назовём их wire in1 и wire in2
Соберём их в общую шину для оператора case - wire [1:0] in = {in1, in2};
Теперь обработаем несколькими вариантами:
case (in)
2'b10 : <operators>
2'b01 : <operators>
....
Эта конструкция отработает неправильно, точнее не всегда правильно. Правильно она отработает только когда сигналы будут приходить раздельно, а если вдруг вместе, то не сделает ничего...
Чтобы сделало, надо, чтоб отрабатывался и второй сигнал, добавим его:
case (in)
2'b10, 2'b11 : <operators>
2'b01, 2'b11 : <operators>
....
Вообще на самом деле это, конечно, бред...
(кто знает, по которой ветке здесь ломанётся case? ;))...
Коллизия видна невооружённым взглядом.
Зато if-elseif отработает правильно
if(in1) <operators>
elseif(in2) <operators>
Он выполнит первое условие, если оно произошло, независимо от того, произошло ли событие само по себе, либо одновременно с in2.
Условие задачи выполнено.
Правда в случае одновременных in1 и in2 этот селектор проигнорирует in2.

Есть ещё один селектор - casex, в котором x означает любое (1 или 0) значение, но, во-первых, с ним в нашей задаче получается та же каша, что и с простым case, а во-вторых, проверяет он условия так же, как и if-elseif-else последовательно, то есть имеет недостатки как одного, так и другого..., но бывает удобным при множественном выборе. Ну и бонусом выступает его приоритетность, будет выполнено условие, которое выше по тексту.

В общем универсальной затычки на все случаи жизни нет, для каждой конкретной задачи надо выбирать то, что будет правильно работать именно с ней.

P.S.
Извини, что не сразу отвечаю, на работе, как ни странно, приходится работать...

HardWareMan
23.09.2019, 21:47
omercury, а вот если бы ты оформил 2 параллельных ifа то они бы работали одновременно (одинаковая задержка) и "весили" бы минимально:

// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока
Вот эти два условия внутри одной пары begin/end будут работать одновременно и займут каждый по одному элементу 2И (инвертирование входа не является отдельным ресурсом) и будут управлять каждый своим begin/end. Вложенные if/else нужны именно там, где они нужны, например в генераторе синхросигналов развертки VGA: на строке Х мы активируем кадровый импульс присвоив триггеру 1, а на строке Y, соответственно, снимаем. Причем, если его вынести "за скобки" (т.е. за пределы работы самого счётчика строк) он продолжит работать правильно, но при этом управление счётчиком не будет влиять на этот кусок схемы, дополнительно тратя на это ресурсы. Именно так, длинные цепочки мультиплексоров (схема влияния ifоф) могут быть прилично сокращены и умение сформулировать логическую схему в этом как раз и помогает, о чём я уже говорил выше.

- - - Добавлено - - -

PS case в верилоге может объединять несколько значений под один begin/end блок, как и в С. Это бывает тоже необходимо.

- - - Добавлено - - -

PPS

if-elseif-else - они отрабатывают условия последовательно - сначала первое, потом второе и так далее до конца. На каждую обработку тратится время (задержка внутри компаратора и ключей, соединяющих всю требуху внутри ПЛИС в общую схему), на каждый цикл сравнения, а ведь все они находятся внутри тактового блока, и в конечном итоге задержка накопится до такой степени, что часть условий просто перестанет обрабатываться - на них тупо не хватит времени за период тактового сигнала, и это при в общем-то корректной схеме (IanPo тут прав, а неправ HardWareMan).
Если источник всех операторов if в каскаде един и внешний (т.е. данные сравнения в ifах не зависят друг от друга, а такое в 99% написанного кода) то все компараторы отработают одновременно. А вот уже их результат будет подан на цепочку мультиплексоров, задержка который всяко меньше полноценного компаратора (который в большинстве случаев всё равно преобразуется во многовходовый И). Причем, синтезатор с некоторой версии умеет их сворачивать в сбалансированное дерево, если логика схемы это позволяет - это тоже уменьшает задержку.
Это:
https://jpegshare.net/images/c3/20/c320d397abef4d7be765b9b9e9ce9c8d.png
Сворачивается в это:
https://jpegshare.net/images/8b/30/8b3001c968c3a27fb88d5b02c1684c8e.png

- - - Добавлено - - -

PPPS Кстати, стэйт-машина, оформленная через case с некоторой версии синтезатора корректно распознаётся и сворачивается в компактную логику, причём RTL позволяет прям выделить этот блок. Я, правда, только один раз такое замутил, как-то не особо нужно было.

Как я уже говорил: всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор.

omercury
23.09.2019, 21:57
omercury, а вот если бы ты оформил 2 параллельных ifа то они бы работали одновременно (одинаковая задержка) и "весили" бы минимально:

// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока
Вот эти два условия внутри одной пары begin/end будут работать одновременно и займут каждый по одному элементу 2И (инвертирование входа не является отдельным ресурсом) и будут управлять каждый своим begin/end.
Да именно так.
Но предыдущий if они таки подождут...


Вложенные if/else нужны именно там, где они нужны, например в генераторе синхросигналов развертки VGA: на строке Х мы активируем кадровый импульс присвоив триггеру 1, а на строке Y, соответственно, снимаем. Причем, если его вынести "за скобки" (т.е. за пределы работы самого счётчика строк) он продолжит работать правильно, но при этом управление счётчиком не будет влиять на этот кусок схемы, дополнительно тратя на это ресурсы. Именно так, длинные цепочки мультиплексоров (схема влияния ifоф) могут быть прилично сокращены и умение сформулировать логическую схему в этом как раз и помогает, о чём я уже говорил выше.
case там тоже прекрасно отработает, ибо условий во-первых не так много, а, во-вторых, нет дублирующихся условий - все константы разные.



PPS

Если источник всех операторов if в каскаде един и внешний (т.е. данные сравнения в ifах не зависят друг от друга, а такое в 99% написанного кода) то все компараторы отработают одновременно.
Нет, они будут срабатывать последовательно потому, что каждый последующий if должен проверить - сработал ли предыдущий.

HardWareMan
23.09.2019, 22:07
Нет, они будут срабатывать последовательно потому, что каждый последующий if должен проверить - сработал ли предыдущий.
Ты пример в моём посте посмотри (я обновил, ты мог упустить), компараторы сработают одновременно. Результат будет отрабатываться согласно приоритета. А это несколько разные вещи (полноценный компаратор однозначно медленнее простого мультиплексора).

- - - Добавлено - - -

PS В примере, правда, все ifы равноправны, но даже если бы я их выстроил через else поменялся бы только порядок обработки результата на конкретно заданный мною, а не выбранный синтезатором. В примере приоритетно обрабатывается только 1 регистр, который общий для всех условий. Остальные события работают независимо друг от друга. Такой немного кривой пример, но суть и так понятна.

omercury
23.09.2019, 23:26
Ты пример в моём посте посмотри (я обновил, ты мог упустить), компараторы сработают одновременно.
Он процитирован, и кажется идентичным отображённому в посте.
Венрёмся к условию задачи:

2 сигнала, один из которых должен быть обработан в текущем цикле, но только один из них, независимо, пришли они раздельно или одновременно.
Валидные значения: 'b01, 'b10 и 'b11
Блок case, также, как и if/else, выполняет только одну ветку из всех условий, находящихся в блоке.
Чтоб сделать наглядней абсурдность ситуации, заменим <operators> на установку и сброс триггера.
блок

case (in)
2'b10 : reg <= 1'b1;
2'b01 : reg <= 1'b0;
обработает одно из двух валидных состояний, пропущено значение 'b11

блок

if(in1) reg <= 1'b1;
elseif(in2) reg <= 1'b0;
обработает один из 3х доступных вариантов
а что сделает это?


// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока

- - - Добавлено - - -


Как я уже говорил: всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор.
Тут собеседник-то не всегда понимает, а ты про синтезатор.

- - - Добавлено - - -

И вообще, о чём-то не о том мы...
Речь шла о том, что для разных ситуаций бывают удобными разные решения, а не о том, как выкрутиться из всех случаев каким-то одним.

Bolt
24.09.2019, 00:19
В конечном итоге, тем кто собрался всерьёз писать на xHDL я настоятельно советую изучать и цифровую схематехнику. Это позволяет описать будущую схему гораздо эффективнее.

всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор
К этому добавлю ещё.

Заглядывать надо не только в RTL, но и в fitter, там тоже бывают неожиданные решения, но уже от оптимизатора.

Не надо пытаться на HDL писать программу, это часто приводит к несинтезируемым схемам и взаимонепониманию с синтезатором. На HDL надо описывать схему. И мы описываем не "что делать при...", а комбинационную схему из логических элементов и мультиплексоров, которая готовит сигналы, которые будут защёлкнуты в триггер по тактовому сигналу.

HardWareMan
24.09.2019, 07:06
Он процитирован, и кажется идентичным отображённому в посте.
Я там добавил спойлер с примером.

Вернёмся к условию задачи:

Валидные значения: 'b01, 'b10 и 'b11
Блок case, также, как и if/else, выполняет только одну ветку из всех условий, находящихся в блоке.
Чтоб сделать наглядней абсурдность ситуации, заменим <operators> на установку и сброс триггера.
блок

case (in)
2'b10 : reg <= 1'b1;
2'b01 : reg <= 1'b0;
обработает одно из двух валидных состояний, пропущено значение 'b11

блок

if(in1) reg <= 1'b1;
elseif(in2) reg <= 1'b0;
обработает один из 3х доступных вариантов
а что сделает это?

// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока


Ровно то же самое, что и в твоём примере с case. 1 условие из двух. Ведь мы же хорошие мальчики и переносим сигналы условия в свой тактовый домен, верно? И у case точно такие же требования. Ну а чтобы модифицировать мой пример под твой пример, то надо описать вот так:

// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
if (in1 & in2) begin ... end
// Конец общего блока

Что касается твоего:

if(in1) reg <= 1'b1;
elseif(in2) reg <= 1'b0;
То он тоже обработает один из 2х доступных вариантов:
1. in1=1, тогда он по приоритету сработает и значение in2 проигнорируется.
2. in1=0, тогда проанализируется значение in2.
И согласись, это совсем не то, что ты описал как {1,0}:{0,1}:{1:1}. Это будет соответствовать вот такой таблице:

in1 in2 res
1 x #1
0 1 #2
0 0 --
Мой пример для этого будет выглядеть вот так:

// Общий блок внутри begin/end
if (in1) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока

В общем, следует понимать, что все условия на одном уровне в одном блоке обрабатываются одновременно. Но так как мы и так избавляемся от метастабильности (а кто не избавляется, то сам себе злобный буратино) то можно сказать, что case это лишь красивое описание группы таких условий. Причем даже твой случай в case можно описать как комбинация 2'b1x + 2'b01 и оно сработает. Т.е., в большинстве случаев case и группа if в одном блоке решение равноправное. А вот случаи, когда красивее то или иное решение есть. В случае с case это когда надо организовать условие с default. Надеюсь, не надо объяснять в чём сила этого самого default? А в случае с набором условий - да хоть мой пример выше. Или иногда надо организовать несколько значений, которые проще описать в виде логического уравнения, например (in1 | (in2 & ~in3)). Потому как это ведет к перечислению всех вариантов, которые попадают под эту формулу в одном условии case. А в случае данной формулы это будет целых 5 значений. Хотя, если константы именованы то case тупо нагляднее, о чём я и говорил: удобство для погромиста.

dosikus
24.09.2019, 09:39
Ну таки посмотрим в RTL , попробую оценить сам а вы ткните если вру.







https://d.radikal.ru/d27/1909/72/f3f8acc6d556.jpg (https://radikal.ru)

pix_count - cчетчик вверх с параллельной загрузкой, со сбросом при значении 1056-1 - длина всей строки с со всеми причиндалами.




https://d.radikal.ru/d31/1909/31/f04df40a4d25.jpg (https://radikal.ru)


CASE(pix_count) - декодер hsync .
Вот это и есть то что HardWareMan описал - дешифратор на Equal и затем шифратор на NOR и OR ?

- - - Добавлено - - -

Да и , пробую симулировать в Modelsim , естественно пока только один этот модуль ,без PLL и HDMI, да и тестбенчи пока не готов писать , гружу вручную добавляю тактовую и вручную делаю сброс.
Все отображается и работает , почти все - кроме данных в vram. Как это исправить или Modelsim не грузит сторонние файлы?


https://c.radikal.ru/c39/1909/65/e1444c9287a7.jpg (https://radikal.ru)

https://b.radikal.ru/b25/1909/b3/d90a3bbba2ff.jpg (https://radikal.ru)

HardWareMan
24.09.2019, 10:33
https://d.radikal.ru/d27/1909/72/f3f8acc6d556.jpg (https://radikal.ru)
pix_count - cчетчик вверх с параллельной загрузкой, со сбросом при значении 1056-1 - длина всей строки с со всеми причиндалами.
Это не синхронный дизайн здорового человека. У тебя MUX21 и так делает нормальное синхронное обнуление на шаге h4F1 = 1055. Так зачем этот асинхронный сброс?

- - - Добавлено - - -

И еще, ты старайся указывать размерность жгута. Ато он у тебя расширяется до стандартных 32 бит. Понятно, что фиттер потом урежет до используемого количества, но чётко указанная размерность делает схему в RTL чище.

dosikus
24.09.2019, 11:08
Это не синхронный дизайн здорового человека. У тебя MUX21 и так делает нормальное синхронное обнуление на шаге h4F1 = 1055. Так зачем этот асинхронный сброс?


Наверняка он здесь :
always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
v_addr <=0;
end else begin



И еще, ты старайся указывать размерность жгута. Ато он у тебя расширяется до стандартных 32 бит. Понятно, что фиттер потом урежет до используемого количества, но чётко указанная размерность делает схему в RTL чище.

А это скорей всего я внес здесь :

localparam integer H_ACTIV = 800;
localparam integer V_ACTIV = 600;

Ибо рассчитывал адресc vram - H_ACTIV*V_ACTIV, синтез мне обрезал результат до 16бит.
Потом расчет переделал на v_addr <= ((pix_y*800)+pix_x);
и про то забыл..

HardWareMan
24.09.2019, 11:31
Наверняка он здесь :
always @( posedge clk_in or negedge reset )
begin
if (!reset) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
v_addr <=0;
end else begin
А, ну да. Для полностью синхронного дизайна никогда не используй список чувствительности более одного сигнала. Для этого тебе следует сделать вот так:

reg [1:0]SynRes;
always @( posedge clk_in )
begin
// Синхронизация сброса
SynRes[1:0] <= {SynRes[0],reset};
if (SynRes[1] & ~SynRes[0]) begin // Либо так: if (SynRes[1:0] == 2'b10) begin
line_count <= 0; // On a reset, restart counters from 0
pix_count <= 0;
v_addr <=0;
end else begin
2 бита это если нужно отловить конкретно перепад, здесь я отлавливаю 1 => 0. Если перепад не нужно (сработка по уровню), то достаточно одного бита, главное это засинхронизировать его (перенести в текущий тактовый домен). В идеале, список чувствительности блока always должен содержать только тактовый сигнал, причем либо posedge, либо negedge. И не обязательно мастерклока. Т.е., если ведомый блок always у тебя не имеет перекликания с другими always блоками, то его тактовая может быть выходом триггера предыдущего блока. Но это уже с опытом придёт.

И ещё, обязательно усвой разницу инверсии между ~ и !. Она принципиально разная.

dosikus
24.09.2019, 11:45
Стало :

https://b.radikal.ru/b21/1909/18/d8297ca84942.jpg (https://radikal.ru)

HardWareMan
24.09.2019, 12:41
Ай, красиво. А что сказал time_quest? Какой получился fmax?

dosikus
24.09.2019, 12:58
Угу, еще бы я им пользоваться умел ...

omercury
24.09.2019, 14:40
А это скорей всего я внес здесь :

localparam integer H_ACTIV = 800;
localparam integer V_ACTIV = 600;

Ибо рассчитывал адресc vram - H_ACTIV*V_ACTIV, синтез мне обрезал результат до 16бит.
Потом расчет переделал на v_addr <= ((pix_y*800)+pix_x);
и про то забыл..

Это автоматом проще рассчитывается:


parameter hcnt_Width = $clog2(LINE_END); //Ширина горизонтального счётчика, вычисляемое
parameter hAct_Width = $clog2(H_ACTIV); //Ширина шины адреса по горизонтали, вычисляемое
parameter vcnt_Width = $clog2(FRAME_END); //Ширина вертикального счётчика, вычисляемое
parameter vAct_Width = $clog2(V_ACTIV); //Ширина шины адреса по вертикали, вычисляемое
parameter VRAM_Width = vAct_Width + hAct_Width; //Ширина шины адреса памяти, вычисляемое

reg pix_count [hcnt_Width-1:0] = 0; // Горизонтальный счетчик
reg line_count [vcnt_Width-1:0] = 0; // Вертикальный счетчик

wire [VRAM_Width-1: 0] VRAM_Addr = {line_count [vAct_Width-1:0], pix_count [hAct_Width-1:0]);

Когда наводишь мышь в окне проект манагера на какой-либо модуль, в тултипе Квартус показывает значения parameter.
localparam не показывает(((

omercury
24.09.2019, 20:42
Угу, еще бы я им пользоваться умел ...

В простейшем случае ничего особо и не надо.
В Compilation Report в окне Table of content найди в дереве TimeQuest Timing Analiser и выбери в нём медленные модели.
Что-то он там по-любому наанализировал...
70073

dosikus
24.09.2019, 21:55
Олег, ок порядок наведем, счас затык в другом - ранее как и писал - может сделаем знакогенератор ?

HardWareMan
25.09.2019, 06:28
omercury, нужно только SDC файл создать, со требуемой частотой.

dosikus, вот у тебя pix_count только либо обнуляется, либо считает в плюс, верно?
https://b.radikal.ru/b21/1909/18/d8297ca84942.jpg
А ты вынеси его за скобки, типа вот так:

reg [1:0]SynRes;
always @( posedge clk_in )
begin
// Синхронизация сброса
SynRes[1:0] <= {SynRes[0],reset};
// Счетчик пикселей
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == h41F) ) pix_count <= 0; else pix_count <= pix_count + 1;
// Остальная логика
if (SynRes[1] & ~SynRes[0]) begin // Либо так: if (SynRes[1:0] == 2'b10) begin
line_count <= 0; // On a reset, restart counters from 0
v_addr <=0;
end else begin
И посмотри, какая красота появится в твоём RTL (только поправь настоящие константы и размерности, я там просто что-бы понятно было написал). Суть посыла такая: синтезатор, к сожалению, не умеет объединять некоторые события сам, справедливо полагая, что они имеют некоторый приоритет, описанный программистом. Однако, схемотехник сразу скажет - тут и тут лишнее, можно упростить. И если ты знаешь что и как - это не сложно объяснить синтезатору. Основная цель - сократить число управляющих цепей. В данном случае цепь сброса счётчика pix_count может быть объединена с цепью обнуления при счёте. Желательно всегда стремиться к уменьшению вложенности управляющих цепей (это те, которые условия), а так же стараться объединять цепи, ведущие к одному результату.

А в целом, тут ситуация как с блок-схемами алгоритма при обычном программировании - все настойчиво игнорируют этот момент, а потом получают спагетти-код. А ведь описать код по блок-схеме реально быстро и просто, я пробовал. Правда, в институте, когда на кафедре АСУ учился. :)

dosikus
25.09.2019, 15:20
HardWareMan, спасибо за науку...\


https://a.radikal.ru/a03/1909/7c/144c3044852d.jpg (https://radikal.ru)

https://d.radikal.ru/d05/1909/d3/549fc48ae4f8.jpg (https://radikal.ru)

- - - Добавлено - - -


В простейшем случае ничего особо и не надо.
В Compilation Report в окне Table of content найди в дереве TimeQuest Timing Analiser и выбери в нём медленные модели.
Что-то он там по-любому наанализировал...
70073

12.14 MHz 12.14 MHz U_PLL|altpll_component|auto_generated|pll1|clk[0]
325.52 MHz 325.52 MHz U_PLL|altpll_component|auto_generated|pll1|clk[1]

- - - Добавлено - - -


Вот. Сам не могу понять этот эффект автонастройки, но влияет наличие не_чёрного во время гашения и синхроимпульсов. Может на RGB какие-то иголки с комбинационных схем пролазят, вот монитор и пытается их в кадр впихнуть?

Нашел из-за чего эта хрень была.
У меня адаптер HDMI-VGA с питанием , питание было воткнуто в хаб и туда же флешка дикожрущая . Из-за нее питание и садило...

HardWareMan
25.09.2019, 20:40
https://d.radikal.ru/d05/1909/d3/549fc48ae4f8.jpg (https://radikal.ru)
Странно, по идее должен был остаться один мультиплексор. Ты точно вынес все присвоения pix_count за пределы основного условия?

Вот такой код:

module TOP(
input clk,
input reset,
output reg [15:0]pix_count,
output reg [7:0]line_count
);

reg [1:0]sync;

always @(posedge clk)
begin
//
sync[1:0] <= {sync[0],reset};
//
if ((sync[1] & ~sync[0]) | (pix_count[15:0] == 16'h041F)) pix_count[15:0] <= 16'h0000; else pix_count[15:0] <= pix_count[15:0] + 16'h0001;
//
if (sync[1] & ~sync[0])
begin
line_count[7:0] <= 8'h00;
end else begin
if (pix_count[15:0] == 16'h0100) line_count[7:0] <= line_count[7:0] + 8'h01;
end
end

endmodule
Должен выглядеть вот так:
https://jpegshare.net/images/45/77/4577168765f66b8fc86cb7bb843f12b2.png
Видишь, как объединились оба условия обнуления pix_count в один мультиплексор? И, что особенно, выстроились мультиплексоры у line_count в порядке приоритета (чем ближе к триггеру - тем больше приоритет)? При этом, если грамотно описать, то можно сделать сбалансированное дерево, я уже об этом говорил.

Bolt
25.09.2019, 20:49
У pix_count три варианта: сброс в ноль, инкремент, хранение. Поэтому два мультиплексора.

omercury
25.09.2019, 21:12
может сделаем знакогенератор ?
У тебя растр 800х600.
Шрифт, надеюсь, моноширинный? :)

Определяй размеры знакоместа.

- - - Добавлено - - -


Желательно всегда стремиться к уменьшению вложенности управляющих цепей (это те, которые условия), а так же стараться объединять цепи, ведущие к одному результату.
Тут, кстати, положительную роль играет одна особенность верилога - при попытке управлять регистром из разных always блоков, Квартус ругается ошибкой, в отличие от VHDL, который пропускает даже (о ужас) тактирование триггера из разных процессов.

- - - Добавлено - - -


Видишь, как объединились оба условия обнуления pix_count в один мультиплексор?
А нафига его вообще обнулять при сбросе?
В этом есть необходимость?
(прошу прощения за мой французский...)

HardWareMan
25.09.2019, 21:35
А нафига его вообще обнулять при сбросе?
В этом есть необходимость?
(прошу прощения за мой французский...)
АХЕЗ. Я бы не обнулял, да. А вот PPU я делал от Денди, там при обнулении блокируется синхрогенератор. Это понятно для ASIC - надо как-то привести в некоторое надёжное состояние при включении питания. При построении этого на основе FPGA это самое состояние можно прописать прямо в коде: reg [15:0]pix_count = 16'h1234;

- - - Добавлено - - -


У pix_count три варианта: сброс в ноль, инкремент, хранение. Поэтому два мультиплексора.
При этом хранение у него идет, почему-то, на сепаратор фронта сброса, что не правильно. Поэтому я и говорю - искайте ошибку. У меня в примере этому соответствует line_count.

dosikus
26.09.2019, 07:29
omercury, скорей 8x16. 8x8 слишком мелкий, 16x16 много сожрет







А нафига его вообще обнулять при сбросе?
В этом есть необходимость?
(прошу прощения за мой французский...)

Ну дык потому-что код сп**ен :)))))

dosikus
26.09.2019, 12:15
Сейчас полный код синхры выглядит так:

module vga_sync(

input clk_in, // Input 25.175 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
//output reg[19:0] v_addr, // VRAM address count
output wire[7:0] data_out
);
//================================================== ====================

localparam SYNC_ON = 1'b0; // Define the polarity of sync pulses
localparam SYNC_OFF = 1'b1;

localparam HSYNC_START = 840;
localparam HSYNC_END = 968;
localparam LINE_END = 1056;
localparam VSYNC_START = 601;
localparam VSYNC_END = 605;
localparam FRAME_END = 628;
localparam H_ACTIV = 800;
localparam V_ACTIV = 600;

reg [7:0] vram [0:4095]; initial $readmemh("vram.txt", vram);

reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] v_addr; // Pixel counter, current pixel




reg [1:0]SynRes;
always @( posedge clk_in )
begin
// Синхронизация сброса
SynRes[1:0] <= {SynRes[0],reset};
// Счетчик пикселей
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == 1056) ) pix_count <= 0; else pix_count <= pix_count + 1;
// Остальная логика
if (SynRes[1] & ~SynRes[0]) begin // Либо так: if (SynRes[1:0] == 2'b10) begin
line_count <= 0; // On a reset, restart counters from 0
v_addr <=0;
end else begin




// This is a state machine based on a pixel count. Since VGA modes timings are
// based on a multiple of pixel counts, we add them up and generate syncs at
// proper times

case (pix_count)
0: vga_hsync <= SYNC_OFF;
HSYNC_START: vga_hsync <= SYNC_ON;
HSYNC_END: vga_hsync <= SYNC_OFF;
LINE_END: begin
line_count <= line_count + 1'b1;
pix_count <= 0;
end
endcase

case (line_count)
0: vga_vsync <= SYNC_OFF;
VSYNC_START: vga_vsync <= SYNC_ON;
VSYNC_END: vga_vsync <= SYNC_OFF;
FRAME_END: line_count <= 0;

endcase


// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
if (line_count>=0 && line_count<V_ACTIV)
begin
if (pix_count>=0 && pix_count<H_ACTIV)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
v_addr <= ((pix_y*800)+pix_x);

end
end
end
end


assign data_out = vram[v_addr];

endmodule

- - - Добавлено - - -

RTL выгладит так.
В предыдущей я наврал - не удалил одну строку...

https://d.radikal.ru/d04/1909/07/494f009fcf4c.jpg (https://radikal.ru)

https://a.radikal.ru/a36/1909/c9/2052917c0272.jpg (https://radikal.ru)

- - - Добавлено - - -

Здесь полная схема RTL

https://c.radikal.ru/c40/1909/4c/b195104d817ft.jpg (https://radikal.ru/big/jebdozkclk50p)

HardWareMan
26.09.2019, 12:20
dosikus, квиксёрч по этой страничке показывает:
https://jpegshare.net/images/1d/fa/1dfaa05fa939616b8926ed233871ff3a.png

- - - Добавлено - - -

PS Хоть line_count работает достаточно медленно и та цепочка мультиплексоров в принципе не решает, но всё же её тоже можно прилично сократить по мной предложенной схеме. Только на этот раз внимательно посмотри какие события должны влиять на нее и всё такое.

dosikus
26.09.2019, 13:02
ВотЪ, как ты и говорил.

https://b.radikal.ru/b02/1909/cd/6edfb00e2bb3.jpg (https://radikal.ru)

- - - Добавлено - - -

Так ?

if ( (SynRes[1] & ~SynRes[0]) | (line_count == 600) ) line_count <= 0; else if (pix_count==800 ) line_count<= line_count + 1;

А | (OR) здесь логическое или битовое, или без разницы?

- - - Добавлено - - -



Так ?

if ( (SynRes[1] & ~SynRes[0]) | (line_count == 600) ) line_count <= 0; else if (pix_count==800 ) line_count<= line_count + 1;



Не прокатило...

HardWareMan
26.09.2019, 13:39
dosikus, что там не прокатило? Правильный RTL показывается. Ааа, ты про line_count? Не, не так. В коде влияние на line_count идут вот такие сигналы:
1. (SynRes[1] & ~SynRes[0]) сбрасывает в 0
2. pix_count == LINE_END добавляет 1
3. line_count == FRAME_END сбрасывает в ноль
Отсюда вывод: надо делать вот так

// Счетчик пикселей
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
// Счетчик строк
if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
else if ( pix_count == LINE_END ) line_count <= line_count + 1;

Остальные присвоения line_count нужно удалить. Поправь и покажи результирующий RTL.

dosikus
26.09.2019, 14:25
Да признаюсь - тупанул, а был так близко. :))))


https://a.radikal.ru/a02/1909/04/0b0607e9f48f.jpg (https://radikal.ru)

HardWareMan
26.09.2019, 15:32
Ай, красиво. Я думаю, что всем миром мы вылижем этот проект до нормального кода.

HardWareMan
27.09.2019, 06:31
Теперь можно вытащить синхросигналы из общей каши и положить рядом со счётчиками. И оформить их в виде:
if ( counter == START ) sync <= 1'b0;
else if ( counter == END ) sync <= 1'b1;
Для hsync это будет pix_counter, а для vsync - line counter.

dosikus
27.09.2019, 11:47
Ага, все шЫкарно.
Только у меня синхросигналы положительные.


if(pix_count== HSYNC_START)vga_hsync <= SYNC_ON;else if (pix_count==HSYNC_END)vga_hsync<=SYNC_OFF;
if(line_count== VSYNC_START)vga_vsync <= SYNC_ON;else if (line_count==VSYNC_END)vga_vsync<=SYNC_OFF;

Ну и вопрос :
Здесь OR и AND - логические или битовые?

if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) )


HardWareMan, и да , ты раннее говорил про разницу инверсий ~ и !. Можно подробней , что-то плохо ищется на верилоговских туторах, вечно какая-то хрень вылезает...


https://d.radikal.ru/d19/1909/44/ad2f9bc3d9e1.png (https://radikal.ru)

- - - Добавлено - - -

omercury, Свершилось, после месяца долбежа в суппорт опенкорес выслали пароль...

- - - Добавлено - - -

Что имеем на данный момент :



module vga_sync(

input clk_in, // Input 40 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
//output reg[19:0] v_addr, // VRAM address count
output wire[7:0] data_out
);
//================================================== ====================

localparam SYNC_ON = 1'b1; // Define the polarity of sync pulses (psitive)
localparam SYNC_OFF = 1'b0;


localparam HSYNC_START = 840;
localparam HSYNC_END = 968;
localparam LINE_END = 1056;
localparam VSYNC_START = 601;
localparam VSYNC_END = 605;
localparam FRAME_END = 628;
localparam H_ACTIV = 800;
localparam V_ACTIV = 600;

reg [7:0] vram [0:4095]; initial $readmemh("vram.txt", vram);

reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] v_addr; // vaddres counter





reg [1:0]SynRes;
always @( posedge clk_in )
begin
// reset
SynRes[1:0] <= {SynRes[0],reset};
// pixel count
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
// line count
if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
else if ( pix_count == LINE_END ) line_count <= line_count + 1;
// synhroimpulse
if(pix_count== HSYNC_START)vga_hsync <= SYNC_ON;else if (pix_count==HSYNC_END)vga_hsync<=SYNC_OFF;
if(line_count== VSYNC_START)vga_vsync <= SYNC_ON;else if (line_count==VSYNC_END)vga_vsync<=SYNC_OFF;
if (SynRes[1] & ~SynRes[0]) v_addr <=0;// or this: if (SynRes[1:0] == 2'b10)
else begin


// The following code defines a drawable display region and outputs
// disp_enable to 1 when within that region. Also, set the pixel coordinates
// (normalized to the top-left edge of a drawable region)
disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
if (line_count>=0 && line_count<V_ACTIV)
begin
if (pix_count>=0 && pix_count<H_ACTIV)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
v_addr <= ((pix_y*800)+pix_x);

end
end
end
end


assign data_out = vram[v_addr];

endmodule

- - - Добавлено - - -

Да и при таком раскладе оба синхроимпульса во время первой строки находятся в неопределенном состоянии .
Это все мелочи? Или вставить их инициализацию в секцию reset?


if (SynRes[1] & ~SynRes[0]) begin vga_hsync <=0; vga_vsync<=0; end


И я так и не нашел - как заставить Modelsim выводить данные из vram...


https://a.radikal.ru/a35/1909/cc/472dfd542318.png (https://radikal.ru)

- - - Добавлено - - -

Ага, сработало, синхроимпульсы при сбросе и старте в 0...


reg [1:0]SynRes;
always @( posedge clk_in )
begin
// reset
SynRes[1:0] <= {SynRes[0],reset};
// pixel count
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
// line count
if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
else if ( pix_count == LINE_END ) line_count <= line_count + 1;
// synhroimpulse
if (SynRes[1] & ~SynRes[0]) begin vga_hsync <=0; vga_vsync<=0; end
if(pix_count== HSYNC_START)vga_hsync <= SYNC_ON;else if (pix_count==HSYNC_END)vga_hsync<=SYNC_OFF;
if(line_count== VSYNC_START)vga_vsync <= SYNC_ON;else if (line_count==VSYNC_END)vga_vsync<=SYNC_OFF;
if (SynRes[1] & ~SynRes[0]) v_addr <=0;// or this: if (SynRes[1:0] == 2'b10)
else begin


https://a.radikal.ru/a24/1909/86/0ab80be213d2.png (https://radikal.ru)

HardWareMan
27.09.2019, 12:40
Здесь OR и AND - логические или битовые?
Строго битовые. Ты же комбинаторную логическую схему строишь, а не компаратор.

HardWareMan, и да , ты раннее говорил про разницу инверсий ~ и !. Можно подробней , что-то плохо ищется на верилоговских туторах, вечно какая-то хрень вылезает...
~ Побитовая инверсия.
! Логическое отрицание.
https://jpegshare.net/images/c3/b1/c3b1ed4646406b1359bede117d77aed5.png

dosikus
27.09.2019, 12:54
Так'с нашел как vram выводить в Modelsim, с какого-то перепугу надо файл с содержимым пихать в папку modelsim проекта.
И увидел совсем нерадужные вести , выхлоп данных с vram на один такт опаздывает с pix_count...


https://b.radikal.ru/b00/1909/7f/296dac407b80.png (https://radikal.ru)


Дальше - хуже.
pix_count сбрасывается при 1057
v_addr считает 798 -0-800



https://b.radikal.ru/b25/1909/6d/5a90ce2c2192.png (https://radikal.ru)

HardWareMan
27.09.2019, 13:24
Ты -1 в константах забыл указать (лучше прямо в условии, обняв в скобки). Схема синхронная, т.е. она сейчас запишет то, что будет в следующем такте. А считает она от 0. Я вижу на твоем RTL 420, а не 41F.

- - - Добавлено - - -

Кто касается строк, то это интересный глюк, дай сюда последний актуальный RTL.

dosikus
27.09.2019, 13:40
Картинкой?

https://d.radikal.ru/d43/1909/52/7969c73d98e6t.jpg (https://radikal.ru/big/l8h1z0yigckqt)

HardWareMan
27.09.2019, 15:25
dosikus, отлично. Тебе надо pix_x и pix_y разобрать. Насколько я понял, это просто буферизированный вывод pix_count и line_count соответственно. Это объясняет задержку на 1 такт - всё верно. Что касается значений, то тебе надо просто в глобальном месте просто сделать перенос счетчиков по окну, например вот так:
if ( pix_count < d640 ) pix_x <= pix_count; else pix_x <= 0;
if ( line_count < d480 ) pix_y <= line_count; else pix_y <= 0;
Тогда pix_x и pix_y будут сканировать 640х480 точек, обнуляясь на гашении.

dosikus
27.09.2019, 16:04
То есть меняем


disp_enable <= 0;
pix_x <= 0;
pix_y <= 0;
if (line_count>=0 && line_count<V_ACTIV)
begin
if (pix_count>=0 && pix_count<H_ACTIV)
begin
disp_enable <= 1;
pix_x <= pix_count;
pix_y <= line_count;
v_addr <= ((pix_y*800)+pix_x);

end
end
На

if ( pix_count < d800 ) pix_x <= pix_count; else pix_x <= 0;
if ( line_count < d600) pix_y <= line_count; else pix_y <= 0;
v_addr <= ((pix_y*800)+pix_x);



А вот куда blank тобишь disp_enable воткнуть?

HardWareMan
27.09.2019, 16:42
dosikus, он должен быть как логическая сумма обоих гашений:
blank <= ~((pix_count < d800) & (line_count < d600))
Инверсия - потому что гашение, а не окно. Ну и ты dXXX замени на константы свои, при этом -1 делать не надо. -1 только в счётчиках быть должно. Ты понимаешь, что твоё "line_count>=0" и "pix_count>=0" лишнее даже с точки зрения программирования? Ведь счетчик - число целочисленное от 0 и до константы. А лишнее условие = лишние ресурсы.

dosikus
27.09.2019, 17:17
На константы типа d800 - ругается.
Переделал так - растр пропал и сигнал не видит...


if ( pix_count < 800 ) pix_x <= pix_count; else pix_x <= 0;
if ( line_count < 600) pix_y <= line_count; else pix_y <= 0;
disp_enable <= ~((pix_count < 800) & (line_count < 600));
if(disp_enable)v_addr <= ((pix_y*800)+pix_x);



Весь код:



module vga_sync(

input clk_in, // Input 40 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
output wire[7:0] data_out
);
//================================================== ====================

localparam SYNC_ON = 1'b1; // Define the polarity of sync pulses (psitive)
localparam SYNC_OFF = 1'b0;


localparam HSYNC_START = (840-1);
localparam HSYNC_END = (968-1);
localparam LINE_END = (1056-1);
localparam VSYNC_START = (601-1);
localparam VSYNC_END = (605-1);
localparam FRAME_END = (628-1);
localparam H_ACTIV = 800;
localparam V_ACTIV = 600;

reg [7:0] vram [0:4095]; initial $readmemh("vram.dat", vram);

reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] v_addr; // vaddres counter
reg [1:0]SynRes;



always @( posedge clk_in )
begin
// reset
SynRes[1:0] <= {SynRes[0],reset};
// pixel count
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
// line count
if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
else if ( pix_count == LINE_END ) line_count <= line_count + 1;
// synhroimpulse
if (SynRes[1] & ~SynRes[0]) begin vga_hsync <=0; vga_vsync<=0; end
if(pix_count== HSYNC_START)vga_hsync <= SYNC_ON;else if (pix_count==HSYNC_END)vga_hsync<=SYNC_OFF;
if(line_count== VSYNC_START)vga_vsync <= SYNC_ON;else if (line_count==VSYNC_END)vga_vsync<=SYNC_OFF;
if (SynRes[1] & ~SynRes[0]) v_addr <=0;// or this: if (SynRes[1:0] == 2'b10)

else begin
if ( pix_count < 800 ) pix_x <= pix_count; else pix_x <= 0;
if ( line_count < 600) pix_y <= line_count; else pix_y <= 0;
disp_enable <= ~((pix_count < 800) & (line_count < 600));
if(disp_enable)v_addr <= ((pix_y*800)+pix_x);

end
end


assign data_out = vram[v_addr];

endmodule

HardWareMan
27.09.2019, 18:35
dosikus, :v2_dizzy_facepalm:
Я имел в виду поменять на твои именованные константы:

H_ACTIV

dosikus
27.09.2019, 18:51
Дык все равно что-то я сломал - пропала синхронизация с изображением.

HardWareMan
27.09.2019, 19:01
dosikus, ну конечно сломал. Верни константы на место, а -1 поставь в те условия, где они требуются.

dosikus
27.09.2019, 19:09
HardWareMan, не все проще , я пропустил что ты нормальный blanc сделал а не мой disp_enable, счас все работает.
У меня же и HDMI с инвертированным blanc.
Позже перепишу ...

Счас так:



module vga_sync(

input clk_in, // Input 40 MHz clock, this is a pixel clock for this VGA mode
input reset, // Input async. active low reset signal

output reg vga_hsync, // Output horizontal sync signal
output reg vga_vsync, // Output vertical sync signal

output reg disp_enable, // Set when a writable portion of display is enabled:
output reg[9:0] pix_x, // x-coordinate of an active pixel
output reg[9:0] pix_y, // y-coordinate of an active pixel
//output reg[19:0] v_addr, // VRAM address count
output wire[7:0] data_out
);
//================================================== ====================

localparam SYNC_ON = 1'b1; // Define the polarity of sync pulses (psitive)
localparam SYNC_OFF = 1'b0;


localparam HSYNC_START = (840-1);
localparam HSYNC_END = (968-1);
localparam LINE_END = (1056-1);
localparam VSYNC_START = (601-1);
localparam VSYNC_END = (605-1);
localparam FRAME_END = (628-1);
localparam H_ACTIV = 800;
localparam V_ACTIV = 600;

reg [7:0] vram [0:4095]; initial $readmemh("vram.dat", vram);

reg[9:0] line_count; // Line counter, current line
reg[15:0] pix_count; // Pixel counter, current pixel
reg[19:0] v_addr; // vaddres counter


reg [1:0]SynRes;
always @( posedge clk_in )
begin
// reset
SynRes[1:0] <= {SynRes[0],reset};
// pixel count
if ( (SynRes[1] & ~SynRes[0]) | (pix_count == LINE_END) ) pix_count <= 0; else pix_count <= pix_count + 1;
// line count
if ( (SynRes[1] & ~SynRes[0]) | (line_count == FRAME_END ) ) line_count <= 0;
else if ( pix_count == LINE_END ) line_count <= line_count + 1;
// synhroimpulse
if (SynRes[1] & ~SynRes[0]) begin vga_hsync <=0; vga_vsync<=0; end
if(pix_count== HSYNC_START)vga_hsync <= SYNC_ON;else if (pix_count==HSYNC_END)vga_hsync<=SYNC_OFF;
if(line_count== VSYNC_START)vga_vsync <= SYNC_ON;else if (line_count==VSYNC_END)vga_vsync<=SYNC_OFF;
if (SynRes[1] & ~SynRes[0]) v_addr <=0;// or this: if (SynRes[1:0] == 2'b10)

if ( pix_count < H_ACTIV ) pix_x <= pix_count; else pix_x <= 0;
if ( line_count < V_ACTIV) pix_y <= line_count; else pix_y <= 0;
//disp_enable <= ~((pix_count < 800) & (line_count < 600));
disp_enable <= ((pix_count < H_ACTIV) & (line_count < V_ACTIV));
if(disp_enable)v_addr <= ((pix_y*H_ACTIV)+pix_x);


end


assign data_out = vram[v_addr];

endmodule

RTL

https://c.radikal.ru/c39/1909/f5/046c76d48c94t.jpg (https://radikal.ru/big/b9tshemlit5rv)

HardWareMan
27.09.2019, 19:22
Ааа, ну вообще-то я конкретно указал, что инверсия. Для disp_enable надо убрать инверсию.

dosikus
27.09.2019, 20:18
Осталось решить соответствие pix_x - v_addr.


https://a.radikal.ru/a33/1909/ce/132c514059b4.png (https://radikal.ru)

https://a.radikal.ru/a01/1909/db/081a492879f5.png (https://radikal.ru)

omercury
28.09.2019, 12:40
Счас так:
Чего НЕ вижу - отсутствует blank, т.е. не будет привязки к уровню черного, да и гашения видеосигнала тоже.
Чего вижу - регистры pix_x и pix_y. Зачем они?


Осталось решить соответствие pix_x - v_addr.
На счетчик адреса у тебя всё равно отдельный регистр v_addr, ну так его по НЕ_бланку и инкременируй.
На 1 такт раньше LINE_END, в дальнейшем будет на 2, так как тебе ещё знакогенератор читать.
В результате у тебя добавятся 2 флага:
1 - разрешение инкремента счётчика адреса, он же открывает доступ к видеопамяти;
2 - blank
blank отстаёт от первого (сейчас) ровнёхонько на 1 такт, проще сделать просто задержку на триггере, чтоб не плодить компараторы.

- - - Добавлено - - -

Вероятно я хреново объясняю...

Неприятность в том, что у тебя происходит задержка счёта адреса относительно развёртки. Вот здесь:
первый такт

disp_enable <= ((pix_count < H_ACTIV) & (line_count < V_ACTIV));//строка 56
второй такт

if ( pix_count < H_ACTIV ) pix_x <= pix_count; else pix_x <= 0;//строка 53
трерий такт

if(disp_enable)v_addr <= ((pix_y*H_ACTIV)+pix_x);// строка 57
Если считать с нуля и использовать счётчики развёрток, то задержка будет всегда.

Ты хочешь видеопамять линейную, то есть с 0 до 799 строка 1, а с 800 до 1599 строка 2 и т.д. Это пожалуйста, это сколько угодно.
У тебя счетчик адреса видеопамяти отдельный и нет никакого смысла привязываться к счетчикам синхросигналов.
Также нет никакого смысла начинать растр сразу с видеоданных, более того, это неприятно ещё и тем, что когда счётчик строк используется в формировании адреса видеопамяти, то первая строка растра остаётся без преамбулы (для спека это бордюр), приходится немного "колдовать", чтоб это выправить - инкремент счетчика строк делать в определённом месте.
Сейчас у тебя горизонтальный счётчик по первому варианту на картинке, чтобы не вывихивать моск при расчётах, я бы сдвинул растр как во втором или в третьем варианте, тогда не надо будет колдовать с разрядностью парамов/локалпарамрв так как не будет отрицательных значений в расчётах и будет проще забить координаты всех синхросигналов в автомат.

dosikus
28.09.2019, 15:45
omercury, Да не, все нормально объясняешь,
просто вчера немного позволил , продолжу только в понедельник.
Спасибо вам всем, начинаю уже въезжать...

HardWareMan
28.09.2019, 16:40
Если считать с нуля и использовать счётчики развёрток, то задержка будет всегда.
Если все сигналы на выводе будут иметь эту задержку, то в итоге этой задержки как бы и нет. По ресурсам дешевле задержать какой-нибудь однобитный сигнал, чем выёживаться с условиями других. Нужно просто иметь представление о цели, которую тебе нужно достичь а решение само нарисуется естественным путём, вот и всё. Если говорить за другие системы, то PPU от Денди вообще то, что считал из памяти выводит с задержкой на 8 точек. Но из-за грамотной позиции синхроимпульсов относительно растра телевизор все подравнивает и получается красиво. Надеюсь, понятно какую мысль я хочу донести?

omercury
28.09.2019, 19:15
Надеюсь, понятно какую мысль я хочу донести?
Надеюсь.

Картинка достаточно красивая?

https://c.radikal.ru/c40/1909/cb/aae3d20ae314t.jpg (https://radikal.ru/big/1n4r24hdau48c)

Дефайнами выбрать желаемое разрешение (сейчас стоит 640х480, оно же по умолчанию, если закомментить все дефайны),
параметр DelayX задаёт упреждение чтения памяти относительно растра (положительное число, сейчас 1 такт),
параметр MovSSI сдвигает весь растр влево/вправо (отрицательное/положительное число, сейчас без сдвига).
Тактовую для синхрогенератора и HDMI установит само, для этого надо подключить к проекту вложенную PLL.
Для циклона 4, входная частота 50МГц.

HardWareMan
28.09.2019, 21:26
omercury,
https://s.fishki.net/upload/users/2018/05/13/1048171/b5af27e6b3190f57bcba186cdc6cc29f.gif

dosikus
05.10.2019, 10:46
omercury, Пришлось отложить все до выходных -на работе был завал .

Прикрутил к своему топу на VHDL, выставил 800х600.
В настройках vpll - вижу - c0 540MHz , с1 -108MHz , - где я напортачил?



https://a.radikal.ru/a29/1910/df/6f94fd76192c.png (https://radikal.ru)

https://b.radikal.ru/b04/1910/ff/b9e8097e7de2.png (https://radikal.ru)


Топ такой:



library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;


entity test_top is
port(
-- master clock 50.0 MHz
CLK_50MHZ : in std_logic;

-- HDMI
TMDS : out std_logic_vector(7 downto 0);

-- USB Host (VNC2-32)
USB_NRESET : in std_logic);



end test_top;

architecture rtl of test_top is

signal reset : std_logic;
signal areset : std_logic;
signal locked0 : std_logic;

signal clk_vga : std_logic;
signal clk_tmds : std_logic;
signal clk_spi : std_logic;

signal vga_hsync: std_logic;
signal vga_vsync: std_logic;
signal vga_blank : std_logic;
signal vga_r : std_logic_vector(7 downto 0);
signal vga_g : std_logic_vector(7 downto 0);
signal vga_b : std_logic_vector(7 downto 0);

signal vga_out : std_logic_vector(7 downto 0);

signal hcnt : std_logic_vector(11 downto 0) := "000000000000"; -- horizontal pixel counter
signal vcnt : std_logic_vector(11 downto 0) := "000000000000"; -- vertical line counter
signal shift : std_logic_vector(7 downto 0);

signal px_y : std_logic_vector(9 downto 0);
signal px_x : std_logic_vector(9 downto 0);
signal vaddr : std_logic_vector(19 downto 0);



component vga_sync
port (

clk_in : in std_logic; -- Input 25.175 MHz clock, this is a pixel clock for this VGA mode


picselclock : out std_logic; -- Output horizontal sync signal
hdmi_clock : out std_logic; -- Output vertical sync signal

vga_hsync : out std_logic; -- Output horizontal sync signal
vga_vsync : out std_logic; -- Output vertical sync signal

disp_enable: out std_logic; -- Set when a writable portion of display is enabled:


v_addr : out std_logic_vector(7 downto 0)
);
end component;


begin





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 => not vga_hsync,
I_VSYNC => not vga_vsync,
I_BLANK => not vga_blank,
I_RED => vga_out(7 downto 5)& vga_out(7 downto 5)& vga_out(7 downto 6),
I_GREEN => vga_out(4 downto 2) & vga_out(4 downto 2)& vga_out(4 downto 3),
I_BLUE => vga_out(1 downto 0) & vga_out(1 downto 0)& vga_out(1 downto 0)& vga_out(1 downto 0),
I_AUDIO_PCM_L => "0000000000000000",
I_AUDIO_PCM_R => "0000000000000000",
O_TMDS => TMDS);



VGA_SYN: vga_sync
port map(
clk_in =>CLK_50MHZ,
picselclock => clk_vga,
hdmi_clock => clk_tmds,
vga_hsync => vga_hsync,
vga_vsync => vga_vsync,
disp_enable => vga_blank,
v_addr =>vga_out
);



end rtl;



- - - Добавлено - - -

UP , ставлю 640х480 - настройки PLL не меняются , те же 540 и 108...


И еще - где в Quartus выбирается кодировка? Все комменты на кириллице пох***ись...

omercury
05.10.2019, 11:15
В настройках vpll - вижу - c0 540MHz , с1 -108MHz , - где я напортачил?
Пересохранил и убил все параметры. Верни v_pll.v в исходное состояние и больше визардом его не открывай.

Просто наводи мыша на нужный модуль в проект навигаторе и увидишь все параметры.
https://b.radikal.ru/b02/1910/68/589c3ee4d089.jpg (https://radikal.ru)

dosikus
05.10.2019, 11:19
Вон оно как ...

omercury
05.10.2019, 11:22
И еще - где в Quartus выбирается кодировка? Все комменты на кириллице пох***ись...
Не нашлось такого.
Если переоткрытие файла не помогает, открой блокнотом (я обычно пользуюсь Notepad++), скопируй в русской раскладке и вставь в Квартус обязательно в русской раскладке.
enjoy

dosikus
05.10.2019, 12:07
Облом, нет ни изображения ни синхро.

Отбой, все шЫкарно.
Забыл disp_enable проинвертировать.
Засел переписывать топ на верилог...

Но вопрос - v_pll_bb.v лишнее?

omercury
05.10.2019, 14:24
Облом, нет ни изображения ни синхро.

Отбой, все шЫкарно.
Забыл disp_enable проинвертировать.

вот и я думаю...
https://c.radikal.ru/c37/1910/fe/84a5c447092f.jpg (https://radikal.ru)



Но вопрос - v_pll_bb.v лишнее?
В принципе, да.
Его визард по-умолчанию предлагает создать)))

dosikus
05.10.2019, 15:08
Хочу пока задействовать vaddr для выхлопа на HDMI (пока без памяти) как в VHDL:

I_RED => vga_out(7 downto 5)& vga_out(7 downto 5)& vga_out(7 downto 6),
I_GREEN => vga_out(4 downto 2) & vga_out(4 downto 2)& vga_out(4 downto 3),
I_BLUE => vga_out(1 downto 0) & vga_out(1 downto 0)& vga_out(1 downto 0)& vga_out(1 downto 0),

Как мне соединить выход v_addr с входами RGB - ругается что-то насчет неупакованного массива.



module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS

);


wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
reg vaddr[7:0];


vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr[7:0])
);


hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
//.I_RED (8'b11111111),
.I_RED <=vaddr,
.I_GREEN (1'b0),
.I_BLUE (1'b0),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);



endmodule

omercury
05.10.2019, 15:25
I_RED => vga_out(7 downto 5)& vga_out(7 downto 5)& vga_out(7 downto 6),
I_GREEN => vga_out(4 downto 2) & vga_out(4 downto 2)& vga_out(4 downto 3),
I_BLUE => vga_out(1 downto 0) & vga_out(1 downto 0)& vga_out(1 downto 0)& vga_out(1 downto 0),
assign I_RED = {vga_out[7:5], vga_out[7:5], vga_out[7:6]};
assign I_GREEN = {vga_out[4:2], vga_out[4:2], vga_out[4:3]};
assign I_BLUE = {vga_out[1:0], vga_out[1:0], vga_out[1:0], vga_out[1:0]};



ругается что-то насчет неупакованного массива
...
reg vaddr[7:0];

Гы..!
wire

dosikus
05.10.2019, 15:57
omercury, туплю, помоги :

module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS

);


wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire vaddr[7:0];


vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);




hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
//.I_RED (8'b11111111),
.I_RED (),
.I_GREEN (),
.I_BLUE (),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);

assign I_RED = { vaddr[7:5], vaddr[7:5], vaddr[7:6]};
assign I_GREEN = { vaddr[4:2], vaddr[4:2], vaddr[4:3]};
assign I_BLUE = { vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]};

endmodule




Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(56): created implicit net for "I_RED"
Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(57): created implicit net for "I_GREEN"
Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(58): created implicit net for "I_BLUE"
Error (10044): Verilog HDL error at vga_gen.v(30): expression cannot reference entire array "vaddr"
Error (10048): Verilog HDL error at vga_gen.v(30): values cannot be assigned directly to all or part of array "vaddr" - assignments must be made to individual elements only
Error (10133): Verilog HDL Expression error at vga_gen.v(56): illegal part select of unpacked array "vaddr"
Error (10133): Verilog HDL Expression error at vga_gen.v(57): illegal part select of unpacked array "vaddr"
Error (10133): Verilog HDL Expression error at vga_gen.v(58): illegal part select of unpacked array "vaddr"
Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 5 errors, 3 warnings
Error: Peak virtual memory: 4622 megabytes
Error: Processing ended: Sat Oct 05 15:42:10 2019
Error: Elapsed time: 00:00:09
Error: Total CPU time (on all processors): 00:00:09
Error (293001): Quartus II Full Compilation was unsuccessful. 7 errors, 3 warnings



- - - Добавлено - - -

Мда , досадная ошибка из-за невнимательности ...

Надо
wire [7:0] vaddr;

а не

wire vaddr[7:0];

omercury
05.10.2019, 16:10
туплю

module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS

);


wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire vaddr[7:0];


vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);




hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
//.I_RED (8'b11111111),
.I_RED (I_RED ),
.I_GREEN (I_GREEN),
.I_BLUE (I_BLUE),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);

wire [7:0] I_RED = { vaddr[7:5], vaddr[7:5], vaddr[7:6]};
wire [7:0] I_GREEN = { vaddr[4:2], vaddr[4:2], vaddr[4:3]};
wire [7:0] I_BLUE = { vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]};

endmodule

Цвета не подключил.

Что ж так тормозит-то?

dosikus
05.10.2019, 16:12
Угу и это то же.
Вообщем счас так :




module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS

);


wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire [7:0] vaddr;


vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);




hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
.I_RED ({ vaddr[7:5], vaddr[7:5], vaddr[7:6]}),
.I_GREEN ({ vaddr[4:2], vaddr[4:2], vaddr[4:3]}),
.I_BLUE ({ vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]}),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);



endmodule


Можно продолжать...

omercury
05.10.2019, 16:23
Шрифт ещё не подбирал?

dosikus
05.10.2019, 16:38
Даже не знаю.
Какой посоветуешь?

- - - Добавлено - - -




Что ж так тормозит-то?

Ты про меня :) или про форум?

Я честно говоря думал на работе тормоза, ан нет и дома. Так что с форумом в самом деле что -то не так...

omercury
05.10.2019, 16:43
Да любой, какой понравится, с красотой в 8х16 особо не развернёшься.
16х16 можно, 50 символов в строке тебе хватит?
Тогда можно и покрасивше подбирать. :)


:) или про форум?

Через модем его чтоль подключили?

dosikus
05.10.2019, 18:52
16х16 можно, 50 символов в строке тебе хватит?
Тогда можно и покрасивше подбирать. :)


Угу ...

- - - Добавлено - - -

Копипаст с нотепада++ прокатывает только до сохранения , дальше так же .
Плюнул, камменты english only, forever ...

- - - Добавлено - - -

HardWareMan, Вот RTL :

https://d.radikal.ru/d22/1910/6c/a2f99c93124dt.jpg (https://radikal.ru/big/4klofos7as1ww)

HardWareMan
05.10.2019, 20:21
dosikus, ты его не мне показывай. Ты его сам научись правильно считывать.

dosikus
05.10.2019, 20:52
HardWareMan, в смысле читать /понимать?

HardWareMan
05.10.2019, 21:12
dosikus, да, и самое главное - делать выводы. Оно потом как положительная обратная связь начинает работать. Как давно сказал кто-то из моих знакомых: сначала программист развивает программу, а потом программа развивает программиста.

dosikus
06.10.2019, 09:17
omercury, так как визард тыкать неззя, а нам нужна тактовая и сброс на 8051 , правильно ли я понимаю :



Редактируем v_pll :
Было


module v_pll #(parameter mul1 = 5, mul2 = 1, div1 = 2, div2 = 2)
(
inclk0,
c0,
c1);

input inclk0;
output c0;
output c1;

wire [4:0] sub_wire0;
wire [0:0] sub_wire5 = 1'h0;
wire [1:1] sub_wire2 = sub_wire0[1:1];
wire [0:0] sub_wire1 = sub_wire0[0:0];
wire c0 = sub_wire1;
wire c1 = sub_wire2;
wire sub_wire3 = inclk0;
wire [1:0] sub_wire4 = {sub_wire5, sub_wire3};

altpll altpll_component (
.inclk (sub_wire4),
.clk (sub_wire0),

.locked (),

.vcooverrange (),
.vcounderrange ());
Стало

module v_pll #(parameter mul1 = 5, mul2 = 1, mul3=2, div1 = 2, div2 = 2, div3=1)
(
inclk0,
c0,
c1,
c2,
locked);

input inclk0;
output c0;
output c1;
output c2;
output locked;

wire [4:0] sub_wire0;
wire [0:0] sub_wire5 = 1'h0;
wire [2:2] sub_wire6 = sub_wire0[2:2];
wire [1:1] sub_wire2 = sub_wire0[1:1];
wire [0:0] sub_wire1 = sub_wire0[0:0];
wire c0 = sub_wire1;
wire c1 = sub_wire2;
wire c2 = sub_wire6;

wire sub_wire3 = inclk0;
wire [1:0] sub_wire4 = {sub_wire5, sub_wire3};

altpll altpll_component (
.inclk (sub_wire4),
.clk (sub_wire0),

.locked (locked),

.vcooverrange (),
.vcounderrange ());

omercury
06.10.2019, 19:59
omercury, так как визард тыкать неззя

dosikus, смотреть-то никто не запрещал. :)

Создай новую PLL, открой блокнотом и посмотри разницу.
Там всё просто, разберёшься с ходу.

Какая частота-то нужна?
Ты сделал 100МГц.



Или другой вариант - заюзай вторую PLL, благо у тебя их 4 штуки.
И меньше 4 всё равно не будет.)))

dosikus
06.10.2019, 21:19
Да, все получилось , да 100MHz. Правда пришлось еще в alt_pll дефпараметр править.

JV-Soft
09.10.2019, 18:07
Вопрос , epm3256aqc208 толерантна к 5в. или надо резисторы ставить ? Например в pdf по xilinx четко пишут толерантность.
Еще вопрос ,кто нибудь прикручивал SDRAM 100мгц через плис к медленным проектам типа спектрума , где не быстрое асинхронная работа память+проц ?

fifan
09.10.2019, 18:33
Если вывод работает на вход, то резистор по 300 ом необходим, на вывод - не нужен.

omercury
09.10.2019, 22:21
Еще вопрос ,кто нибудь прикручивал SDRAM 100мгц через плис к медленным проектам типа спектрума , где не быстрое асинхронная работа память+проц ?
Разумеется, да.

Например, знаменитая корка Влада от ReVerSe_xx
Но, есть нюанс...

1. На Z80 катит, ибо есть аппаратный рефрешь;
2. На Z80 катит, ибо цикл чтения/записи занимает более 1 такта ЦП;
3. Не используется с экранной памятью, ибо дОлжно соблюдать жесткие тайминги;
4. Если цикл обращения к памяти уже запущен, новое обращение будет проигнорировано (вероятнее всего), ибо нет буферизации (на внедрение которой некоторые пользователи высказывают своё "фи" - дескать расточительное использование ресурсов).

Посему - что надо-то:
Какой проц?
Какая ожидается тактовая?

100МГц - это уже CL-3, а значит 8 тактов SDRAM на цикл рандомного чтения/записи/рефреша.
С буферизацией входа + выхода =8+1+1 тактов на цикл, отсюда и рассчитывать тактовую контроллера.

JV-Soft
09.10.2019, 23:12
Посему - что надо-то:
Какой проц?
Какая ожидается тактовая?
Сейчас под амигу пилю память , и думается что бы не выискивать раритетные одночиповые fpm/edo ,применить sdram pc100 ,она 3.3в. и чип мне подходящий 8мб x 16 , частоты от 7мгц до 33мгц , режим пока асинхронный , но если надумаю 68030 проц то может и синхронный.

HardWareMan
10.10.2019, 06:26
100МГц - это уже CL-3
Откуда такая уверенность? Есть память и 133МГц CL2. Или речь за конкретную микросхему?

bigral
18.10.2019, 18:56
Если вывод работает на вход, то резистор по 300 ом необходим, на вывод - не нужен.

Это откуда такие требования? Я поставил тут epm3064atc100 без всяких резисторов подал шину данных подтянутую к 5в, уже "мучу" микруху экспериментами долго, но все еще работает и даже не греется. То может для MAX-II такое надо?

- - - Добавлено - - -


100МГц - это уже CL-3, а значит 8 тактов SDRAM на цикл рандомного чтения/записи/рефреша.
С буферизацией входа + выхода =8+1+1 тактов на цикл, отсюда и рассчитывать тактовую контроллера.

я в sdram вообще не шарю, расшифруйте для меня что это значит? неужели что 100/(8+1+1) = 10mhz максимум при "эмуляции sram"?

IanPo
18.10.2019, 21:35
Как работает SDRAM:
http://www.dsioffe.narod.ru/mysdram/MyMicronSDRAM.htm

Цикл обращения к SDR SDRAM состоит из нескольких тактов, в зависимости от параметров чипа и длины очереди.
У Speccy-2010 вроде 1/(14 МГц), можно посмотреть в исходниках.
Мин. цикл обращения tRC - обычно не менее 60 нс (у SDR).

JV-Soft
19.10.2019, 08:16
Это откуда такие требования? Я поставил тут epm3064atc100 без всяких резисторов подал шину данных подтянутую к 5в, уже "мучу" микруху экспериментами долго, но все еще работает и даже не греется. То может для MAX-II такое надо?
Входы epm3064atc100 рассчитаны на 5в. , ничего ставить не надо.
The output drivers of all
MAX 3000A devices can be set for 2.5 V or 3.3 V, and all input pins are
2.5–V, 3.3–V, and 5.0-V tolerant, allowing MAX 3000A devices to be used
in mixed–voltage systems.

dosikus
19.10.2019, 11:42
Или другой вариант - заюзай вторую PLL, благо у тебя их 4 штуки.
И меньше 4 всё равно не будет.)))

Временно пришлось завязать, на работе случился переезд в другое помещение, а оно всегда хуже пожара .
смогу пока только в выходные и то если смогу, ибо с внуком сижу.


Сделал как ты пишешь, оставил твой синхрогенератор с твоим PLL и добавил свою PLL.
Готов продолжать, огромное спасибо за помощь...

omercury
21.10.2019, 20:48
случился переезд
А, фигня.
Я тоже был "не в кондиции" - днюха. ;)

dosikus
22.10.2019, 16:16
omercury, Поздравляю!!! Всего, всего,всего!!!

JV-Soft
03.11.2019, 15:29
Вопрос , формирование адресов для DRAM на verilog (xilinx).
После компиляции ma10 и ma11 всегда сидят на земле , от чего так ?

A1-A22 адреса проца , ma0-ma11 адреса на DRAM


begin if( mux_switch==0 )
ma[11:0] <= A[22:11];
else // mux_switch==1
ma[9:0] <= A[10:1];
ma[11:10] <= 2'b0;
end

HardWareMan
03.11.2019, 18:11
Вопрос , формирование адресов для DRAM на verilog (xilinx).
После компиляции ma10 и ma11 всегда сидят на земле , от чего так ?

A1-A22 адреса проца , ma0-ma11 адреса на DRAM


begin if( mux_switch==0 )
ma[11:0] <= A[22:11];
else // mux_switch==1
ma[9:0] <= A[10:1];
ma[11:10] <= 2'b0;
end

Потому, что надо делать begin/end если в условии более одного оператора, прямо как и в других языках.

begin if( mux_switch==0 )
ma[11:0] <= A[22:11];
else begin// mux_switch==1
ma[9:0] <= A[10:1];
ma[11:10] <= 2'b0;
end
end
Ну ещё можно объединить в ma[11:0] = {2'b0,A[10:1]}

JV-Soft
03.11.2019, 18:57
Потому, что надо делать begin/end если в условии более одного оператора, прямо как и в других языках.
Да, верно.
Может так каноничнее и лаконичнее ?


begin
case(mux_switch)
1'b0: ma[11:0] <= A[22:11];
1'b1: ma[11:0] <= {2'b0,A[10:1]};
endcase
end

HardWareMan
04.11.2019, 06:15
JV-Soft, как уже было сказано ранее, кейсы это для слабаковпрограммистов, каких-либо преимуществ перед другими способами он не даёт.

JV-Soft
04.11.2019, 06:31
Пофиг , я не программист я любитель , количество букв меньше , уже приятнее для глаз. Учитывая что про верилог я ещё недавно вообще и не слышал.

HardWareMan
04.11.2019, 10:41
Ну тогда в кейсах ты можешь использовать и именованные константы, тогда вообще по феншую читабельности и самокомментирования будет. Но не забывай, что даже в кейсе действует правило begin/end для множественных команд, но так же работает правило множественных состояний (несколько констант на 1 блок), как в С.

SegaBoy
04.11.2019, 11:46
Пофиг , я не программист я любитель , количество букв меньше , уже приятнее для глаз. Учитывая что про верилог я ещё недавно вообще и не слышал.
Если речь про меньше букв, то изначальный код без кейсов так же можно свести всего к двум строчкам и begin/end не нужны.


if (mux_switch) ma[11:0] <= {2'b0,A[10:1]};
else ma[11:0] <= A[22:11];

HardWareMan
04.11.2019, 12:49
Вот именно. При этом, соберется нормальная бинарная схема без излишков.

Bolt
05.11.2019, 01:15
А скажите, вот так считается нормально, или фу?


always @(*)
begin
// вся комбинаторика
end

always @(posedge clk)
begin
// в регистры пишем выходы комбинаторики
end

Сейчас сам не могу врубиться что у меня на каком такте происходит и как это описать. Так, вроде, проще.

HardWareMan
05.11.2019, 06:57
Прямую комбинаторику не обязательно оборачивать в always блок. Достаточно описать каждый сигнал через assign. Но то, что такие вещи надо группировать - это правильная идея. Где это может быть полезно? Ну, например, если тебе надо в синхронный триггер загружать выход мультиплексора. Мультиплексор проще и понятнее всего описывается в комбинаторике и формирует сигнал типа wire, который ты и присваиваешь синхронному триггеру. Заметно читаемее чем описание мультиплексора внутри always блока. И в RTL он будет таким, как если бы был в обычной схеме.

Bolt
05.11.2019, 08:26
Значит я на правильном пути.
Описываю в always из-за сложной и до конца ещё не продуманной логики. Для эксперимента проще налепить if-ов, потом распутывать, если заработает как надо.
Тяжело после ассемблера мозги в сторону HDL разворачивать. Уже и на бумаге схемы рисую, всё равно в тактах путаюсь, что будет происходить до фронта, и что после. А если ещё учесть то, что схема должна работать на упреждение, как бы предсказывая что будет на следующем такте... брррр :)

HardWareMan
05.11.2019, 09:09
Bolt, всегда смотри в RTL.

Bolt
05.11.2019, 09:39
И в RTL смотрю, и в post-map/post-fit, и даже в timing analyzer наносекуды считаю.

А как описать двухпортовую память с портами разной ширины? Сейчас у меня она описана как две 8-битных с выбором по младшему биту адреса, а запись с 16-битного порта выполняется побайтно во второй порт обеих. На выходе получается мультиплексор для данных, а это лишние наносекунды. Вроде это есть аппаратно, но добиться в RTL желаемого результата так и не смог.

Bolt
06.11.2019, 06:00
Разобрался почему не получалось, я слишком много хотел от блока M9K, он такое не умеет. Один порт может одновременно или читать, или писать, а в режиме "simple dual port", в котором можно в одном такте и читать, и писать, просто используются оба порта.

HardWareMan
06.11.2019, 07:08
Bolt, такие вещи обычно в букваре описаны, стало быть там их и надо искать изначально.

Bolt
06.11.2019, 13:38
HardWareMan, буквари читал, но пока в голове не щёлкнуло "в режиме simple dual port используются оба физических порта", почему-то считал что адресных входов 4.

SegaBoy
06.11.2019, 17:19
Bolt, а какая вообще стоит задача для двух-портовой памяти и почему режим обязательно simple?

Bolt
06.11.2019, 17:37
Это кэш. С одной стороны с памятью работает процессор, с другой обмен с SDRAM. На разных частотах.

Simple не нужен, он меня с толку сбил. В этом режиме можно и читать, и писать на одном такте по разным адресам, ну я и решил что оба порта такие.

SegaBoy
06.11.2019, 17:49
Ну так всё получилось или что-то не работает?

Bolt
06.11.2019, 18:00
Ну, оно пока ещё не получилось, в смысле не написано полностью, но теперь понятно в чём была ошибка и как надо делать.

dosikus
11.11.2019, 11:56
Binary и hex в понимании Verilog'а это немного другое.
Binary это текст 000 001 010 010...
Hex это текст 5A 00 FE D8...


А VHDL оказывается может хекс грузить ...
Вот у vlad посмотрел в DIVGMX


altsyncram_component : altsyncram
GENERIC MAP (
address_aclr_a => "NONE",
clock_enable_input_a => "BYPASS",
clock_enable_output_a => "BYPASS",
init_file => "../../rom/test128k.hex",
intended_device_family => "Cyclone III",
lpm_hint => "ENABLE_RUNTIME_MOD=NO",
lpm_type => "altsyncram",
numwords_a => 16384,
operation_mode => "ROM",
outdata_aclr_a => "NONE",
outdata_reg_a => "CLOCK0",
widthad_a => 14,
width_a => 8,
width_byteena_a => 1
)
PORT MAP (
address_a => address,
clock0 => clock,
q_a => sub_wire0
);

Может и верилог так же может?

SegaBoy
11.11.2019, 13:23
Может и верилог так же может?
Может. На верилоге можно и .hex и .mif грузить

omercury
11.11.2019, 23:17
Может и верилог так же может?
Зайди в мегавизард и создай ROM. Там будет и загрузка mif/hex ближе к концу.
В RAM, кстати, тоже можно.
А ещё, возможно, тебя заинтересует мегафункция AltAsmi Parallel.

dosikus
12.11.2019, 09:12
А ещё, возможно, тебя заинтересует мегафункция AltAsmi Parallel.

Это доступ к конфигурационной флэшке, с выхлопом на параллельную шину?

У меня тут все снова уперлось в SDRAM реверса...
Пока шерстил корки реверса и подобное - на тему "как прикрутить SDRAM и сделать выхлоп на OSD" ,
наткнулся на ZPU Flex.
Начитался ужасов на развертывании тулчайна под линухом( сам недавно танцевал при установке тулчайна на ESP8266),
плюнул и развернул все под виндой. Все заколосилось.

Напрягает только одно - что у light52 что у ZPU Flex мрачный геморрой с прикручиванием прошивки в проект.
У первого тулза на питоне , у второго на Си ....

omercury
12.11.2019, 23:49
Это доступ к конфигурационной флэшке, с выхлопом на параллельную шину?
Как частный случай, да.
А вообще, доступ к любой 25 флешке, подключенной к любым выводам, с выхлопом на параллельную шину.

dosikus
14.11.2019, 15:49
omercury, Касательно SDRAM, вот это на моей борде заработает? https://github.com/stffrdhrn/sdram-controller
Память hy57v561620

JV-Soft
21.11.2019, 21:37
В xilinx вывод pin INOUT можно сделать как clock ? Что то он в timing cinstraint видится только как оutput

AlexG
22.11.2019, 00:40
В xilinx надо смотреть на свойства конкретного вывода. Обычно (практически всегда) вывод плисы для входного clok'a "выделен". Другими словами на "inout обычный" входной тактовый сигнал крайне не рекомендуется подвать. Тактовый подают на вывод который есть MCLK или SCLK (примерные названия).
ПС: ise или vivado ?

JV-Soft
22.11.2019, 01:39
AlexG, ise , она такие маневры видимо не любит с inout на тактовой входе , задумка была такая - есть общий генератор ,например 50мгц , плис делит его например на 2 , и эти 25 МГц надо вывести из плис на тактовую проца но и в плисине этот сигнал должен остаться как тактовый , вот думал таким образом пролезет использование тактового пина на inout

Bolt
22.11.2019, 04:38
JV-Soft, не знаю как в Xilinx, но в Altera такое запросто. "Половинной" частотой управляется контроллер SDRAM, и она же выведена на inout для микросхемы.

JV-Soft
22.11.2019, 07:42
Bolt, и этот вывод глобальный клок ?

AlexG
22.11.2019, 09:02
AlexG, ise , она такие маневры видимо не любит с inout на тактовой входе , задумка была такая - есть общий генератор ,например 50мгц , плис делит его например на 2 , и эти 25 МГц надо вывести из плис на тактовую проца но и в плисине этот сигнал должен остаться как тактовый , вот думал таким образом пролезет использование тактового пина на inout
Дык вы ж не сказали что хотите "выход тактовой".
тактовую подают на спец вход MCLK, в самой плисе клок идёт на "pll", там оная частота умножается/делится и "пучёк" разных тактовых раздаётся "нуждающимся", можно вывести на любой выход плис (который может быть выходом). и не забываем что оная тактовая может иметь "случайную" фазу.

OrionExt
22.11.2019, 09:52
В xilinx вывод pin INOUT можно сделать как clock ? Что то он в timing cinstraint видится только как оutputКурите доку на свой чипс в разделе - Clock and PLL Pins.

Bolt
22.11.2019, 13:02
Bolt, и этот вывод глобальный клок ?
Нет, что первое попалось :)

К AlexG добавлю.
Тактовые пины и шины имеют меньшую задержку. Правильнее делать через выделенные, но можно и на обычных, просто надо учитывать что это может не пройти по задержкам и частотам. Анализатор у меня пишет 110 МГц, SDRAM на 75 работает. Для "видеокарты" вообще сложным счётчиком делаю тактовую 25.175 из 100. А с процессора идёт своя синхронизация CPU_PHI, которую завёл тоже на первый попавшийся.

julbu
14.02.2020, 23:51
Привет всем. Пробую сделать rom-картридж (не спрашивайте зачем :) ), аналог ZXC2 http://www.fruitcake.plus.com/Sinclair/Interface2/Cartridges/Interface2_RC_ZXC2.htm
Идея такая, выдаем на спек 0 на ресет (что все шины Z80 перешли в высокоимпедансное состояние), и с SD карты записываем в микросхему SRAM бинарник от картриджа, посредством микроконтроллера. Адрес записи для SRAM (128кБ) формируем 17 разрядным счетчиком на ПЛИС, посредством сигналов clock и clear от микроконтроллера. После записи, переводим шину данных контроллера в высокоимпедансное состояние и снимаем ресет со спека. При условии сигнала ресет в 1 логика должна работать как в оригинальном картридже. Данные в SRAM пишутся стабильно, при отладке сливал дамп со SRAM по юсарту и сравнивал с исходным бинарником, все ок. Но вот при состоянии ресет в 1, в "железе" не работает. Где то я тут напортачил (это первый мой код на VDHL :D ), прога компилируется без ошибок, но с кучей варнингов. Похоже я не очень понимаю суть оператора Process. Помогите разобраться пожалуйста.


library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity ram_vdhl is
port
(
clock : in std_logic;
clear : in std_logic;
a_ram_l : inout std_logic_vector(13 downto 0);
a_ram_h : out std_logic_vector(2 downto 0);
reset : in std_logic;
mreq : in std_logic;
ce_mcu : in std_logic;
oe_mcu : in std_logic;
romcs : out std_logic;
oe_ram : out std_logic;
ce_ram : out std_logic;
a14_zx : in std_logic;
a15_zx : in std_logic
);
end ram_vdhl;

architecture ram_vdhl_arc of ram_vdhl is

signal count: std_logic_vector(16 downto 0):= (others => '0');
signal zxc: std_logic_vector(5 downto 0):= (others => '0');
signal oe: std_logic;
signal adr: std_logic;
signal clk: std_logic;

begin

A:process (clock, clear)
begin
if clear = '1' then
count <= (others => '0');
elsif (rising_edge(clock)) then
count <= count +1;
end if;
end process;

B:process (reset)
begin
if reset = '1' then
a_ram_l(13 downto 0) <= "ZZZZZZZZZZZZZZ";
oe <= (a14_zx or a15_zx or mreq);
adr <= not (a_ram_l(6) and a_ram_l(7) and a_ram_l(8) and a_ram_l(9) and a_ram_l(10) and a_ram_l(11) and a_ram_l(12) and a_ram_l(13));
clk <= not (oe or adr or zxc(0));
oe_ram <= oe;
a_ram_h(0) <= zxc(3);
a_ram_h(1) <= zxc(1);
a_ram_h(2) <= zxc(5);
ce_ram <= zxc (4);
romcs <= zxc (4);
else
a_ram_l <= count(13 downto 0);
a_ram_h <= count(16 downto 14);
oe_ram <= oe_mcu;
ce_ram <= ce_mcu;
end if;
end process;

C:process (clk)
begin
if (rising_edge(clk)) then
zxc(0) <= a_ram_l(5);
zxc(1) <= a_ram_l(1);
zxc(2) <= a_ram_l(3);
zxc(3) <= a_ram_l(0);
zxc(4) <= a_ram_l(4);
zxc(5) <= a_ram_l(2);
end if;
end process;
end ram_vdhl_arc;


Варининги



Info: ************************************************** *****************
Info: Running Quartus II 32-bit Analysis & Synthesis
Info: Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
Info: Processing started: Fri Feb 14 23:09:04 2020
Info: Command: quartus_map --read_settings_files=on --write_settings_files=off RAM_VDHL -c RAM_VDHL
Warning (20028): Parallel compilation is not licensed and has been disabled
Info (12021): Found 2 design units, including 1 entities, in source file ram_vdhl.vhd
Info (12022): Found design unit 1: ram_vdhl-ram_vdhl_arc
Info (12023): Found entity 1: ram_vdhl
Info (12127): Elaborating entity "RAM_VDHL" for the top level hierarchy
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(47): signal "a14_zx" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(47): signal "a15_zx" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(47): signal "mreq" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(48): signal "a_ram_l" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(49): signal "oe" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(49): signal "adr" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(49): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(50): signal "oe" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(51): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(52): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(53): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(54): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(55): signal "zxc" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(57): signal "count" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(58): signal "count" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(59): signal "oe_mcu" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10492): VHDL Process Statement warning at RAM_VDHL.vhd(60): signal "ce_mcu" is read inside the Process Statement but isn't in the Process Statement's sensitivity list
Warning (10631): VHDL Process Statement warning at RAM_VDHL.vhd(43): inferring latch(es) for signal or variable "oe", which holds its previous value in one or more paths through the process
Warning (10631): VHDL Process Statement warning at RAM_VDHL.vhd(43): inferring latch(es) for signal or variable "adr", which holds its previous value in one or more paths through the process
Warning (10631): VHDL Process Statement warning at RAM_VDHL.vhd(43): inferring latch(es) for signal or variable "clk", which holds its previous value in one or more paths through the process
Warning (10631): VHDL Process Statement warning at RAM_VDHL.vhd(43): inferring latch(es) for signal or variable "romcs", which holds its previous value in one or more paths through the process
Info (10041): Inferred latch for "romcs" at RAM_VDHL.vhd(43)
Info (10041): Inferred latch for "clk" at RAM_VDHL.vhd(43)
Info (10041): Inferred latch for "adr" at RAM_VDHL.vhd(43)
Info (10041): Inferred latch for "oe" at RAM_VDHL.vhd(43)
Info (19000): Inferred 1 megafunctions from design logic
Info (19001): Inferred lpm_counter megafunction (LPM_WIDTH=17) from the following logic: "count_rtl_0"
Info (12130): Elaborated megafunction instantiation "lpm_counter:count_rtl_0"
Info (12133): Instantiated megafunction "lpm_counter:count_rtl_0" with the following parameter:
Info (12134): Parameter "LPM_WIDTH" = "17"
Info (12134): Parameter "LPM_DIRECTION" = "UP"
Info (12134): Parameter "LPM_TYPE" = "LPM_COUNTER"
Info (280013): Promoted pin-driven signal(s) to global signal
Info (280014): Promoted clock signal driven by pin "clock" to global clock signal
Info (280016): Promoted output enable signal driven by pin "reset" to global output enable signal
Info (21057): Implemented 61 device resources after synthesis - the final resource count might be different
Info (21058): Implemented 8 input pins
Info (21059): Implemented 6 output pins
Info (21060): Implemented 14 bidirectional pins
Info (21063): Implemented 31 macrocells
Info (21073): Implemented 2 shareable expanders
Info: Quartus II 32-bit Analysis & Synthesis was successful. 0 errors, 22 warnings
Info: Peak virtual memory: 351 megabytes
Info: Processing ended: Fri Feb 14 23:09:08 2020
Info: Elapsed time: 00:00:04
Info: Total CPU time (on all processors): 00:00:02
Info: ************************************************** *****************
Info: Running Quartus II 32-bit Fitter
Info: Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
Info: Processing started: Fri Feb 14 23:09:09 2020
Info: Command: quartus_fit --read_settings_files=off --write_settings_files=off RAM_VDHL -c RAM_VDHL
Info: qfit2_default_script.tcl version: #1
Info: Project = RAM_VDHL
Info: Revision = RAM_VDHL
Warning (20028): Parallel compilation is not licensed and has been disabled
Info (119006): Selected device EPM7032SLC44-10 for design "RAM_VDHL"
Info: Quartus II 32-bit Fitter was successful. 0 errors, 1 warning
Info: Peak virtual memory: 312 megabytes
Info: Processing ended: Fri Feb 14 23:09:11 2020
Info: Elapsed time: 00:00:02
Info: Total CPU time (on all processors): 00:00:01
Info: ************************************************** *****************
Info: Running Quartus II 32-bit Assembler
Info: Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
Info: Processing started: Fri Feb 14 23:09:14 2020
Info: Command: quartus_asm --read_settings_files=off --write_settings_files=off RAM_VDHL -c RAM_VDHL
Info (115030): Assembler is generating device programming files
Info: Quartus II 32-bit Assembler was successful. 0 errors, 0 warnings
Info: Peak virtual memory: 307 megabytes
Info: Processing ended: Fri Feb 14 23:09:15 2020
Info: Elapsed time: 00:00:01
Info: Total CPU time (on all processors): 00:00:01
Info (293026): Skipped module PowerPlay Power Analyzer due to the assignment FLOW_ENABLE_POWER_ANALYZER
Info: ************************************************** *****************
Info: Running Quartus II 32-bit TimeQuest Timing Analyzer
Info: Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
Info: Processing started: Fri Feb 14 23:09:16 2020
Info: Command: quartus_sta RAM_VDHL -c RAM_VDHL
Info: qsta_default_script.tcl version: #1
Warning (20028): Parallel compilation is not licensed and has been disabled
Info (306004): Started post-fitting delay annotation
Info (306005): Delay annotation completed successfully
Warning (335095): TimeQuest Timing Analyzer does not support the analysis of latches as synchronous elements for the currently selected device family.
Critical Warning (332012): Synopsys Design Constraints File file not found: 'RAM_VDHL.sdc'. A Synopsys Design Constraints File is required by the TimeQuest Timing Analyzer to get proper timing constraints. Without it, the Compiler will not properly optimize the design.
Info (332142): No user constrained base clocks found in the design. Calling "derive_clocks -period 1.0"
Info (332105): Deriving Clocks
Info (332105): create_clock -period 1.000 -name clock clock
Info (332105): create_clock -period 1.000 -name a14_zx a14_zx
Warning (332125): Found combinational loop of 2 nodes
Warning (332126): Node "romcs$latch~6|[2]"
Warning (332126): Node "romcs$latch~6|dataout"
Warning (332125): Found combinational loop of 2 nodes
Warning (332126): Node "clk~10|dataout"
Warning (332126): Node "clk~10|[1]"
Warning (332125): Found combinational loop of 2 nodes
Warning (332126): Node "adr~10|dataout"
Warning (332126): Node "adr~10|[1]"
Warning (332125): Found combinational loop of 2 nodes
Warning (332126): Node "oe~10|[1]"
Warning (332126): Node "oe~10|dataout"
Info: Found TIMEQUEST_REPORT_SCRIPT_INCLUDE_DEFAULT_ANALYSIS = ON
Critical Warning (332148): Timing requirements not met
Info (332146): Worst-case setup slack is -9.000
Info (332119): Slack End Point TNS Clock
Info (332119): ========= ============= =====================
Info (332119): -9.000 -153.000 clock
Info (332146): Worst-case hold slack is 5.000
Info (332119): Slack End Point TNS Clock
Info (332119): ========= ============= =====================
Info (332119): 5.000 0.000 clock
Info (332140): No Recovery paths to report
Info (332140): No Removal paths to report
Info (332146): Worst-case minimum pulse width slack is -3.500
Info (332119): Slack End Point TNS Clock
Info (332119): ========= ============= =====================
Info (332119): -3.500 -119.000 clock
Info (332119): -3.500 -35.000 a14_zx
Info (332001): The selected device family is not supported by the report_metastability command.
Info (332102): Design is not fully constrained for setup requirements
Info (332102): Design is not fully constrained for hold requirements
Info: Quartus II 32-bit TimeQuest Timing Analyzer was successful. 0 errors, 16 warnings
Info: Peak virtual memory: 280 megabytes
Info: Processing ended: Fri Feb 14 23:09:17 2020
Info: Elapsed time: 00:00:01
Info: Total CPU time (on all processors): 00:00:01
Info: ************************************************** *****************
Info: Running Quartus II 32-bit EDA Netlist Writer
Info: Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition
Info: Processing started: Fri Feb 14 23:09:18 2020
Info: Command: quartus_eda --read_settings_files=off --write_settings_files=off RAM_VDHL -c RAM_VDHL
Info (204019): Generated file RAM_VDHL.vo in folder "D:/ZX SPECTRUM/rom_cartridge/RAM_ZX2_VDHL_copy/simulation/modelsim/" for EDA simulation tool
Info: Quartus II 32-bit EDA Netlist Writer was successful. 0 errors, 0 warnings
Info: Peak virtual memory: 290 megabytes
Info: Processing ended: Fri Feb 14 23:09:19 2020
Info: Elapsed time: 00:00:01
Info: Total CPU time (on all processors): 00:00:00
Info (293000): Quartus II Full Compilation was successful. 0 errors, 39 warnings


Ну или может книжку хорошую порекомендуете по VDHL для ПЛИС, пока только кривые "ПЛИС с нуля" в инете находятся.

EvgenRU
15.02.2020, 00:26
Похоже я не очень понимаю суть оператора Process. Помогите разобраться пожалуйста.

Вот примерчик из Speccy2007, чтобы понять как работает чувствительность

process( CLK )
begin
if CLK'event and CLK = '1' then
if Tick = '1' then
if paper_r = '0' and Attr_r(6) = '1' then
RY <= 'Z';
GY <= 'Z';
BY <= 'Z';
else
RY <= '0';
GY <= '0';
BY <= '0';
end if;
end if;

end if;
end process;


PS: т.е. триггер срабатывает по событию, в данном случае это rising edge у CLK

AlexG
15.02.2020, 00:59
Как вариант:
Аркадий Поляков: Языки VHDL и VERILOG в проектировании цифровой аппаратуры

по теме:
предупреждения говорят о том что signal "a14_zx" и тд должны быть указаны там же где и сигнал "ресет" - это с точки зрения "компилятора".
С "политической" - любое описание реальной схемы сводится к "текстовому описанию", результат которого изменяется в зависимости от изменения входных сигналов.
Применительно к "B:process (reset)":
указано что изменяется только один входной сигнал "reset", а остальные - нет. Посему когда reset==1 компилятор теряется в догадках что делать с другими входными сигналами. (В общем случае схема работает по изменению входных сигналов.)
Ну это всё очень "грубо" объяснено.


ПС: я больше склоняюсь к systemverilog - он более лаконичен.

julbu
15.02.2020, 13:42
Т.е. нужно указать в процессе все входные сигналы участвующие в этом процессе , а не только ресет? И в условии ресета нужно не только состояние указать но и само событие в виде перехода из 0 в 1? Книжку скачаю, спасибо!

fifan
15.02.2020, 16:26
Вот примерчик из Speccy2007, чтобы понять как работает чувствительность
Правильнее было бы сделать так: process( CLK, Tick, paper_r, Attr_r(6) )

JV-Soft
23.02.2020, 18:20
Вопрос , ISE , есть такое выражение -

assign CLOCK_RD = (A[23:16] == 8'b11011100) | LDS | ~cpu_rw ;

При адресе #DCxxxx , строб данных , и CPU в чтении.
Я думал что в этом выражении (A[23:16] == 8'b11011100) , при наличии на адресной шине значения #DCxxxx ,это выражение даст ноль , а выражение дает 1
Может так оно и должно быть ,но вот как то считал что ноль должно быть ,при исполнении условия , а ?

IgorR76
23.02.2020, 18:51
Почему ноль? "==" - сравнение. Если равно, то true (1), если не равно, то false (0). Основы синтаксиса, одинаково в verilog и в C.

oistalker
23.02.2020, 22:51
Всем привет! Столкнулся с непонятным поведением MAX3000A. Пытаюсь сконфигурировать выводы как open-drain (и вроде-бы конфигурируется, если посмотреть в отчёт Technology Map Viewer. Установил в конфиге set_global_assignment -name MAX7000_DEVICE_IO_STANDARD "3.3-V LVCMOS", запаял pull-up резисторы номиналом 10к (пробовал 4.7к тоже, ещё меньше не рискнул).

назначаю сигнал на выходы

assign CLK_3d5_5V = CLK_3d5 ? 1'bZ : 1'b0;

в итоге, когда цепляюсь к выводу осциллографом там не 5V, как я наивно ожидаю, а всего ~=600mV (и форма сигнала больше похожая на пилу, чем на меандр). Причём независимо от того, на какой пин cpld назначаю сигнал. Что происходит, идей никаких нет, гугл не помог. Морально настроился переделывать плату с использование трансляторов уровней ALVC. Причём если не пытаться симулировать open-drain выход, то на выходе стабильные 3.3V при лог. 1., что в режиме LVTTL, что LVCMOS. Может кто знает отчего так получается?

Bolt
24.02.2020, 00:54
в итоге, когда цепляюсь к выводу осциллографом там не 5V, как я наивно ожидаю, а всего ~=600mV (и форма сигнала больше похожая на пилу, чем на меандр).Пила медленно нарастает, потом падает вниз? На какой это частоте? Что происходит если вывести постоянный уровень "0" или "1"?
Большое сопротивление, большая ёмкость линии, большая частота, заряжаться не успевает.

oistalker
24.02.2020, 01:16
Пила медленно нарастает, потом падает вниз? На какой это частоте?

Да, таким образом. Частота вывода 3.5МГц, завожу внутрь 14МГц



Что происходит если вывести постоянный уровень "0" или "1"?
Большое сопротивление, большая ёмкость линии, большая частота, заряжаться не успевает.

Если присваивать выводу 1 или 0, то на выходе 3.3V если без pull-up резистора и в районе 3.6 с резистором. Та pdf'ка, которую с сайта Intel скачивал, вроде про ёмкости ничего не говорит.

Bolt
24.02.2020, 03:23
Я не так выразился...
Если вывод в z-состоянии с подтяжкой, что на этом выводе? 3.6 В?

Про ёмкости pdf ничего не говорит, но проводник может не успевать заряжаться через резистор. При таких условиях (подтянуто к 5 В через 10 кОм, 3.5 МГц, успевает дойти до 0.6 В) у меня получилось около 110 пФ. Это ёмкость проводников на плате и входов других микросхем.

Это какая-то шина? Может всё-таки нужен драйвер?

- - - Добавлено - - -

А, ну да, это 3.5 МГц clock. Которым, естественно, тактируется десяток микросхем, в том числе процессор. Для Z80 clock capacitance указано 35 пФ.

Не потянет open drain такое безобразие.

HardWareMan
24.02.2020, 07:50
Если выход у нас единственный на шине, да к тому же с хорошей нагрузкой, то зачем OD использовать? Лучше обычный PP, даже LVTTL раскачает многое. Ну а если Z80 не понравится, тогда нужно снаружи навесить буфер. Однако, у меня для Z80A хватало.

oistalker
24.02.2020, 09:07
Про ёмкости pdf ничего не говорит, но проводник может не успевать заряжаться через резистор.

Спасибо, хотя бы понятна физика процесса. Т.е., если, например, я выведу на вывод 50Гц, то должно успевать заряжаться?



А, ну да, это 3.5 МГц clock. Которым, естественно, тактируется десяток микросхем,


Вообще, предусматривалось что 2 штуки, но установлен пока только Z80. Я пробовал и без него.


Если выход у нас единственный на шине, да к тому же с хорошей нагрузкой, то зачем OD использовать? Лучше обычный PP, даже LVTTL раскачает многое. Ну а если Z80 не понравится, тогда нужно снаружи навесить буфер. Однако, у меня для Z80A хватало.

У меня на плате напаяна HC373 и на неё заведено пачка сигналов c MAX, там LVTTL попадает в диапазон между Low и High. Собственно, почему-то думалось, что open-drain прокатит. Попробую достать HCT373 или LS/LVC373. Возможно, действительно, заработает (если HM621024 хватит LVTTL уровней).

Bolt
24.02.2020, 12:49
Т.е., если, например, я выведу на вывод 50Гц, то должно успевать заряжаться?Да. Верхний предел килогерц 100.

HardWareMan
24.02.2020, 13:44
Спасибо, хотя бы понятна физика процесса. Т.е., если, например, я выведу на вывод 50Гц, то должно успевать заряжаться?
Такое подключение используется в шине I2C. Почитайте букварь на неё, там вся раскладка есть по физике.

tiretrak
04.04.2020, 18:11
не прошиваетчся альтера epm3128a
стоит в VGA конверторе для спектрума .перепроверил все что можно. все везде нормально.замыканий ,соплей нет.пропаивал с хорошим флюсом,проверял тестером.
перепробовал два программатора usb blaster ,один с али на базе пика и 244 буфера,второй USB Blaster V2 оригинальный . на обеих одно и тоже .
перепаял подтяжку jtagа как и должно быть,согласно официальной документации - TCK с подтяжкой к земли,TDO нпарямую, TMS и TDI с подтяжкой к 3.3в.все через 1к резисторы, не помогло.
кто сталкивался?
https://c.radikal.ru/c15/2003/16/73d8563320d8.png (https://radikal.ru)

HardWareMan
04.04.2020, 19:08
Нога зависла, которая TDI на микре. В том числе и внутри самой микры.

tiretrak
04.04.2020, 19:17
Нога зависла, которая TDI на микре. В том числе и внутри самой микры.

из за чего такое могло произойти?
лечится?

HardWareMan
04.04.2020, 20:15
Не знаю, для начала прозвонка спасёт гиганта мысли. Что сигналы доходят до JTAG от микры. А так же неплохо посмтреть осликом или логиком, что на них творится. Если всё подключено нормально и замыканий нет, то значит нога залипла внутри. Тут либо попытаться стереть её в программаторе, либо выкинуть и купить новую. Ну ещё для MAX3000 можно попробовать метод отсюда (https://zx-pk.ru/threads/25998-programmator-mikroskhem-programmiruemoj-logiki(cpld)/page13.html).

tiretrak
04.04.2020, 20:41
Не знаю, для начала прозвонка спасёт гиганта мысли. Что сигналы доходят до JTAG от микры. А так же неплохо посмтреть осликом или логиком, что на них творится. Если всё подключено нормально и замыканий нет, то значит нога залипла внутри. Тут либо попытаться стереть её в программаторе, либо выкинуть и купить новую. Ну ещё для MAX3000 можно попробовать метод отсюда (https://zx-pk.ru/threads/25998-programmator-mikroskhem-programmiruemoj-logiki(cpld)/page13.html).

сигналы доходят до JTAG от микры . даже от ног программатора до ног альтеры.
замыканий нет.земля и 3.3. на плате тоже в норме.присутствую на нужных ножках плис.питание 3.3.в поступает на бластер.

а возможно что плис левая или китайцы их еще не научились подделать?

backa
06.04.2020, 02:34
tiretrak,

а из какой программы-пакета данное окошко?

HardWareMan
06.04.2020, 06:42
backa, это стандартное окно проверки JTAG Chain из Кактуса.

tiretrak
06.04.2020, 13:16
tiretrak,

а из какой программы-пакета данное окошко?

квартус 13

а может от статики такое произойти?

backa
06.04.2020, 14:34
понял) спасибо
Спросил потому, что сейчас работают над тестированием устройств по JTAG и стараюсь найти все доступные софтинки для этой цели (бесплатные и вылеченые). Имеется некоторая коллекция но они все под Windows. А мне желательно под Linix. Пока лучше, чем OpenOCD не нашел.

tiretrak
06.04.2020, 22:51
Ну ещё для MAX3000 можно попробовать метод отсюда (https://zx-pk.ru/threads/25998-programmator-mikroskhem-programmiruemoj-logiki(cpld)/page13.html).
не помогло.

Protom
16.04.2020, 10:08
Привет!

Может укого есть MAXPLUS2 для EPF8636 и EPF8820A?

Anubis_OD
16.04.2020, 10:45
посмотрел..Flex 8000 поддерживается в версии, что стоит у меня на компе - 10.23 RC1
она бесплатная (правда регаться надо) тут:
https://www.intel.com/content/www/us/en/programmable/support/support-resources/download/legacy/maxplus2/mp2-index.html

Protom
16.04.2020, 12:19
посмотрел..Flex 8000 поддерживается в версии, что стоит у меня на компе - 10.23 RC1
она бесплатная (правда регаться надо) тут:
https://www.intel.com/content/www/us/en/programmable/support/support-resources/download/legacy/maxplus2/mp2-index.html

В 10.xx версии нет файлов c:\maxplus2\f8636*
Они нужны при компиляций

Mick
16.04.2020, 12:44
В 10.xx версии нет файлов c:\maxplus2\f8636*
Они нужны при компиляций

Они есть, был какой то большой дистрибутив, где все было. Сейчас я не помню где он у меня лежит.
Как я уже говорил, я свою папку сожму и тебе отправлю. Вроде он и так будет работать.

Anubis_OD
16.04.2020, 12:56
посмотрел..да.файлов нет таких, но такой девайс в списке устройств выбрать можно.
72223

- - - Добавлено - - -

А вот и ответ

https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd07262013_295.html

- - - Добавлено - - -

надо версия 9.0

- - - Добавлено - - -

https://www.dropbox.com/s/b1w7m0y8ez5wh8m/90sp2_quartus_free.exe?dl=0

Выложил. Quartus II 9.0

Mick
16.04.2020, 15:29
Помоему FLEX8000 нет в никаком кактусе.
Потому как у меня стоит кактус 9.0 и там только FLEX10K и FLEX6000

Anubis_OD
16.04.2020, 15:52
Да.. поставил себе 9.0sp2. Нет там FLEX800, увы
Извиняюсь. удалил линк

- - - Добавлено - - -


Они есть, был какой то большой дистрибутив, где все было. Сейчас я не помню где он у меня лежит.
Как я уже говорил, я свою папку сожму и тебе отправлю. Вроде он и так будет работать.

Миша, а ты не про этот дистрибутив говоришь?
MAX+PLUS II Advanced Synthesis Software Version 1.01
https://www.intel.com/content/www/us/en/programmable/support/support-resources/download/legacy/maxplus2/dnl-mp2_adv_syn.html

- - - Добавлено - - -

Вот гайд на него
https://www.element14.com/community/servlet/JiveServlet/downloadBody/30458-102-5-251664/Altera.User_Guide_54.pdf
Там указано:


The MAX+PLUS II Advanced Synthesis software supports the following
Altera device families:
■ ACEX® 1K
■ FLEX® 6000
■ FLEX 8000
■ FLEX 10K®
■ FLEX 10KA
■ FLEX 10KB
■ FLEX 10KE
■ MAX® 3000A
■ MAX 7000
■ MAX 7000AE
■ MAX 7000B
■ MAX 7000S
■ MAX 9000

- - - Добавлено - - -

Но на интеле не доступно для скачивания.
Тут нашел.
http://www.pldworld.com/_altera/html/_sw/mp2_adv_synth.htm
На вирусы и прочее не проверял..

Mick
16.04.2020, 16:24
Миша, а ты не про этот дистрибутив говоришь?

Возможно, я давно когда то скачивал, уже не помню откуда. Раньше у альтерки был ftpшник, где старье их лежало. Сейчас наверное прикрыли это дело.

AlexG
16.04.2020, 16:33
нынче алтера (интел) убирает с доступа практически все старые версии (по слухам)

Mick
16.04.2020, 18:18
Вот версия 10.0 RC2 там оно есть


https://yadi.sk/d/Y2fhwYFMV1HZPQ
Распаковываем и пользуемся. В папке maxplus2 запускаем max2win.exe
Или создаем ярлык на рабочий стол и запускаем :)

Protom
17.04.2020, 11:52
Если не Mick, прощай FLEX 8000. Жалко что Altera(Intel) закрывает старые технологии.

alvis
17.04.2020, 22:27
нынче алтера (интел) убирает с доступа практически все старые версии (по слухам)
Квартусы там есть практически все. Только после выбора предлагает зарегистрироваться для скачивания.

azx987sa
20.04.2020, 22:14
Всё, мануал по проектированию простого спектрума на ПЛИС закончил.
Огромное спасибо, Ewgeny7. Можно сказать стартанул в детальное понимание спека.
Но есть вопрос с которым бьюсь и не могу никак победить.
Почему то при малейшем изменении проекта он "ломается".
4 циклон. Создаю проект, переношу все файлы, назначаю выводы под свою железку, компилирую, прошиваю - УРА! работает
Поправляю Border, добавляю TapeIn, TapeOut, Beeper. - Ура - все работает.
Теперь самое интересное...
объеденю TapeOut и Beeper BEEP <= port_fe(4) or not port_fe(3); - пропал Border. всегда черный.
добавлю независимый счетчик/делитель 16разрядов- на входе 50Мгц, на выходе старший разряд счетчика - результат на мониторе мусор, или клавиатура работает нестабильно, или опять бордюр пропал. Такие же симптомы возникают когда переназначаю выводы клавиатуры или RGB или если подключу SignalTap..
Настройки проекта аналогичные источнику и другие вариации положительного эфекта не дают, а если и дают то только до изменения кода.
Понимаю что работают фитер, оптимизатор и что то еще. Вот как заставить работать их корректно? Может кто подскажет какие именно настройки необходимо использовать?

IgorR76
21.04.2020, 02:57
azx987sa, почитайте про синхронный дизайн и констрейны (constraints). Это если профессионально делать.
Если побаловаться, то изменяйте Random Seed в настройках проекта. Несколько раз перекомпилируете-и заработает.

azx987sa
21.04.2020, 11:35
изменяйте Random Seed
Выходит туториал от Ewgeny7 работает на случайно скомпилированном нужном варианте?
Ведь его дорабатывают под свои нужды, AY добавляют, 128к прикручивают. и ведь работает.
В доработаных проектах так же не видел SDC и настройки проекта один в один как у меня.
а я ставлю только примитивное условие типа BEEP <= port_fe(4) or not port_fe(3); и хана.

AlexG
20.05.2020, 12:13
Квартусы там есть практически все. Только после выбора предлагает зарегистрироваться для скачивания.

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/pcn/adv2011.pdf
"Intel® is announcing the discontinuance of all older versions of Intel® Quartus® II software Subscription Edition and Intel Quartus II software Web Edition released from 2002 through 2013 (except Intel Quartus II software Subscription / Lite Edition versions 13.1.4 and 13.0 SP1, which will remain available). The versions covered by thisannouncement include all variants of these versions that support different operating systems. This product discontinuance applies only to these older versions of the Intel Quartussoftware, not to the related Intel FPGA and CPLD devices. The software versions will no longer be available for download after 26th of June 2020,"

alvis
21.05.2020, 16:42
The software versions will no longer be available for download after 26th of June 2020,"
А пока что https://fpgasoftware.intel.com/

SoftLight
11.06.2020, 21:30
На всякий случай, сохранил все нужные версии сюда:
Quartus 2.2,3.0,4.0,4.1,4.2,5.0,6.0,8.0,9.0,9.1,11.0,18.0 + MAX + PLUS II (https://yadi.sk/d/6jjEs0bBJXa_NQ?w=1)
Quartus 13.0 (https://yadi.sk/d/H8xYCWrkDSC3nw?w=1)
Quartus 13.1 (https://yadi.sk/d/lmR4LTLrIN_IQg?w=1)

andykarpov
11.06.2020, 21:37
все нужные версии
А линуксячьи версии будут? :)
Хотя бы кактуса 13.0 :)

SoftLight
11.06.2020, 22:12
А линуксячьи версии будут? :)
Хотя бы кактуса 13.0 :)
положу, я думал в DVD включено, ан нет.

upd. Я скачал и проверил. Дистриб для линуха включен в iso. Запускать setup.sh.

NEO SPECTRUMAN
12.06.2020, 00:02
у интела не нашлось лишнего жесткого диска? :v2_dizzy_facepalm:

HardWareMan
12.06.2020, 06:28
у интела не нашлось лишнего жесткого диска? :v2_dizzy_facepalm:
Нет, они просто не хотят возиться с этим старым наследием.

- - - Добавлено - - -


На всякий случай, сохранил все нужные версии сюда (https://jia666-my.sharepoint.com/:f:/g/personal/alexey_anisimov_xkx_me/Eie8p35HE5VKocZqu3gP-roBVPG51jqbjW7DeLBDrR906A) на сетевой диск.
Так ты скопировал только free версии. Это не интересно.

SoftLight
12.06.2020, 10:01
Так ты скопировал только free версии. Это не интересно.
У тебя лицензия есть?

andykarpov
12.06.2020, 10:03
upd. Я скачал и проверил. Дистриб для линуха включен в iso. Запускать setup.sh.

Упс, отлично! спасибо! Я никогда iso-шками не пользовался, обычно мне столько не надо :) Отдельно инсталлятор и отдельно файл поддержки нужных мне устройств - это в разы меньше по объему. Плюс, для всех современных линуксов нужны пляски с бубном для установки этих древних кактусов, поэтому я пользуюсь внешними тулзами для автоматизации безгуевой установки, например вот: https://github.com/open-design/quartus-linux-install

HardWareMan
12.06.2020, 10:07
У тебя лицензия есть?
Когда я купил девборду на Arria2GX там прилагалась лицензия на 9.0.1. Но я всё равно использую генератор лицензии (9 использую для МАХ7000 и МАХ3000).

shurik-ua
12.06.2020, 10:27
на рутрекере всё лежит - с таблетками как полагается

цитата с тудова
"Товарищи, все версии Quartus II ломаются одинаково. HEX - редактором открывается файл sys_cpt.dll который расположен в папке bin и bin64. В какой из папок редактировать файл зависит от того, какой версией вы хотите пользоваться. Открыв файл ищем строку: для 32-битной версии 000E6*** (вместо звездочек может быть что угодно) и заменяем 55 8b ec -> 33 C0 C3. Для 64-битной версии в строке 000A4*** заменяем 4C 89 4C -> 33 C0 C3. Дальше, нам нужен файл лицензии, его можно взять из раздач. В файле лицензии обычным текстовым редактором прописываем свой HOSTID.
Приведу пример для Quartus II 13.1. В 32-битной в строке 000E63D0: 55 8b ec -> 33 C0 C3. В 64-битной версии 000A4D10: 4C 89 4C -> 33 C0 C3."

линк (https://rutracker.org/forum/viewtopic.php?t=4618710)