Forth http://fforum.winglion.ru/ |
|
Xilinx Spartan KIT SP601 http://fforum.winglion.ru/viewtopic.php?f=3&t=2599 |
Страница 2 из 4 |
Автор: | WingLion [ Вт окт 26, 2010 08:03 ] | ||
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 | ||
WingLion_from_work писал(а): Скину чуть позже, надо еще кусочек схемы доразвести. Доразводку платки еще не довел до конца, сегодня вечером закончу. Здесь обновленная схема. Изменения: 1. Поправлена разводка разъема для подсоединения к киту (приведена в соответствие с разъемом кита, чтобы соединительный шлейф один-в-один делать). 2. Добавлен импульсный преобразователь из 3.3В в 5.0В для питания клавиатуры.
|
Автор: | WingLion_from_Work [ Вт окт 26, 2010 10:52 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
УРРАА!!! огонёчки на плате огонёчат! Запустил сегодня с первой попытки без подглядывания в распечатку вчерашнего чата! Хищнику респектище! |
Автор: | Hishnik [ Вт окт 26, 2010 19:21 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
WingLion_from_Work писал(а): УРРАА!!! огонёчки на плате огонёчат! Урраа! Поголовье ПЛИСов выросло! WingLion_from_Work писал(а): Запустил сегодня с первой попытки без подглядывания в распечатку вчерашнего чата! Хищнику респектище! А я все равно делаю подсказку по ISE, сегодня-завтра выложу. |
Автор: | WingLion [ Вт окт 26, 2010 19:25 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
Хищник писал(а): А я все равно делаю подсказку по ISE, сегодня-завтра выложу. Ee, наверно, лучше сразу pdf-ом оформить |
Автор: | WingLion [ Вт окт 26, 2010 19:29 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
WingLion_from_Work писал(а): огонёчки на плате огонёчат! Кроме огонечков, сегодня распаял разъемчик VGA-шный напрямую на тот 12-контактный разъем и сделал тестовую прошивку для вывода на VGA в режиме 800x600. Пока только разноцветные квадратюки И попробовал сделать ШИМ-модуляцию на выходах цвета. ЖК-Монитор все это дело проглотил, в смысле изображение показал, синхронизацию поймал, но вместо градаций цвета - явная интерференционная картинка... |
Автор: | Hishnik [ Вт окт 26, 2010 20:17 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
WingLion писал(а): Кроме огонечков, сегодня распаял разъемчик VGA-шный напрямую на тот 12-контактный разъем и сделал тестовую прошивку для вывода на VGA в режиме 800x600. Пока только разноцветные квадратюки Это хорошо! А я пока текстовый вывод делаю. Можно навыкладывать модулей в аппаратный раздел. |
Автор: | WingLion [ Вт окт 26, 2010 20:25 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
Хищник писал(а): Можно навыкладывать модулей в аппаратный раздел. Угу, я сейчас флешку разгружу, и vhdl с VGA-шным контроллером своим выложу |
Автор: | WingLion [ Вт окт 26, 2010 20:49 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
VHDL код синхро-контроллера: Код: ---------------------------------------------------------------------------------- -- VGA Sinc-controller 800x600 mode -- Revision 0.01 ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE IEEE.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity vga800x600 is Port( clk200 : in std_logic; -- 200MHz -- выходной разъемчик HDRx : out std_logic_vector (7 downto 0) ); end vga800x600; architecture Behavioral of vga800x600 is constant h_size : natural := 1041; -- полное число точек в строке constant v_size : natural := 640; -- полное число строк constant h_mode : natural := 800; -- число отображаемых точек в строк constant v_mode : natural := 600; -- число отображаемых строк в кадре constant hs_size : natural := (h_size - h_mode) / 4; -- размер гор.синхроимпульса constant vs_size : natural := (v_size - v_mode) / 4; -- размер верт.синхроимпульса signal h_count : std_logic_vector (11 downto 0); signal v_count : std_logic_vector (11 downto 0); signal zero : std_logic_vector (11 downto 0); -- вспомогательный нуль signal hs,vs : std_logic; signal hsinc,vsinc : std_logic; signal screen,border_line : std_logic; -- сигналы выходов (по идее их надо как выход модуля описывать) signal H_SINC,V_SINC,R_test,G_test,B_test : std_logic; -- счетчики пикселей и строк signal CTH,CTV : std_logic_vector (11 downto 0); signal del : std_logic_vector (1 downto 0); signal clk50s : std_logic; -- тут пока двух-битные цвета signal R,G,B : std_logic_vector (1 downto 0); begin zero <= (others => '0'); process (clk200,hs) begin -- простой делитель на 4 для получения "пиксельной частоты" if clk200'event and clk200 ='1' then del <= del + 1; if conv_integer(del) = 0 then clk50s <= '1'; else clk50s <= '0'; end if; -- выходные цветовые ШИМ-ы case conv_integer(R) is when 1 => R_test <= del(1); when 2 => R_test <= del(1); when 3 => R_test <= '1'; when others => R_test <= '0'; end case; case conv_integer(G) is when 1 => G_test <= del(1); when 2 => G_test <= del(1); when 3 => G_test <= '1'; when others => G_test <= '0'; end case; case conv_integer(B) is when 1 => B_test <= del(1); when 2 => B_test <= del(1); when 3 => B_test <= '1'; when others => B_test <= '0'; end case; -- другая реализация ШИМ-ов -- if (del > R) then R_test <= '0'; else R_test <='1'; end if; -- if (del > G) then G_test <= '0'; else G_test <='1'; end if; -- if (del > B) then B_test <= '0'; else B_test <='1'; end if; end if; if clk200'event and clk200 ='1' and clk50s ='1' then -- горизонтальный счетчик if hs = '1' then h_count <= zero; else h_count <= h_count + 1; end if; if h_count = (h_size - 1) then hs <= '1'; else hs <= '0'; end if; end if; if clk200'event and clk200 ='1' and hs = '1' and clk50s ='1' then -- вертикальный счетчик if vs = '1' then v_count <= zero; else v_count <= v_count + 1; end if; if v_count = (v_size - 1) then vs <= '1'; else vs <= '0'; end if; end if; if clk200'event and clk200 ='1' and clk50s ='1' then -- строб области отображения if (h_count < h_mode) and (v_count < v_mode) then screen <= '1'; else screen <= '1'; end if; -- белая рамка по краю изображения - -- надо для нормального автозахвата изображения монитором if (((h_count = 0) or (h_count = (h_mode-1))) or (v_count = 0) or (v_count = v_mode-1)) and (h_count < h_mode) and (v_count < v_mode) then border_line <= '1'; else border_line <= '0'; end if; -- генерация горизонтального синхроимпульса if (h_count > (h_mode + hs_size)) and (h_count < (h_size - hs_size)) then hsinc <= '1'; else hsinc <= '0'; end if; -- генерация вертикального синхроимпульса if (v_count > (v_mode + vs_size)) and (v_count < (v_size - vs_size)) then vsinc <= '1'; else vsinc <= '0'; end if; -- кодирование выходов if border_line = '1' then -- белая-белая рамка R <= (others => '1'); G <= (others => '1'); B <= (others => '1'); else if screen = '1' then -- цветные квадратюки R <= h_count (5 downto 4); G <= h_count (7 downto 6); B <= v_count (7 downto 6); else -- черный цвет за пределами экрана R <= zero (5 downto 4); G <= zero (7 downto 6); B <= zero (7 downto 6); end if; end if; end if; end process; CTH <= h_count; CTV <= v_count; H_SINC <= hsinc; V_SINC <= vsinc; -- R_test <= border_line or (h_count(5) and screen); -- G_test <= border_line or (h_count(6) and screen); -- B_test <= border_line or (h_count(7) and screen); -- коммутация сигналов на выход разъема -- (пришлось подбирать методом тыка, потому что в документации -- на кит это дело оказалось непрозрачно) HDRx <= (4 => G_test, 0 => R_test, 1 => B_test, 5 => H_SINC, 2 => V_SINC, others =>'0' ); -- LEDG <= (others => '0'); end Behavioral; и уксочек UCF-а: Код: ##------- Pin Constraints ------- ## Clock inputs NET "clk200" LOC = "K15" |SLEW=SLOW |IOSTANDARD=LVCMOS25; # NET "HDRx<0>" LOC = "N17" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<1>" LOC = "M18" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<2>" LOC = "A3" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<3>" LOC = "L15" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<4>" LOC = "F15" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<5>" LOC = "B4" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<6>" LOC = "F13" | SLEW=SLOW |IOSTANDARD=LVCMOS25; NET "HDRx<7>" LOC = "P12" | SLEW=SLOW |IOSTANDARD=LVCMOS25; # С разъемчика KITa - 1,2,3 - контакты -> R,G,B входы монитора, 4 -> H_SINC вход монитора, 5 -> V_SINC вход монитора. 9,10 -> GND - общий. Распайка VGA-разъема монитора - чуть выше в опубликованных тут схемах |
Автор: | Hishnik [ Ср окт 27, 2010 02:55 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
http://www.msyst.ru/ISE_quickstart.pdf |
Автор: | WingLion [ Ср окт 27, 2010 04:30 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
Хищник писал(а): http://www.msyst.ru/ISE_quickstart.pdf Замечательно! Tеперь, сюда же стоит добавить материал о подключении таких вещей, как встроенные блоки PLL, RAM, а так же об их настройке. Например, для VGA-режима 1280x1024 нужно из 200MHz получить 135MHz (или 270). После чего описанный выше модуль vga800x600 легко переделается в vga1280x1024 и любой другой. Надо будет только константы подправить и не забыть, что в некоторых старых режимах некоторые сигналы синхронизации надо инвертировать. А теперь табличка с данными, за которыми в свое время мне пришлось здорово побегать: табличка с ошибкой удалена - более правильная табличка несколько постов ниже |
Автор: | WingLion [ Ср окт 27, 2010 05:11 ] | ||
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 | ||
Та же табличка (исправленная), но в PDF
|
Автор: | _Harry [ Ср окт 27, 2010 17:30 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
WingLion писал(а): табличка с данными, за которыми в свое время мне пришлось здорово побегать: ошибочка в столбце 1024х768 указанно число видимых точек в строке 1280 |
Автор: | WingLion [ Ср окт 27, 2010 18:57 ] | ||
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 | ||
_Harry писал(а): ошибочка в столбце 1024х768 указанно число видимых точек в строке 1280 Да, есть такое... Сам сегодня обнаружил, когда по этой табличке заполнял оператор case в универсальном VGA-синхрогенераторе.
|
Автор: | WingLion [ Ср окт 27, 2010 19:10 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
VHDL код универсального синхрогенератора: (универсального - в смысле - на несколько режимов от 640x400 до 1280x1024) Код: library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE IEEE.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity VGA_all is Port( clk25MHz : in std_logic; clk50MHz : in std_logic; clk75MHz : in std_logic; clk135MHz : in std_logic; CLKo : out std_logic; CLKi : in std_logic; clk300 : in std_logic; -- 300MHz -- переключатель режима SW : in std_logic_vector (3 downto 0); -- сигналы синхронизации VGA H_SINC,V_SINC : out std_logic; -- тестовые цветовые сигналы R_test,G_test,B_test : out std_logic; -- счетчики пикселей в строке и строк в кадре CTH,CTV : out std_logic_vector (11 downto 0); -- для тестовой индикации LEDG : out std_logic_vector (3 downto 0) ); end VGA_all; architecture Behavioral of VGA_all is -- constant h_size : natural := 1041; -- constant v_size : natural := 640; -- constant h_mode : natural := 800; -- constant v_mode : natural := 600; -- constant hs_size : natural := (h_size - h_mode) / 4; -- constant vs_size : natural := (v_size - v_mode) / 4; signal clk : std_logic; signal h_size : natural; signal v_size : natural ; signal h_mode : natural ; signal v_mode : natural ; signal hs_size : natural ; --:= (h_size - h_mode) / 4; signal vs_size : natural ; -- := (v_size - v_mode) / 4; signal h_count : std_logic_vector (11 downto 0); signal v_count : std_logic_vector (11 downto 0); signal zero : std_logic_vector (11 downto 0); signal hs,vs : std_logic; signal hsinc,vsinc : std_logic; signal screen,border_line : std_logic; signal del : std_logic_vector (3 downto 0); signal del_num : natural; signal point : std_logic; signal invert_sh : std_logic; begin process (sw) begin case conv_integer(sw) is when 0 => CLKo <= CLK25MHz; when 1 => CLKo <= CLK25MHz; when 2 => CLKo <= CLK50MHz; when 3 => CLKo <= CLK75MHz; when 4 => CLKo <= CLK135MHz; when others => CLKo <= CLK25MHz; end case; end process; clk <= CLKi; zero <= (others => '0'); process (sw,clk) begin if clk'event and clk='1' then case conv_integer(sw) is -- 640x480 when 0 => h_size <= 800; v_size <= 525; h_mode <= 640; v_mode <= 480; hs_size <= 40; vs_size <= 10; invert_sh <= '1';-- 25mhz -- 640x400 when 1 => h_size <= 800; v_size <= 449; h_mode <= 640; v_mode <= 400; hs_size <= 40; vs_size <= 10; invert_sh <= '0';-- 25mhz -- 800x600 when 2 => h_size <= 1041; v_size <= 640; h_mode <= 800; v_mode <= 600; hs_size <= 60; vs_size <= 10; invert_sh <= '0';-- 50mhz -- 1024x768 when 3 => h_size <= 1327; v_size <= 807; h_mode <= 1024; v_mode <= 768; hs_size <= 75; vs_size <= 10; invert_sh <= '0';-- 75mhz -- 1280x1024 when 4 => h_size <= 1712; v_size <= 1065; h_mode <= 1280; v_mode <= 1024; hs_size <= 100; vs_size <= 10; invert_sh <= '0';-- 135mhz -- 640x480 when others => h_size <= 1041; v_size <= 640; h_mode <= 800; v_mode <= 600; hs_size <= 60; vs_size <= 10; invert_sh <= '1'; -- 25MHz end case; end if; end process; process (clk) begin -- делитель входной частоты (формально отключен) if clk'event and clk ='1' then point <= '1'; -- каждый такт - один пиксель end if; if clk'event and clk ='1' and point = '1' then -- счетчик пикселей в строке if hs = '1' then h_count <= zero; else h_count <= h_count + 1; end if; if h_count = (h_size - 1) then hs <= '1'; else hs <= '0'; end if; end if; if clk'event and clk ='1' and hs = '1' and point = '1' then -- счетчик строк в кадре if vs = '1' then v_count <= zero; else v_count <= v_count + 1; end if; if v_count = (v_size - 1) then vs <= '1'; else vs <= '0'; end if; end if; if clk'event and clk ='1' and point = '1' then -- строб для области просмотра if (h_count < h_mode) and (v_count < v_mode) then screen <= '1'; else screen <= '1'; end if; -- строб для белой линии по краю для гарантии автоматического захвата изображения монитором if (((h_count = 0) or (h_count = (h_mode-1))) or (v_count = 0) or (v_count = v_mode-1)) and (h_count < h_mode) and (v_count < v_mode) then border_line <= '1'; else border_line <= '0'; end if; -- строчный синхросигнал (инвертированный, если надо) if (h_count > (h_mode + hs_size)) and (h_count < (h_size - hs_size)) then hsinc <= not invert_sh; else hsinc <= invert_sh; end if; -- кадровый синхросигнал if (v_count > (v_mode + vs_size)) and (v_count < (v_size - vs_size)) then vsinc <= '1'; else vsinc <= '0'; end if; -- тест вывода цветов if screen = '0' then -- черный за пределами экрана R_test <='0'; G_test <='0'; B_test <='0'; elsif border_line = '1' then -- белая окантовка R_test <='1'; G_test <='1'; B_test <='1'; else -- цветные квадратюки R_test <= h_count(6); G_test <= h_count(7); B_test <= v_count(6); end if; end if; end process; CTH <= h_count; CTV <= v_count; H_SINC <= hsinc; V_SINC <= vsinc; -- R_test <= border_line; -- G_test <= border_line; -- B_test <= border_line; LEDG <= (others => '0'); end; Тестировал его в квартусе и на альтеровком ките, потому что нa Xilinx еще не умею делать с помощью PLL нужные частоты. На вход модуля подаются несколько "пиксельных" частот для разных режимов. Переключателем SW выбирается режим, он же подключает нужную частоту на выход CLKo, которая снаружи модуля должна податься на вход CLKi через глобальную разводку в ПЛИС. В альтере - это буфер GLOBAL, в Xilinx - пока еще не знаю. |
Автор: | Hishnik [ Чт окт 28, 2010 02:25 ] |
Заголовок сообщения: | Re: Xilinx Spartan KIT SP601 |
http://www.msyst.ru/ISE_clkgen.pdf |
Страница 2 из 4 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |