|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Icer
Senior
Joined: 21 Aug 2018 07:39 Posts: 164 Location: Кемеровская обл.
|
переписал module vga Total logic elements: 48 а было 38 что-то квартусу легче не стало да и читаемость кода упала про blank не понял, вроде же достаточно просто в этот момент черный выставить?
Last edited by Icer on 27 Aug 2018 20:38, edited 1 time in total.
|
24 Aug 2018 08:01 |
|
|
Alekcandr
Doomed
Joined: 01 Oct 2007 10:30 Posts: 665 Location: Ukraine
|
Когда баловался с FPGA отсчитывал каунтер для строчных и кадровых отдельно. И кейсом (case) взводил нужный сигнал. Бланком не пользовался (он, конечно, считался и рулил синхрой и RGB). Да и зачем Бланк нужен отдельно, когда у меня в руках целая FPGA, что захочу то и сделаю. Бывало, ловил спец эффекты (уникальные сочетания цветов из-за не правильного положения уровня черного) по ошибкам в коде. Кстати тут народ на FPGA целый PAL-композит делает. Очень все там нетривиально получается
_________________Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
|
24 Aug 2018 08:10 |
|
|
Sorgelig
Writer
Joined: 22 Aug 2018 14:37 Posts: 11
|
Ксли выводить по старинке на TV или VGA то отдельно blank не нужен. Если выводить на HDMI, то blank необходим. Я говорил про универсальный видео генератор.
|
24 Aug 2018 08:45 |
|
|
Alekcandr
Doomed
Joined: 01 Oct 2007 10:30 Posts: 665 Location: Ukraine
|
Ого, HDMI. Там вроде витая пара, функционал у FPGA присутствует. Не, я туда не ходил, пока Да и цифровой это протокол, мне даже сложно объять (своим маленьким умом, в глобальном смысле) какие там стандарты от своего рождения крутятся (аля USB). Не проще микруху спец прикупит, пусть думает. Или вы, о каком бланке для HDMI, слышал там остались пережитки прошлого в виде аналогового сигнала (там даже отдельные ножки есть, не всегда).
_________________Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
|
24 Aug 2018 09:05 |
|
|
Sorgelig
Writer
Joined: 22 Aug 2018 14:37 Posts: 11
|
Для отдельного чипа тоже надо Blank. Называется он DE = ~(hblank|vblank) Выводить на HDMI можно и напрямую с FPGA - но это несколько извратно и ограничено низкими разрешениями. Я вывожу через чип. Выводится не на много сложнее чем на VGA: 24бита данных, DE, VS, HS, CLK. Ну плюс i2c, через который конфиг чипа производится. В цифровых выходах (HDMI,DVI,DP) blank(DE) является важным сигналом, ибо данные интерфейсы передают только полезный сигнал. Во время гашения передается другая инфа типа аудио, ethernet и прочее.
|
24 Aug 2018 12:03 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
А вот тут я сильно сумлеваюсь - верилогу человек пришет примерно чего хочет получить при синтезе, а тулза синтезирует эту "хотелку" самым оптимальным образом - т.е. никакие цепочки дословно не реализуются, а конвертятся через BDD или SAT в оптимальное представление, наложенное на луты выбранной микрухи - выходит что пиши хоть через casex, хоть через таблицу перекодирования, хочть через цепочку ифов-елсов - сконвертится всё в одно и тоже
|
24 Aug 2018 18:16 |
|
|
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 460 Location: Москва
|
Аналогично. Мой опыт с верилогом успешен, но скромен, поэтому за все случаи не скажу, а у меня такая конструкция есть в описании синхронной части. Синтезируется в одну комбинационную логическую схему на входе регистров. То есть, классический тактируемый автомат: регистры, обратная связь через комбинационную схему, в которую дополнительно входят сторонние сигналы.
|
25 Aug 2018 12:18 |
|
|
Sorgelig
Writer
Joined: 22 Aug 2018 14:37 Posts: 11
|
Звисит от того насколько синтезатор поймет конечную цель. Можно написать и надеятся что компилятор сам соптимизирует - тут как повезет. А можно использовать более легкие и близкие синтезатору конструкции.
|
25 Aug 2018 15:16 |
|
|
Icer
Senior
Joined: 21 Aug 2018 07:39 Posts: 164 Location: Кемеровская обл.
|
Не стал заморачиваться с оптимизацией и так путаюсь. Прикрутил шрифт и слепок текстового экрана из dosbox. Отображается правильно если не обращать внимание на сдвиг экрана на символ. Total combinational functions: 2,721 / 10,320 ( 26 % ) Total memory bits: 0 / 423,936 ( 0 % ) Почему квартус память синтезировал логикой, а не m9k? module vga | | | | Code: module vga(clk,color,h,v); input clk; output h,v; output [2:0] color; reg [2:0] pixel; reg [9:0] h_cnt,v_cnt;
reg [7:0] vbuf [0:4799]; initial $readmemh ("C:/lab/fpga/vga/hex/tscr.hex", vbuf); reg [7:0] font [0:4095]; initial $readmemh ("C:/lab/fpga/vga/hex/font.hex", font); reg [7:0] sym,attr,dsym,bsym,battr; wire [12:0] vaddr;
always @(posedge clk) begin if (h_cnt<800) h_cnt<=h_cnt+1'b1; else begin h_cnt<=1'b0; if (v_cnt<525) v_cnt<=v_cnt+1'b1; else v_cnt<=1'b0; end; if (bsym[7-h_cnt[2:0]]==0) pixel<=battr[6:4]; else pixel<=battr[2:0];
if ((h_cnt<640)&(v_cnt<480)) begin case (h_cnt[2:0]) 0:sym <=vbuf[vaddr]; 2:attr<=vbuf[vaddr]; 4:dsym<=font[{sym,v_cnt[3:0]}]; 7:begin bsym<=dsym; battr<=attr; end endcase end end
assign vaddr={h_cnt[9:3]+v_cnt[9:4]*80,h_cnt[1]}; assign h=~((h_cnt>639+16)&(h_cnt<639+16+96)); assign v=~((v_cnt>479+10)&(v_cnt<479+10+2)); assign color=((h_cnt>639)|(v_cnt>479)) ? 1'b0 : pixel; endmodule | | | | |
Last edited by Icer on 27 Aug 2018 20:37, edited 1 time in total.
|
26 Aug 2018 06:46 |
|
|
Sorgelig
Writer
Joined: 22 Aug 2018 14:37 Posts: 11
|
потому что считает что обращение к памяти асинхронное. vaddr формируется как комбинаторная логика - кактус такое не любит. Мой совет - юзать мегафункцию 1/2-PORT RAM на первых парах. Потом придет чуйство кода и сможете юзать inferred ram. представьте, что вы собираете плату видеогенератора на чипах. Что поставите в качетсве умножителя на 80? Это очень тяжелая функция. FPGA в данном случае скорее всего вставит DSP блок. Ему нужно время чтобы посчитать. BRAM, которую вы хотите чтобы кактус вставил, требует 1 такта клока чтобы считать данные, а вы требуете от нее данные моментально в том же цикле из адреса состоящего из комбинаторной логики с непонятной задержкой. Получите и распишитесь память в LE можно попробовать записать так: но скорее всего не поможет в данном случае.
|
26 Aug 2018 21:51 |
|
|
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 460 Location: Москва
|
(если не вырываю из контекста, бо про очень тяжелая звучит странно) Для логики это один-единственный сумматор. На его входах множимое без двух младших разрядов и множимое, сдвинутое на два, к сумме снизу проводами приписываются те два младших разряда и ниже 4 нуля земляными (или какими другими с нужным потенциалом) проводами.
|
27 Aug 2018 07:13 |
|
|
Icer
Senior
Joined: 21 Aug 2018 07:39 Posts: 164 Location: Кемеровская обл.
|
и правда не помогло. Переделал обращение к озу на синхронное. А это помогло! Спасибо! Total logic elements: 131 / 10,320 ( 1 % ) Total memory bits: 71,168 / 423,936 ( 17 % ) Не стреляйте! Переделал как мог module vga | | | | Code: module vga(clk,color,h,v); input clk; output h,v; output [2:0] color; reg [2:0] pixel; reg [9:0] h_cnt,v_cnt;
reg [7:0] vbuf [0:4799]; initial $readmemh ("c:/lab/fpga/vga/hex/tscr.hex", vbuf); reg [7:0] font [0:4095]; initial $readmemh ("c:/lab/fpga/vga/hex/font.hex", font);
reg [12:0] vaddr,addr; reg [7:0] sym,attr,line,bsym,battr; reg [7:0] data; wire draw;
always @(posedge clk) begin if (h_cnt<800) h_cnt<=h_cnt+1'b1; else begin h_cnt<=1'b0; if (v_cnt<525) v_cnt<=v_cnt+1'b1; else v_cnt<=1'b0; end pixel<=line[~h_cnt[2:0]] ? attr[2:0]:attr[6:4]; if (draw) case (h_cnt[2:0]) 0: vaddr<=addr; 2: sym<=data; 3: vaddr<=addr+1; 5: battr<=data; 7: begin line<=bsym; attr<=battr; if (h_cnt==631) begin if (v_cnt==479) addr<=0; else if (v_cnt[3:0]!=15) addr<=(v_cnt[9:4])*160; else addr<=(v_cnt[9:4]+1)*160; end else addr<=addr+2; end endcase end
always @(posedge clk) begin data<=vbuf[vaddr]; bsym<=font[{sym,v_cnt[3:0]}]; end
assign h=~((h_cnt>639+16)&(h_cnt<639+16+96)); assign v=~((v_cnt>479+10)&(v_cnt<479+10+2)); assign draw=(h_cnt<640)&(v_cnt<480); assign color=draw ? pixel : 1'b0;
endmodule | | | | |
Можно ли на форуме как-то портянки прятать под спойлер? А то они все длинее
|
27 Aug 2018 07:20 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Можно. Вот так: КОД ПРОГРАММЫ | | | | Code: module vga(clk,color,h,v); input clk; output h,v; output [2:0] color; reg [2:0] pixel; reg [9:0] h_cnt,v_cnt;
reg [7:0] vbuf [0:4799]; initial $readmemh ("c:/lab/fpga/vga/hex/tscr.hex", vbuf); reg [7:0] font [0:4095]; initial $readmemh ("c:/lab/fpga/vga/hex/font.hex", font);
reg [12:0] vaddr,addr; reg [7:0] sym,attr,line,bsym,battr; reg [7:0] data; wire draw;
always @(posedge clk) begin if (h_cnt<800) h_cnt<=h_cnt+1'b1; else begin h_cnt<=1'b0; if (v_cnt<525) v_cnt<=v_cnt+1'b1; else v_cnt<=1'b0; end pixel<=line[~h_cnt[2:0]] ? attr[2:0]:attr[6:4]; if (draw) case (h_cnt[2:0]) 0: vaddr<=addr; 2: sym<=data; 3: vaddr<=addr+1; 5: battr<=data; 7: begin line<=bsym; attr<=battr; if (h_cnt==631) begin if (v_cnt==479) addr<=0; else if (v_cnt[3:0]!=15) addr<=(v_cnt[9:4])*160; else addr<=(v_cnt[9:4]+1)*160; end else addr<=addr+2; end endcase end
always @(posedge clk) begin data<=vbuf[vaddr]; bsym<=font[{sym,v_cnt[3:0]}]; end
assign h=~((h_cnt>639+16)&(h_cnt<639+16+96)); assign v=~((v_cnt>479+10)&(v_cnt<479+10+2)); assign draw=(h_cnt<640)&(v_cnt<480); assign color=draw ? pixel : 1'b0;
endmodule | | | | |
_________________ iLavr
|
27 Aug 2018 07:50 |
|
|
Icer
Senior
Joined: 21 Aug 2018 07:39 Posts: 164 Location: Кемеровская обл.
|
Сразу кнопку нашел! Не по глазам Портянище на терабайт!
|
27 Aug 2018 08:01 |
|
|
Icer
Senior
Joined: 21 Aug 2018 07:39 Posts: 164 Location: Кемеровская обл.
|
Сдвиг экрана на символ через пятую точку победил. Остался маленький баг со сдвигом столбца на пиксель вниз. фото Причина вроде бы ясна, но править не буду т.к. по худу переписывать весь проект. Буду пилить новую платку с цапом поболее, а там и новый проект.
|
27 Aug 2018 20:11 |
|
|
Who is online |
Users browsing this forum: Shaos and 69 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|