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;
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. критика и замечания всячески приветствуются )))
Здесь, по моему or надо.Цитата:
blanc <= hblanc and vblanc;
логически их действительно нужно объединить по OR, но так как используется отрицательная логика то OR превратился в AND. )
приведённый код немного глючный - на скринах видно:
Нашёл в чём было дело :)
эту строку:
нужно заменить на:Код:hblanc <= '0' when hcount >= 512 else '1';
и всего делов, а то я с перепугу жменю статики перепроверил :v2_cool:Код:hblanc <= '1' when (hcount >= 1 and hcount < 513) else '0';
да и вот тут чуточку подправил:
Код:hsync <= '0' when (hcount >= 533 and hcount < 573) else '1';
Немного не в тему. Но может кто-нибудь сталкивался с кодером компонентного видео сигнала в 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;