
Сообщение от
zebest
Ps? а зачем так сложно, ну и пусть и четный и нечетный будут одинаковы. Не?
хотелось придерживаться стандарта )

Сообщение от
zebest
Кидай проект, посмотрим...
да пожалуйста ):
Код:
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;
реализован режим 512 х 256 монохром, но код позволяет реализовать байт на точку - причём абсолютно прозрачно для проца (и любого устройства на шине)
всё опробовано в железе и прекрасно работает )
скрины:
1. скриншот с тюнера.
2. исходная картинка.
P.S. критика и замечания всячески приветствуются )))