Все вернулся я в проект. Начал описывать на VHDL синхрогенератор.
Кто силен в сием языке проверьте правильно ли я описал сам процесс формирования сигналов синхрогенератора.
Код:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity Devboard_z80 is
port(
-- Входная тактовая частота CLK
CLK_25MHZ : in std_logic;
-- Сигналы управления RAM памятью
MA : out std_logic_vector(18 downto 0) := "0000000000000000000";
MDL : inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
MDH : inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
WR_RAM_L : out std_logic := '1';
WR_RAM_H : out std_logic := '1';
-- Выходные сигналы видео формирователя
VD : out std_logic_vector(5 downto 0) := "000000";
HS : out std_logic := '1';
VS : out std_logic := '0';
-- Сигналы управления ROM памятью
ROM_A11 : out std_logic := '0';
ROM_A12 : out std_logic := '0';
ROM_A13 : out std_logic := '0';
ROM_A14 : out std_logic := '0';
ROM_A15 : out std_logic := '0';
ROM_A16 : out std_logic := '0';
ROM_A17 : out std_logic := '0';
ROM_A18 : out std_logic := '0';
CS_ROM : out std_logic := '1';
-- Сигналы управления с CPU
CA : in std_logic_vector(15 downto 0);
CD : inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
C_CLK : out std_logic := '1';
C_IORQ : in std_logic;
C_MREQ : in std_logic;
C_M1 : in std_logic;
C_RD : in std_logic;
C_WR : in std_logic;
-- Общие сигналы
C_RESET : in std_logic;
C_IORQGE : in std_logic;
C_INT : out std_logic := '1';
CS_DEV : out std_logic := '0';
-- Сигналы взаимодействия с AVR микроконтроллером
CS_AVR : out std_logic := '1';
C_MOSI : in std_logic;
C_SCK : in std_logic;
C_MISO : out std_logic := '1';
-- Сигналы SD Card
SD_CS : out std_logic := '1';
SD_SCK : out std_logic := '1';
SD_MOSI : out std_logic := '1';
SD_MISO : in std_logic
);
end Devboard_z80;
architecture rtl of Devboard_z80 is
signal Sync_count : std_logic_vector(2 downto 0); -- 3-х разрядный счетчик, сигналы H0, H1, H2
signal HSync_count : std_logic_vector(6 downto 0); -- 7-и разрядный счетчик строчной разверкти, сигналы H3..H9
signal VSync_count : std_logic_vector(8 downto 0); -- 9-и разрядный счетчик кадровый развертки, сигналы V0..V8
signal HBlank : std_logic; -- сигнал гашения видеосигнала строчный
signal VBlank : std_logic; -- сигнал гашения видеосигнала кадровый
signal HBorder : std_logic; -- сигнал строчного бордера
signal VBorder : std_logic; -- сигнал кадрового бордера
signal HSync : std_logic; -- строчный синхроимпульс
signal VSync : std_logic; -- кадровый синхроимпульс
-- Управляющие сигналы
signal IO_RD : std_logic := '1'; -- чтение из портов
signal IO_WR : std_logic := '1'; -- запись в порты
signal ROM_RD : std_logic := '1'; -- чтение из ПЗУ
signal ROM_WR : std_logic := '1'; -- запись в ПЗУ
signal AVR_SEL : std_logic := '1'; -- выбор AVR
signal ROM_SEL : std_logic := '1'; -- выбор ПЗУ
-- Регистр бордера
signal Border_Color_r : std_logic_vector(3 downto 0) := "0000";
-- Регистр страниц памятью
signal Video_Page_r : std_logic_vector(2 downto 0) := "000";
signal EnRAM_r : std_logic := '0'; -- Блокировка ОЗУ в 0000...3FFFh
signal EnROM_r : std_logic := '0'; -- Блокировка ПЗУ
signal RMode_r : std_logic := '0'; -- Режим отображения страниц памяти
signal EWROM_r : std_logic := '0'; -- Разрешение записи в FLASH ROM
-- Регистр страниц микросхемы ROM (64 страницы по 16кб)
signal RAM_PAGE_r : std_logic_vector(5 downto 0) := "000000";
-- Регистр страниц микросхемы ROM (64 страницы по 8кб)
signal ROM_PAGE_r : std_logic_vector(5 downto 0) := "000000";
begin
------------------------------------------------------------------------------------
-- Синхрогенератор
------------------------------------------------------------------------------------
-- Clock frequency 25.175 MHz
-- "640 x 400 VGA text"
-- Line frequency 31469 Hz
-- Field frequency 70.086 Hz
-- Sync polarity: H negative, V positive
-- Scan type: non interlaced.
------------------------------------------------------------------------------------
-- Системные сигналы
------------------------------------------------------------------------------------
Sync_system : process(CLK_25MHZ,C_RESET)
begin
if C_RESET = '0' then
Sync_count <= (others => '0');
elsif (CLK_25MHZ'event and CLK_25MHZ = '0') then
Sync_count <= Sync_count + '1';
end if;
end process Sync_system;
------------------------------------------------------------------------------------
-- Строчная развертка
------------------------------------------------------------------------------------
-- One line:
-- 8 pixels front porch
-- 96 pixels horizontal sync
-- 40 pixels back porch
-- 8 pixels left border
-- 640 pixels video
-- 8 pixels right border
------------------------------------------------------------------------------------
-- 800 pixels total per line
------------------------------------------------------------------------------------
-- Реализация
------------------------------------------------------------------------------------
-- 80 видимая часть
-- 1 правый бордер
-- 1 начало гасящего импульса
-- 12 строчный импульс
-- 5 конец гасящего импульса
-- 1 левый бордер
-- =
-- 100 сброс счетчиков строчной развертки
------------------------------------------------------------------------------------
Horizonal_sync : process(CLK_25MHZ,C_RESET)
begin
if C_RESET = '0' then
HSync_count <= (others => '0');
elsif (CLK_25MHZ'event and CLK_25MHZ = '0') then
if (Sync_count(2)'event and Sync_count(2) = '0') then
if HSync_count = 100 then
HSync_count <= (others => '0');
else
HSync_count <= HSync_count + '1';
end if;
if HSync_count >= 80 then
HBorder <= '0';
else
HBorder <= '1';
end if;
if (HSync_count >= 82 and HSync_count < 94) then
HSync <= '0';
else
HSync <= '1';
end if;
if (HSync_count >= 81 and HSync_count < 99) then
HBlank <= '0';
else
HBlank <= '1';
end if;
end if;
end if;
end process Horizonal_sync;
------------------------------------------------------------------------------------
-- Кадровая развертка
------------------------------------------------------------------------------------
-- One field:
-- 5 lines front porch
-- 2 lines vertical sync
-- 28 lines back porch
-- 7 lines top border
-- 400 lines video
-- 7 lines bottom border
------------------------------------------------------------------------------------
-- 449 lines total per field
------------------------------------------------------------------------------------
-- Реализация
------------------------------------------------------------------------------------
-- 400 видимая часть
-- 7 нижний бордер
-- 5 начало гасящего импульса
-- 2 кадровый импульс
-- 28 конец гасящего импульса
-- 7 верхний бордер
-- =
-- 449 сброс счетчиков строчной развертки
------------------------------------------------------------------------------------
Vertical_sync : process(CLK_25MHZ,C_RESET)
begin
if C_RESET = '0' then
VSync_count <= (others => '0');
elsif (CLK_25MHZ'event and CLK_25MHZ = '0') then
if (HSync_count(6)'event and HSync_count(6) = '0') then
if VSync_count = 449 then
VSync_count <= (others => '0');
else
VSync_count <= VSync_count + '1';
end if;
if VSync_count >= 400 then
VBorder <= '0';
else
VBorder <= '1';
end if;
if (VSync_count >= 412 and VSync_count < 414) then
VSync <= '0';
else
VSync <= '1';
end if;
if (VSync_count >= 407 and VSync_count < 442) then
VBlank <= '0';
else
VBlank <= '1';
end if;
end if;
end if;
end process Vertical_sync;
end;
За основу брал схему http://zx-pk.ru/showpost.php?p=578643&postcount=147
Если быть точнее счетчики 3 разряда - 7 разрядов - 9 разрядов