реклама на сайте
подробности

 
 
> Реализация LookUp Table для видеовывода, нечёткое изображеине
%-)
сообщение Dec 14 2009, 06:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



при передачи цвета напрямую в порт RGB, затем цап на резисторах - потом на кодер AD724 - на телевизоре изображение чёткое:

Код
if rising_edge(pixel_clock) then
if Blank='1' then
   R<=SRAM_Data(14..10);
   G<=SRAM_Data(9 ...5);
   B<=SRAM_Dta(4..0);
end if;
end if;


при выводе из Look-Up таблицы в порт RGB чёткость изображения понижается - оно как бы размыто - с небольшим трудом читаются символы матрицы 8x8:

Код
if rising_edge(pixel_clock) then
if Blank='1' then
   R<=LookUpRED(conv_integer(SRAM_Data(14..10)));
   G<=LookUpGreen(conv_integer(SRAM_Data(9..5)));
   B<=LookUpBlue(conv_integer(SRAM_Data(4..0)));
end if;
end if;


есть ли способ избавиться от размытости?

Сообщение отредактировал %-) - Dec 14 2009, 06:35
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
%-)
сообщение Dec 15 2009, 00:31
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



кстати, как правильно(синхронно) вычитывать данные из внешней SRAM на дисплей?

Пока сделано так(для наглядности - код упрощён - нет обнулений по ограничению):
Код
process(Clk) --из 50 МГц получаем 25 мгц для пиксельклока
begin
if rising_edge(Clk) then
  PixelClock<=PixelClock+1;
end if;
end process;

process(PixelClock) --для увеличения адреса SRAM
begin
if rising_edge(PixelClock) then
  Address<=Address+1;
end if;
end process;

SRAM_CE<='0';
SRAM_OE<=PixelClock; --стробируем по пикслеьклоку. Квазисинхронный режим??? Для SRAM
SRAM_A<=Address;

process(PixelClock) --выдаём данные на VGA порт
begin
if rising_edge(PixelClock) then
  if Blank='1' then          -- кадр
   R<=SRAM_D(14 downto 10); -- считываем данные с SRAM
   G<=SRAM_D(9 downto 5);
   B<=SRAM_D(4 downto 0);
  else                            --бланк-интервалы - форсируем цвет в 0
   R<="00000";
   G<="00000";
   B<="00000";
  end if;
end if;
end process;

Blank<=HBlank and VBlank; -- =0 когда обратный ход луча(по строке или кадру), 1 - когда идёт отображение кадра
Go to the top of the page
 
+Quote Post
VasiaMVR
сообщение Dec 15 2009, 19:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 2-12-07
Из: Ростов-на-Дону
Пользователь №: 32 893



Цитата(%-) @ Dec 15 2009, 03:31) *
кстати, как правильно(синхронно) вычитывать данные из внешней SRAM на дисплей?


Не стоит делить частоту на триггере и затем использовать её в качестве тактовой если потом надо перепривязывать назад к 50. Лучший вариант, когда всё работает от одной тактовой с разрешениями. Есть DLL, PLL и др. блоки предназначенные для этого
я бы сделал так:

Код
process(Clk) --из 50 МГц получаем !!!разрешение!!! 25 мгц для пиксельклока
begin
if rising_edge(Clk) then
  PixelClock_en<=PixelClock_en+1; --зачем +1 ??? можно просто not PixelClock_en
end if;
end process;

process(Clk) --для увеличения адреса SRAM
begin
if rising_edge(Clk) then
  if PixelClock_en='0' then
   Address<=Address+1;
  end if;
end if;
end process;

SRAM_CE<='0';
--SRAM_OE<=PixelClock; --стробируем по пикслеьклоку. Квазисинхронный режим???
-- если нужно постоянно читать, можно вообще SRAM_OE<='0' на время чтения и не дергать лишний раз буфера, кроме этого сокращается время на чтение см ниже.
--SRAM_A<=Address; -- вот это интересней см ниже
-- чтение из SRAM  Есть следующие задержки
--1. от CLK до выходных ножек ПЛИС. Если так вывести, то задержка будет меняться от разводки, можно (вообще-то нужно) задать макс. значение (для Xilinx см OFFSET OUT)
--2. от ADDR SRAM до DATA SRAM см datasheet на SDRAM.
--3. от ножек ПЛИС до регистров. задать макс. значение (для Xilinx см OFFSET IN)
-- Сумма трех задержек меньше периода тактовой, в данном случае 40нс, что много (смотря сколь-ко логики нагородить на данных) и можно не ставить дополнительные регистры в ножках, но все-же лучше так
-- Единственно, если стробировать SRAM_OE для 2. максимальное из (ADDR -> DATA) и  ((ОЕ -> DATA) + 20 нс).

process(Clk)
begin
if rising_edge(Clk) then
  if PixelClock_en='0' then
   SRAM_A<=Address+1;  --не забудь поставить атрибут, что-бы синтез не выкинул одинаковые регистры. Можно без +1, тогда атрибут не нужен, но будет дополнительная задержка на такт.
  end if;
  SRAM_OE<=not PixelClock_en; --не забудь поставить атрибут, что-бы синтез не выкинул одинаковые регистры.
end if;
end process;

--process(PixelClock) --выдаём данные на VGA порт
--begin
-- if rising_edge(PixelClock) then
--  if Blank='1' then          -- кадр
--   R<=SRAM_D(14 downto 10); -- считываем данные с SRAM
--   G<=SRAM_D(9 downto 5);
--   B<=SRAM_D(4 downto 0);
--  else                            --бланк-интервалы - форсируем цвет в 0
--   R<="00000";
--   G<="00000";
--   B<="00000";
--  end if;
-- end if;
--end process;

--Blank<=HBlank and VBlank; -- =0 когда обратный ход луча(по строке или кадру), 1 - когда идёт отображение кадра

-- регистр один на вход и выход, лучше добавить ещё один.

process(Clk) --выдаём данные на VGA порт
begin
if rising_edge(Clk) then
  if PixelClock_en='0' then
   SRAM_D_reg<=SRAM_D;
   if Blank='1' then          -- кадр
    R<=SRAM_D_reg(14 downto 10); -- считываем данные с SRAM
    G<=SRAM_D_reg(9 downto 5);
    B<=SRAM_D_reg(4 downto 0);
   else                            --бланк-интервалы - форсируем цвет в 0
    R<="00000";
    G<="00000";
    B<="00000";
   end if;
   Blank<=HBlank and VBlank; -- задерживаем на такт, другие выходные сигналы тоже задержать.
  end if;
end if;
end process;


где-то так.
Go to the top of the page
 
+Quote Post
%-)
сообщение Dec 15 2009, 22:57
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



Цитата(VasiaMVR @ Dec 15 2009, 22:15) *
Не стоит делить частоту на триггере и затем использовать её в качестве тактовой если потом надо перепривязывать назад к 50. Лучший вариант, когда всё работает от одной тактовой с разрешениями. Есть DLL, PLL и др. блоки предназначенные для этого
я бы сделал так:


Спасибо за ваш развёрнутый ответ smile.gif

А как можно сделать палитру?

Мы должны считать с памяти слово (16 бит). Затем на одном такте его биты 0..7 загнать в индекс массива палитры, на другом такте биты 8..15 в палитру. И так по кругу.

Тоесть в палитровом режиме частота чтения в 2 раза меньше должна быть, но частота вывода останется таже - 12.5 МГц. На первом такте биты 0..7 на втором 8..15

тоесть:

данные на частоте 12.5 / 2 МГц:

Код
SRAM_Address<=ReadAddr+1;


на первом такте 12.5 МГц:

Код
Video_R<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(14..10);
Video_G<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(9..5);
Video_B<=Palette(conv_integer(SRAM_D_Reg(7 downto 0)))(4..0);

на втором такте 12.5 МГц:

Код
Video_R<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(14..10);
Video_G<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(9..5);
Video_B<=Palette(conv_integer(SRAM_D_Reg(15 downto 8)))(4..0);



как оптимальнее и правильнее сделать?
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 16 2009, 04:17
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(%-) @ Dec 15 2009, 16:57) *
А как можно сделать палитру?


какая задача знакомая..... %)

зачем читать палитру с SRAM, которую туда кто то загрузил через FPGA, грузите сразу декодеры палитры и используйте их.


--------------------
Go to the top of the page
 
+Quote Post
%-)
сообщение Dec 16 2009, 04:25
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 118
Регистрация: 13-09-09
Пользователь №: 52 331



Цитата(des00 @ Dec 16 2009, 07:17) *
какая задача знакомая..... %)

зачем читать палитру с SRAM, которую туда кто то загрузил через FPGA, грузите сразу декодеры палитры и используйте их.


вы наверное меня не поняли smile.gif

загружаю палиру через регистры вовнутренние std_logic_vector'а

в SRAM'е палитры нет - просто из SRAM мы вычитываем слово(16 бит) - байты которых - код ццета - индекс массива палитры

памагите сзделать ;-)

гыыы... вот:

Код
process(Clk)
begin
if rising_edge(Clk) then
  if PixelClockEn='0' then
   if Blank='1' then
    --Direct Color 16bpp R:G:B = 1:5:5:5
    if R_M(0)='0' then
     if R_P='0' then
      RGB<=VRAM0_D(14 downto 0);
     else
      RGB<=VRAM1_D(14 downto 0);
     end if;
    --Palette Color 8bpp
    else
     if R_P='0' then
      if R_M(1)='0' then                                --VGA
       if F(conv_integer(V(0)))(2)='0' then
        RGB<=R_RGB(conv_integer(VRAM0_D( 7 downto 0)));
       else
        RGB<=R_RGB(conv_integer(VRAM0_D(15 downto 8)));
       end if;
      else                                              --NTSC
       if F(0)(2)='0' then
        RGB<=R_RGB(conv_integer(VRAM0_D( 7 downto 0)));
       else
        RGB<=R_RGB(conv_integer(VRAM0_D(15 downto 8)));
       end if;
      end if;
     else
      if R_M(1)='0' then                                --VGA
       if F(conv_integer(V(0)))(2)='0' then
        RGB<=R_RGB(conv_integer(VRAM1_D( 7 downto 0)));
       else
        RGB<=R_RGB(conv_integer(VRAM1_D(15 downto 8)));
       end if;
      else                                              --NTSC
       if F(0)(2)='0' then
        RGB<=R_RGB(conv_integer(VRAM1_D( 7 downto 0)));
       else
        RGB<=R_RGB(conv_integer(VRAM1_D(15 downto 8)));
       end if;
      end if;
     end if;
    end if;
   end if;
  end if;
end if;
end process;

process(Clk)
begin
if rising_edge(Clk) then
  if PixelClockEn='0' then
   RGB_Reg<=RGB;
   if Blank='1' then
    Video_R<=RGB_Reg(14 downto 10);
    Video_G<=RGB_Reg( 9 downto  5);
    Video_B<=RGB_Reg( 4 downto  0);
   else
    Video_R<=(others => '0');
    Video_G<=(others => '0');
    Video_B<=(others => '0');
   end if;
  end if;
end if;
end process;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- %-)   Реализация LookUp Table для видеовывода   Dec 14 2009, 06:34
- - SM   хрень какая-то. Констрейны выполняются? Слаков нет...   Dec 14 2009, 06:41
|- - %-)   Цитата(SM @ Dec 14 2009, 09:41) хрень как...   Dec 14 2009, 06:49
|- - SM   Цитата(%-) @ Dec 14 2009, 09:49)...   Dec 14 2009, 06:51
|- - %-)   Цитата(SM @ Dec 14 2009, 09:51) Хотя разн...   Dec 14 2009, 06:56
|- - Builder   Цитата(%-) @ Dec 14 2009, 09:56)...   Dec 14 2009, 07:49
|- - SM   Цитата(Builder @ Dec 14 2009, 10:49) появ...   Dec 14 2009, 08:01
|- - %-)   Цитата(Builder @ Dec 14 2009, 10:49) Учит...   Dec 14 2009, 22:58
|- - Builder   Цитата(%-) @ Dec 15 2009, 00:58)...   Dec 15 2009, 05:47
|- - %-)   Цитата(Builder @ Dec 15 2009, 08:47) А во...   Dec 15 2009, 06:33
|- - des00   Цитата(%-) @ Dec 15 2009, 00:33)...   Dec 15 2009, 06:52
|- - Builder   Цитата(%-) @ Dec 15 2009, 08:33)...   Dec 15 2009, 11:18
- - SM   Короче - пока есть слаки, нет никакого смысла зали...   Dec 14 2009, 06:57
- - %-)   ещё вопрос по генерации адреса. нужно удваивать ст...   Dec 16 2009, 02:53
- - %-)   люди! памагите! сроки поджимают, а мы(кон...   Dec 16 2009, 06:23
- - torik   Палитра как рассчитывается? Если значений палитры ...   Dec 16 2009, 12:21
- - %-)   палитра не считается по формуле. всего 256 цветов...   Dec 17 2009, 02:07
|- - des00   Цитата(%-) @ Dec 16 2009, 20:07)...   Dec 17 2009, 04:07
|- - %-)   Цитата(des00 @ Dec 17 2009, 07:07) в чем ...   Dec 17 2009, 05:39
|- - des00   Цитата(%-) @ Dec 16 2009, 23:39)...   Dec 17 2009, 06:18
||- - %-)   Цитата(des00 @ Dec 17 2009, 09:18) ...   Dec 17 2009, 07:19
||- - Builder   Цитата(%-) @ Dec 17 2009, 09:19)...   Dec 17 2009, 08:14
||- - DmitryR   Цитата(%-) @ Dec 17 2009, 10:19)...   Dec 18 2009, 08:54
||- - %-)   Цитата(DmitryR @ Dec 18 2009, 11:54) когд...   Dec 19 2009, 05:44
|- - Maverick   Цитата(%-) @ Dec 17 2009, 08:39)...   Dec 17 2009, 16:07
|- - Builder   Цитата(Maverick @ Dec 17 2009, 18:07) ...   Dec 17 2009, 16:17
|- - %-)   Цитата(Maverick @ Dec 17 2009, 19:07) ...   Dec 17 2009, 23:02
- - torik   Цитатаво-вторых: что-то мы сомневаемся, что алтера...   Dec 17 2009, 06:15
- - torik   Цитатанеправда. двухпортовое озу просто необходим...   Dec 17 2009, 07:29
- - torik   Многие ли захотят Вам помогать Да и нечем, похож...   Dec 18 2009, 05:57


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 00:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016