vlad, Поподробнее
где посмотреть нужно?
vlad, Поподробнее
где посмотреть нужно?
vlad, цель - по изучать Плис,глянуть на языки программирования и поморгать светодиодами - всё как обычно.
Нужно что то простое -если не попрёт то будет просто валяться и нет смысла брать от 100$ и выше.
Вот думаю заказать платку у MICK http://zx.pk.ru/showthread.php?t=204...t=%CF%EB%E8%F1 но пугает CPLD - там идея жестко прошить 1 раз плис и баловаться с внешними картами на ZX-BUS.Зато Z80 есть и можно ножками подрыгать
Недавно только начал осваивать плисы и vhdl и как первый проект сделал видеоадаптер с выводом на телевизор.
есть такой код:
Возник такой вопрос - как на vhdl написать чтобы по чётным кадрам счётчик считал до 312, а по нечётным до 313.Код:if vcount = 312 then vcount <= "000000000"; else vcount <= vcount + 1; end if;
Думал сделать вот так:
выдает ошибку.Код:if vcount = 312 + vdiv then vcount <= "000000000"; vdiv <= not(vdiv); else vcount <= vcount + 1; end if;
Последний раз редактировалось shurik-ua; 28.04.2013 в 14:55.
if (vdiv = '0' and vcount = 312) or
(vdiv = '1' and vcount = 313) then
...
PS. vdiv='1' можно опустить...
хотелось придерживаться стандарта )
да пожалуйста ):
реализован режим 512 х 256 монохром, но код позволяет реализовать байт на точку - причём абсолютно прозрачно для проца (и любого устройства на шине)Код:library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity video1 is port( clock: in std_logic; -- 40 Mhz clock ram_data: inout std_logic_vector(7 downto 0) := "ZZZZZZZZ"; ram_addr: out std_logic_vector(15 downto 0); ram_wr: out std_logic; cpu_data: in std_logic_vector(7 downto 0); cpu_addr: in std_logic_vector(15 downto 0); cpu_wr: in std_logic; cpu_mreq: in std_logic; clk_out: out std_logic; int: out std_logic; sync: out std_logic; video: out std_logic ); end video1; architecture rtl of video1 is signal cnt: std_logic_vector(1 downto 0):="00"; signal hcount: std_logic_vector(9 downto 0); signal vcount: std_logic_vector(8 downto 0); signal hsync: std_logic; signal vsync: std_logic; signal hblanc: std_logic; signal vblanc: std_logic; signal blanc: std_logic; signal vid: std_logic; signal wr_video_ram: std_logic; signal temp_data: std_logic_vector(7 downto 0); signal temp_addr: std_logic_vector(13 downto 0); signal temp_video: std_logic_vector(7 downto 0); signal vdiv: std_logic; begin ------------------------------------------------------------ process(clock) --40 MHz begin if rising_edge(clock) then if wr_video_ram = '0' then temp_data <= cpu_data; temp_addr <= cpu_addr(13 downto 0); end if; cnt <= cnt + 1; if cnt(0) = '1' then temp_video <= ram_data; end if; if cnt = "00" then if hcount = 640 then hcount <= "0000000000"; if (vdiv='0' and vcount = 312) or vcount = 313 then vcount <= "000000000"; vdiv <= not(vdiv); else vcount <= vcount + 1; end if; else hcount <= hcount + 1; case hcount (2 downto 0) is when "000" => vid <= temp_video(7); when "001" => vid <= temp_video(6); when "010" => vid <= temp_video(5); when "011" => vid <= temp_video(4); when "100" => vid <= temp_video(3); when "101" => vid <= temp_video(2); when "110" => vid <= temp_video(1); when "111" => vid <= temp_video(0); end case; end if; end if; end if; end process; ------------------------------------------------------------ hsync <= '0' when (hcount >= 532 and hcount < 572) else '1'; vsync <= '0' when (vcount >= 276 and vcount < 284) else '1'; hblanc <= '0' when hcount >= 512 else '1'; vblanc <= '0' when vcount >= 256 else '1'; blanc <= hblanc and vblanc; sync <= hsync and vsync; video <= vid and blanc; --wr_video_ram <= cpu_mreq or cpu_wr or (cpu_addr(15) nand cpu_addr(14));--video ram starts at 0xC000 wr_video_ram <= cpu_mreq or cpu_wr or not(cpu_addr(14)) or cpu_addr(15);--video ram starts at 0x4000 ram_wr <= cnt(0); ram_data <= temp_data when cnt(0) = '0' else "ZZZZZZZZ"; ram_addr(7 downto 0) <= vcount(7 downto 0) when cnt(0) = '1' else temp_addr(7 downto 0); ram_addr(13 downto 8) <= hcount(8 downto 3) when cnt(0) = '1' else temp_addr(13 downto 8); ram_addr(15 downto 14) <= "00"; int <= vsync; clk_out <= cnt(0); ------------------------------------------------------------ end rtl;
всё опробовано в железе и прекрасно работает )
скрины:
1. скриншот с тюнера.
2. исходная картинка.
P.S. критика и замечания всячески приветствуются )))
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Здесь, по моему or надо.blanc <= hblanc and vblanc;
Робик 1024(пентагоновские тайминги),+ 7Мц+, 2AY(TS),+ контроллер дисковода,+ 3.5,+ 5.25 флоп,+CMOS,+ mouse(caro),+ Flash.
Pentagon 128(1991г.)+YМ
программатор 2732-27512.
логически их действительно нужно объединить по OR, но так как используется отрицательная логика то OR превратился в AND. )
приведённый код немного глючный - на скринах видно:
Нашёл в чём было дело
эту строку:
нужно заменить на:Код:hblanc <= '0' when hcount >= 512 else '1';
и всего делов, а то я с перепугу жменю статики перепроверилКод:hblanc <= '1' when (hcount >= 1 and hcount < 513) else '0';
да и вот тут чуточку подправил:
Код:hsync <= '0' when (hcount >= 533 and hcount < 573) else '1';
Последний раз редактировалось shurik-ua; 29.04.2013 в 14:35.
Немного не в тему. Но может кто-нибудь сталкивался с кодером компонентного видео сигнала в VGA. Интересуюсь по поводу встраивания данного кодера в проект на ПЛИС ПК "Галаксия".
этот формат выбран из-за удобства программирования именно на 8-мибитных процессорах.
все эти форматы с соотношением сторон 4:3 потихоньку устаревают, мониторы и телевизоры сейчас выпускаются в основном широкоформатные 16:9 или 16:10.
на тюнере я выставил пропорции экрана 16:9 и картинка выглядит абсолютно симметричной - просто тюнер сохраняет только с такими пропорциями.
кстати пока писал этот ответ придумал, что если тактировать схему 32 MHz кварцем и изменить несколько констант в коде то получим режим 384х256 - что можно использовать как компромисс для любителей "квадратных" пропорций. ))
Да и вот ещё - в будущем планирую подключить Циклон какой нибудь и 3128 использовать как преобразователь уровней - в проекте Reverse есть что-то похожее, но исходников не нашёл. Так как я ещё начинающий - могу ошибиться , вот взгляните на код - покритикуйте:
Код:library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity extender is port ( dir: in std_logic; cpu_adr: inout std_logic_vector(15 downto 0); adr: inout std_logic_vector(15 downto 0); cpu_data: inout std_logic_vector(7 downto 0); data: inout std_logic_vector(7 downto 0); wr,rd,mreq,iorq,m1: inout std_logic; busrq,cpu_busak: in std_logic; int,nmi,clock,reset,wait0: in std_logic; cpu_int,cpu_nmi,cpu_clock: out std_logic; cpu_busrq,busak: out std_logic; cpu_reset,cpu_wait0: out std_logic; cpu_wr,cpu_rd,cpu_mreq,cpu_iorq,cpu_m1: inout std_logic); end extender; architecture ext of extender is begin cpu_clock <= clock; cpu_int <= int; cpu_nmi <= nmi; cpu_reset <= reset; cpu_wait0 <= wait0; cpu_busrq <= busrq; busak <= cpu_busak; mreq <= cpu_mreq when cpu_busak = '1' else 'Z'; cpu_mreq <= mreq when cpu_busak = '0' else 'Z'; iorq <= cpu_iorq when cpu_busak = '1' else 'Z'; cpu_iorq <= iorq when cpu_busak = '0' else 'Z'; wr <= cpu_wr when cpu_busak = '1' else 'Z'; cpu_wr <= wr when cpu_busak = '0' else 'Z'; rd <= cpu_rd when cpu_busak = '1' else 'Z'; cpu_rd <= rd when cpu_busak = '0' else 'Z'; m1 <= cpu_m1 when cpu_busak = '1' else 'Z'; cpu_m1 <= m1 when cpu_busak = '0' else 'Z'; data <= cpu_data when dir = '1' else "ZZZZZZZZ"; cpu_data <= data when dir = '0' else "ZZZZZZZZ"; adr <= cpu_adr when cpu_busak = '1' else "ZZZZZZZZZZZZZZZZ"; cpu_adr <= adr when cpu_busak = '0' else "ZZZZZZZZZZZZZZZZ"; end ext;
Последний раз редактировалось shurik-ua; 30.04.2013 в 10:04.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)