nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 05:32



Reply to topic  [ 67 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next
Язык Verilog 
Author Message
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
переписал
 module vga
Code:
module vga(clk,color,h,v);
input clk;
output reg h,v;
output [2:0] color;
reg [2:0] pixel;

reg [9:0] h_cnt,v_cnt;

always @(posedge clk)
begin

   if (h_cnt!=800) h_cnt<=h_cnt+1'b1;
   if (h_cnt==800)
   begin
      h_cnt<=1'b0;
      if (v_cnt!=525) v_cnt<=v_cnt+1'b1;
      if (v_cnt==525) v_cnt<=1'b0;
   end;
   
   case (v_cnt[8:5])
   4'b0000: pixel<=3'b100;
   4'b0101: pixel<=3'b010;
   4'b1010: pixel<=3'b001;
   default;
   endcase

   if (h_cnt==640+16) h<=1'b0;
   if (h_cnt==640+16+96) h<=1'b1;
   if (v_cnt==480+10) v<=1'b0;
   if (v_cnt==480+10+2) v<=1'b1;
end

assign color=((h_cnt>639)|(v_cnt>479)) ? 1'b0 : pixel;

endmodule

Total logic elements: 48 а было 38
что-то квартусу легче не стало :mrgreen:
да и читаемость кода упала
про blank не понял, вроде же достаточно просто в этот момент черный выставить?


Last edited by Icer on 27 Aug 2018 20:38, edited 1 time in total.



24 Aug 2018 08:01
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
Sorgelig wrote:
Для видео генератора есть еще два важных сигнала - это HBlank и VBlank - сигналы гашения. Они тут неявно присутствуют, но лучше их выделить отдельно на выход.

Когда баловался с FPGA отсчитывал каунтер для строчных и кадровых отдельно. И кейсом (case) взводил нужный сигнал. Бланком не пользовался (он, конечно, считался и рулил синхрой и RGB). Да и зачем Бланк нужен отдельно, когда у меня в руках целая FPGA, что захочу то и сделаю. Бывало, ловил спец эффекты (уникальные сочетания цветов из-за не правильного положения уровня черного) по ошибкам в коде.

Кстати тут народ на FPGA целый PAL-композит делает. Очень все там нетривиально получается :)

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


24 Aug 2018 08:10
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Ксли выводить по старинке на TV или VGA то отдельно blank не нужен. Если выводить на HDMI, то blank необходим. Я говорил про универсальный видео генератор.


24 Aug 2018 08:45
Profile
Doomed

Joined: 01 Oct 2007 10:30
Posts: 665
Location: Ukraine
Reply with quote
Sorgelig wrote:
Ксли выводить по старинке на TV или VGA то отдельно blank не нужен. Если выводить на HDMI, то blank необходим. Я говорил про универсальный видео генератор.

Ого, HDMI. Там вроде витая пара, функционал у FPGA присутствует. Не, я туда не ходил, пока :)

Да и цифровой это протокол, мне даже сложно объять (своим маленьким умом, в глобальном смысле) какие там стандарты от своего рождения крутятся (аля USB). Не проще микруху спец прикупит, пусть думает.

Или вы, о каком бланке для HDMI, слышал там остались пережитки прошлого в виде аналогового сигнала (там даже отдельные ножки есть, не всегда).

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


24 Aug 2018 09:05
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Для отдельного чипа тоже надо Blank. Называется он DE = ~(hblank|vblank)
Выводить на HDMI можно и напрямую с FPGA - но это несколько извратно и ограничено низкими разрешениями. Я вывожу через чип. Выводится не на много сложнее чем на VGA: 24бита данных, DE, VS, HS, CLK. Ну плюс i2c, через который конфиг чипа производится.
В цифровых выходах (HDMI,DVI,DP) blank(DE) является важным сигналом, ибо данные интерфейсы передают только полезный сигнал. Во время гашения передается другая инфа типа аудио, ethernet и прочее.


24 Aug 2018 12:03
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Sorgelig wrote:
... не прибегая к приоритетному селектору if else if else if else добавляющего нехилую задержку при длинной if цепочке. casex позволяет сильно сократить такие задержки при синтезе!

