Все вернулся я в проект. Начал описывать на VHDL синхрогенератор.
Кто силен в сием языке проверьте правильно ли я описал сам процесс формирования сигналов синхрогенератора.
За основу брал схему http://zx-pk.ru/showpost.php?p=578643&postcount=147Код: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;
Если быть точнее счетчики 3 разряда - 7 разрядов - 9 разрядов![]()




Ответить с цитированием