Язык Verilog

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

переписал

 module vga

Code: Select all

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.
Alekcandr
Doomed
Posts: 665
Joined: 01 Oct 2007 10:30
Location: Ukraine

Re: Язык Вырвиглотк

Post by Alekcandr »

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

Кстати тут народ на FPGA целый PAL-композит делает. Очень все там нетривиально получается :)
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

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

Re: Язык Вырвиглотк

Post by Alekcandr »

Sorgelig wrote:Ксли выводить по старинке на TV или VGA то отдельно blank не нужен. Если выводить на HDMI, то blank необходим. Я говорил про универсальный видео генератор.
Ого, HDMI. Там вроде витая пара, функционал у FPGA присутствует. Не, я туда не ходил, пока :)

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

Или вы, о каком бланке для HDMI, слышал там остались пережитки прошлого в виде аналогового сигнала (там даже отдельные ножки есть, не всегда).
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Для отдельного чипа тоже надо Blank. Называется он DE = ~(hblank|vblank)
Выводить на HDMI можно и напрямую с FPGA - но это несколько извратно и ограничено низкими разрешениями. Я вывожу через чип. Выводится не на много сложнее чем на VGA: 24бита данных, DE, VS, HS, CLK. Ну плюс i2c, через который конфиг чипа производится.
В цифровых выходах (HDMI,DVI,DP) blank(DE) является важным сигналом, ибо данные интерфейсы передают только полезный сигнал. Во время гашения передается другая инфа типа аудио, ethernet и прочее.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Язык Вырвиглотк

Post by Shaos »

Sorgelig wrote:... не прибегая к приоритетному селектору if else if else if else добавляющего нехилую задержку при длинной if цепочке. casex позволяет сильно сократить такие задержки при синтезе!
А вот тут я сильно сумлеваюсь - верилогу человек пришет примерно чего хочет получить при синтезе, а тулза синтезирует эту "хотелку" самым оптимальным образом - т.е. никакие цепочки дословно не реализуются, а конвертятся через BDD или SAT в оптимальное представление, наложенное на луты выбранной микрухи - выходит что пиши хоть через casex, хоть через таблицу перекодирования, хочть через цепочку ифов-елсов - сконвертится всё в одно и тоже
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Re: Язык Вырвиглотк

Post by Mixa64 »

Shaos wrote:
Sorgelig wrote:... не прибегая к приоритетному селектору if else if else if else добавляющего нехилую задержку при длинной if цепочке. casex позволяет сильно сократить такие задержки при синтезе!
А вот тут я сильно сумлеваюсь
Аналогично. Мой опыт с верилогом успешен, но скромен, поэтому за все случаи не скажу, а у меня такая конструкция есть в описании синхронной части. Синтезируется в одну комбинационную логическую схему на входе регистров. То есть, классический тактируемый автомат: регистры, обратная связь через комбинационную схему, в которую дополнительно входят сторонние сигналы.
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Звисит от того насколько синтезатор поймет конечную цель.
Можно написать и надеятся что компилятор сам соптимизирует - тут как повезет.
А можно использовать более легкие и близкие синтезатору конструкции.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Не стал заморачиваться с оптимизацией и так путаюсь. Прикрутил шрифт и слепок текстового экрана из dosbox.
Отображается правильно если не обращать внимание на сдвиг экрана на символ.
Total combinational functions: 2,721 / 10,320 ( 26 % )
Total memory bits: 0 / 423,936 ( 0 % )
Почему квартус память синтезировал логикой, а не m9k?

 module vga

Code: Select all

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.
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

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

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

можно попробовать записать так:

Code: Select all

(* ramstyle="M9K" *) reg [7:0] vbuf [0:4799];
но скорее всего не поможет в данном случае.
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Re: Язык Вырвиглотк

Post by Mixa64 »

Sorgelig wrote: представьте, что вы собираете плату видеогенератора на чипах. Что поставите в качетсве умножителя на 80? Это очень тяжелая функция.
(если не вырываю из контекста, бо про очень тяжелая звучит странно) Для логики это один-единственный сумматор. На его входах множимое без двух младших разрядов и множимое, сдвинутое на два, к сумме снизу проводами приписываются те два младших разряда и ниже 4 нуля земляными (или какими другими с нужным потенциалом) проводами.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Code: Select all

(* ramstyle="M9K" *)
и правда не помогло.

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

Не стреляйте! Переделал как мог :mrgreen:

 module vga

Code: Select all

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:
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Язык Вырвиглотк

Post by Lavr »

Можно. Вот так:

Code: Select all

[spoiler=КОД ПРОГРАММЫ][code]module vga(clk,color,h,v);
input clk;
...
endmodule
[/spoiler][/code]

 КОД ПРОГРАММЫ

Code: Select all

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
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Lavr wrote:Можно. Вот так:
Сразу кнопку нашел! Не по глазам :oops:

 Портянище на терабайт!
Спасибо!

User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Сдвиг экрана на символ через пятую точку победил. Остался маленький баг со сдвигом столбца на пиксель вниз.

 фото
ep4ce10_vga1.jpg

Причина вроде бы ясна, но править не буду т.к. по худу переписывать весь проект.
Буду пилить новую платку с цапом поболее, а там и новый проект.
You do not have the required permissions to view the files attached to this post.