А вот тут я сильно сумлеваюсь - верилогу человек пришет примерно чего хочет получить при синтезе, а тулза синтезирует эту "хотелку" самым оптимальным образом - т.е. никакие цепочки дословно не реализуются, а конвертятся через BDD или SAT в оптимальное представление, наложенное на луты выбранной микрухи - выходит что пиши хоть через casex, хоть через таблицу перекодирования, хочть через цепочку ифов-елсов - сконвертится всё в одно и тоже

_________________
:dj: https://mastodon.social/@Shaos


24 Aug 2018 18:16
Profile WWW
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Shaos wrote:
Sorgelig wrote:
... не прибегая к приоритетному селектору if else if else if else добавляющего нехилую задержку при длинной if цепочке. casex позволяет сильно сократить такие задержки при синтезе!

А вот тут я сильно сумлеваюсь

Аналогично. Мой опыт с верилогом успешен, но скромен, поэтому за все случаи не скажу, а у меня такая конструкция есть в описании синхронной части. Синтезируется в одну комбинационную логическую схему на входе регистров. То есть, классический тактируемый автомат: регистры, обратная связь через комбинационную схему, в которую дополнительно входят сторонние сигналы.


25 Aug 2018 12:18
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Звисит от того насколько синтезатор поймет конечную цель.
Можно написать и надеятся что компилятор сам соптимизирует - тут как повезет.
А можно использовать более легкие и близкие синтезатору конструкции.


25 Aug 2018 15:16
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Не стал заморачиваться с оптимизацией и так путаюсь. Прикрутил шрифт и слепок текстового экрана из 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
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Icer wrote:
Почему квартус память синтезировал логикой, а не m9k?

потому что считает что обращение к памяти асинхронное.
vaddr формируется как комбинаторная логика - кактус такое не любит.
Мой совет - юзать мегафункцию 1/2-PORT RAM на первых парах. Потом придет чуйство кода и сможете юзать inferred ram.

представьте, что вы собираете плату видеогенератора на чипах. Что поставите в качетсве умножителя на 80? Это очень тяжелая функция. FPGA в данном случае скорее всего вставит DSP блок. Ему нужно время чтобы посчитать. BRAM, которую вы хотите чтобы кактус вставил, требует 1 такта клока чтобы считать данные, а вы требуете от нее данные моментально в том же цикле из адреса состоящего из комбинаторной логики с непонятной задержкой. Получите и распишитесь память в LE :)

можно попробовать записать так:
Code:
(* ramstyle="M9K" *) reg [7:0] vbuf [0:4799];

но скорее всего не поможет в данном случае.


26 Aug 2018 21:51
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Sorgelig wrote:
представьте, что вы собираете плату видеогенератора на чипах. Что поставите в качетсве умножителя на 80? Это очень тяжелая функция.

(если не вырываю из контекста, бо про очень тяжелая звучит странно) Для логики это один-единственный сумматор. На его входах множимое без двух младших разрядов и множимое, сдвинутое на два, к сумме снизу проводами приписываются те два младших разряда и ниже 4 нуля земляными (или какими другими с нужным потенциалом) проводами.


27 Aug 2018 07:13
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Code:
(* ramstyle="M9K" *)
и правда не помогло.

Переделал обращение к озу на синхронное. А это помогло! Спасибо!
Total logic elements: 131 / 10,320 ( 1 % )
Total memory bits: 71,168 / 423,936 ( 17 % )

Не стреляйте! Переделал как мог :mrgreen:
 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

Можно ли на форуме как-то портянки прятать под спойлер? А то они все длинее :econfused:


27 Aug 2018 07:20
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Можно. Вот так:
Code:
[spoiler=КОД ПРОГРАММЫ][code]module vga(clk,color,h,v);
input clk;
...
endmodule[/code][/spoiler]

 КОД ПРОГРАММЫ
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
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Lavr wrote:
Можно. Вот так:
Сразу кнопку нашел! Не по глазам :oops:
 Портянище на терабайт!
Спасибо!


27 Aug 2018 08:01
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Сдвиг экрана на символ через пятую точку победил. Остался маленький баг со сдвигом столбца на пиксель вниз.
 фото
Attachment:
ep4ce10_vga1.jpg
ep4ce10_vga1.jpg [ 67.6 KiB | Viewed 8922 times ]
Причина вроде бы ясна, но править не буду т.к. по худу переписывать весь проект.
Буду пилить новую платку с цапом поболее, а там и новый проект.


27 Aug 2018 20:11
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 67 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next

Who is online

Users browsing this forum: Bing [Bot] and 22 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.