Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: VGA

VGA 5 года 7 мес. назад #3302

  • Alucard
  • Alucard аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 208
  • Спасибо получено: 20
Боевая проверка Multi-master системы. :)
  • Микроконтроллер (master)
  • ПЛИС (master)
  • VGA адаптер (slave)
  • Внешняя SRAM (slave)
  • ПЛИС выступает в качестве DMA контроллера с некоторыми дополнениями; в эксперименте происходит следующее:

    . МК чистит видеопамять у VGA адаптера. 1 раз
    . МК загружает несколько картинок (спрайтов) во внешнюю память (SRAM). 1 раз
    1. МК передает пакеты данных ПЛИС, в которых находится информация о том, что и куда копировать.
    2. ПЛИС захватывает шину.
    3. ПЛИС копирует содержимое внешней SRAM себе во внутренний буфер согласно командам.
    4. ПЛИС копирует содержимое буфера в видеопамять VGA адаптера.
    5. МК захватывает шину.

    Получается что-то похожее на DMA2D у STM-овских контроллеров. Результат на видео: :woohoo:

    PS: Можно заметить некоторые помехи в виде красных линий/точек - это ошибки DMA, работает пока нестабильно. Эти проблемы исчезают, если отказаться от внутреннего буфера ПЛИС, но в этом случае копирование будет в ~3раза медленнее. Имеется немного свободных выводов ПЛИС, к которым я позже подключу внешнюю память для буфера.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от Alucard.

    VGA 5 года 7 мес. назад #3303

    Нарисовал красивую разноцветную линию по середине экрана. Прикольно :)
    Завтра попробую синусоиду нарисовать. Интересно, а есть какая формула рисования синусоиды? это ведь хтро изогнутая линия.
    module point
    (
    	input clock,
    	input vsync, hsync,
    	input[11:0] har_count, line_count,
    	
    	
    	output reg video,
    	output reg[7:0] R, G, B
    
    );
    reg[7:0] als, bls, cls;
    //reg blanc;
    //assign blanc = (vsync == 2'b0 && hsync == 2'b0)? 1 : 0;
    always @(posedge clock)
    	begin
    		if(vsync == 2'b0 && hsync == 2'b0)
    			begin als = 0; bls = 0; cls = 0; end 
    		
    	 
    		if(line_count == 300)
    		begin 
    			als = als + 1;
    			R= als;
    			if(har_count >= 100)
    				begin  bls = bls + 1; G = bls; end 
    			if(har_count >= 200)
    				begin cls = cls+1; B = cls; end 
    				
    				
    		end
    		else
    			begin 
    				R = 0;
    				G = 0;
    				B = 0;
    			end 
    	
    	end 
    
    
    endmodule 


    Один вопрос: а графику проекта мультимастера в ручную рисовали?

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    VGA 5 года 7 мес. назад #3304

    • Alucard
    • Alucard аватар Автор темы
    • Не в сети
    • Завсегдатай
    • Завсегдатай
    • Сообщений: 208
    • Спасибо получено: 20

    WolfTheGrey пишет: Нарисовал красивую разноцветную линию по середине экрана. Прикольно :)
    Завтра попробую синусоиду нарисовать. Интересно, а есть какая формула рисования синусоиды? это ведь хтро изогнутая линия.

    module point
    (
    	input clock,
    	input vsync, hsync,
    	input[11:0] har_count, line_count,
    	
    	
    	output reg video,
    	output reg[7:0] R, G, B
    
    );
    reg[7:0] als, bls, cls;
    //reg blanc;
    //assign blanc = (vsync == 2'b0 && hsync == 2'b0)? 1 : 0;
    always @(posedge clock)
    	begin
    		if(vsync == 2'b0 && hsync == 2'b0)
    			begin als = 0; bls = 0; cls = 0; end 
    		
    	 
    		if(line_count == 300)
    		begin 
    			als = als + 1;
    			R= als;
    			if(har_count >= 100)
    				begin  bls = bls + 1; G = bls; end 
    			if(har_count >= 200)
    				begin cls = cls+1; B = cls; end 
    				
    				
    		end
    		else
    			begin 
    				R = 0;
    				G = 0;
    				B = 0;
    			end 
    	
    	end 
    
    
    endmodule 


    Один вопрос: а графику проекта мультимастера в ручную рисовали?

    Старайтесь не так часто использовать блокирующие присваивания "=", с ними вы не учитываете задержку между элементами. А в вашем случае время - критично.
    Насчет функции синусоиды, если я не ошибаюсь, ее не существует. :) Вам нужно вручную сделать таблицу синуса от 0..N, например в Excel-е, а затем поместить ее в синтезированный блок ПЗУ в вашем проекте.

    Один вопрос: а графику проекта мультимастера в ручную рисовали?

    Графику я не умею рисовать, к сожалению, :) поэтому понабрал из игр.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от Alucard.

    VGA 5 года 7 мес. назад #3305

    Alucard пишет: Насчет функции синусоиды, если я не ошибаюсь, ее не существует. :) Вам нужно вручную сделать таблицу синуса от 0..N, например в Excel-е, а затем поместить ее в синтезированный блок ПЗУ в вашем проекте.


    Можно попробовать взять из проекта AМ-передатчик - marsohod.org/projects/marsohod2/298-am-radio-transmitter

    "В проекте в ПЛИС имеется таблица синусов на 64 элемента - значения синусов предварительно вычислены и хранятся там в виде 16-ти битных знаковых чисел."

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

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от alman.

    VGA 5 года 7 мес. назад #3306

    А еще есть такое понятие как целочисленная масштабированная арифметика. Это, наверное, разновидность фиксированной запятой, но не совсем, все-таки.

    Например, принимаем за единицу число 1024 (ну или какую-то другую степень числа 2) - это число называем масштабом. Тогда 0.5 в нашем примере - это 512, 1.5 - это 1024+512 = 1536, 2.0 - это 2048. Главное, что ни о каких переводах форматов думать не надо - работаете с целыми числами и все - правило единственное - за каждым умножением должно идти деление на масштабированное число. Если делить Вам не надо, то делите на масштабированную единицу, т.е. на сам масштаб. Допустим вы умножаете 1 на 1 - должно получиться 1, а в масштабированной арифметике с масштабом 1024 получится (1024*1024)/1024 = 1024. Если бы у нас в формуле само собой шло бы какое-то деление на масштабированное число, то добавлять его специально не нужно было бы. И еще правило. Умножение идет всегда перед делением и промежуточный результат хранится в ячейке удвоенной разрядности, иначе потеряете в точности. В Форте для этой пары действий отдельная команда даже есть - */

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

    А для тригонометрических функций существуют ряды Маклорена. Кажется как частный случай ряда Тейлора. Чем больше точность нужна тем больше членов ряда. Понадобятся только 4 базовых арифметических действия + - * /

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от Chaosorg.

    VGA 5 года 7 мес. назад #3307

    Чет тяжко мне с экраном тягаться, ни чего дельного в голову не приходит. Максимум что сумел - нарисвать сетку, и бегущий, затухающий луч. В попытках заставить бегать луч не по прямой, а по всеу экрану - как в той песне "Получил козу" :)
    Получился снег на экране, тоже прикольно.
    Может мне какую книжку почитать? То кроме C# и veriloga больше ни чего не изучал.

    ВНИМАНИЕ: Спойлер!

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    VGA 5 года 7 мес. назад #3308

    Ну.. На ФПГА тривиально делается только операция "+". Далее по сложности идёт "-" там складывается операнд с дополнением - которое тоже надо ещё посчитать как инверсия и добавление 1. Умножения и деления - это уже циклические операции которые сильно просаживают мощьность вычислений.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    VGA 5 года 7 мес. назад #3309

    wowa пишет: Умножения и деления - это уже циклические операции которые сильно просаживают мощьность вычислений.


    Я немножко эксперементировал с умножением. По идее вот это должно быть самое быстрое умножение 32-хбитных целых.
    module mul(
       input  [31:0]  A,
       input  [31:0]  B,
       output [63:0]  C
       );
       
       wire [63:0] line0  = A[0]  ? { 32'h0, B        } : 64'h00;
       wire [63:0] line1  = A[1]  ? { 31'h0, B, 1'h0  } : 64'h00;
       wire [63:0] line2  = A[2]  ? { 30'h0, B, 2'h0  } : 64'h00;
       wire [63:0] line3  = A[3]  ? { 29'h0, B, 3'h0  } : 64'h00;
       wire [63:0] line4  = A[4]  ? { 28'h0, B, 4'h0  } : 64'h00;
       wire [63:0] line5  = A[5]  ? { 27'h0, B, 5'h0  } : 64'h00;
       wire [63:0] line6  = A[6]  ? { 26'h0, B, 6'h0  } : 64'h00;
       wire [63:0] line7  = A[7]  ? { 25'h0, B, 7'h0  } : 64'h00;
       wire [63:0] line8  = A[8]  ? { 24'h0, B, 8'h0  } : 64'h00;
       wire [63:0] line9  = A[9]  ? { 23'h0, B, 9'h0  } : 64'h00;
       wire [63:0] line10 = A[10] ? { 22'h0, B, 10'h0 } : 64'h00;
       wire [63:0] line11 = A[11] ? { 21'h0, B, 11'h0 } : 64'h00;
       wire [63:0] line12 = A[12] ? { 20'h0, B, 12'h0 } : 64'h00;
       wire [63:0] line13 = A[13] ? { 19'h0, B, 13'h0 } : 64'h00;
       wire [63:0] line14 = A[14] ? { 18'h0, B, 14'h0 } : 64'h00;
       wire [63:0] line15 = A[15] ? { 17'h0, B, 15'h0 } : 64'h00;
    
       wire [63:0] line16 = A[16] ? { 16'h0, B, 16'h0 } : 64'h00;
       wire [63:0] line17 = A[17] ? { 15'h0, B, 17'h0 } : 64'h00;
       wire [63:0] line18 = A[18] ? { 14'h0, B, 18'h0 } : 64'h00;
       wire [63:0] line19 = A[19] ? { 13'h0, B, 19'h0 } : 64'h00;
       wire [63:0] line20 = A[20] ? { 12'h0, B, 20'h0 } : 64'h00;
       wire [63:0] line21 = A[21] ? { 11'h0, B, 21'h0 } : 64'h00;
       wire [63:0] line22 = A[22] ? { 10'h0, B, 22'h0 } : 64'h00;
       wire [63:0] line23 = A[23] ? {  9'h0, B, 23'h0 } : 64'h00;
       wire [63:0] line24 = A[24] ? {  8'h0, B, 24'h0 } : 64'h00;
       wire [63:0] line25 = A[25] ? {  7'h0, B, 25'h0 } : 64'h00;
       wire [63:0] line26 = A[26] ? {  6'h0, B, 26'h0 } : 64'h00;
       wire [63:0] line27 = A[27] ? {  5'h0, B, 27'h0 } : 64'h00;
       wire [63:0] line28 = A[28] ? {  4'h0, B, 28'h0 } : 64'h00;
       wire [63:0] line29 = A[29] ? {  3'h0, B, 29'h0 } : 64'h00;
       wire [63:0] line30 = A[30] ? {  2'h0, B, 30'h0 } : 64'h00;
       wire [63:0] line31 = A[31] ? {  1'h0, B, 31'h0 } : 64'h00;
    
       wire [63:0]    line0_0  = line0 + line1;
       wire [63:0]    line0_1  = line2 + line3;
       wire [63:0]    line0_2  = line4 + line5;
       wire [63:0]    line0_3  = line6 + line7;
       wire [63:0]    line0_4  = line8 + line9;
       wire [63:0]    line0_5  = line10 + line11;
       wire [63:0]    line0_6  = line12 + line13;
       wire [63:0]    line0_7  = line14 + line15;
       wire [63:0]    line0_8  = line16 + line17;
       wire [63:0]    line0_9  = line18 + line19;
       wire [63:0]    line0_10 = line20 + line21;
       wire [63:0]    line0_11 = line22 + line23;
       wire [63:0]    line0_12 = line24 + line25;
       wire [63:0]    line0_13 = line26 + line27;
       wire [63:0]    line0_14 = line28 + line29;
       wire [63:0]    line0_15 = line30 + line31;
    
       wire [63:0]    line1_0 =  line0_0  + line0_1;
       wire [63:0]    line1_1 =  line0_2  + line0_3;
       wire [63:0]    line1_2 =  line0_4  + line0_5;
       wire [63:0]    line1_3 =  line0_6  + line0_7;
       wire [63:0]    line1_4 =  line0_8  + line0_9;
       wire [63:0]    line1_5 =  line0_10 + line0_11;
       wire [63:0]    line1_6 =  line0_12 + line0_13;
       wire [63:0]    line1_7 =  line0_14 + line0_15;
    
       wire [63:0]    line2_0 =  line1_0  + line1_1;
       wire [63:0]    line2_1 =  line1_2  + line1_3;
       wire [63:0]    line2_2 =  line1_4  + line1_5;
       wire [63:0]    line2_3 =  line1_6  + line1_7;
    
       wire [63:0]    line3_0 =  line2_0  + line2_1;
       wire [63:0]    line3_1 =  line2_2  + line2_3;
       
       assign C = line3_0  + line3_1;
    
    endmodule

    Проверял только в Icarus Verilog - считает. За работу в ПЛИС не поручусь. Пробовал синтезировать - "быстрое" умножение заняло 2097 логических элементов.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от alman.

    VGA 5 года 7 мес. назад #3312

    • Alucard
    • Alucard аватар Автор темы
    • Не в сети
    • Завсегдатай
    • Завсегдатай
    • Сообщений: 208
    • Спасибо получено: 20
    Какой-то сбой в питании случился. В итоге все модули и процессоры отошли в мир иной.

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    VGA 5 года 7 мес. назад #3313

    1- перегрузил по току
    2- перегрузил по напряжению
    3- китайский контрафакт
    Как говорится - нужное подчеркнуть.


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

    Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Последнее редактирование: от WolfTheGrey.
    Время создания страницы: 0.242 секунд
    Работает на Kunena форум