User Tag List

Показано с 1 по 10 из 330

Тема: Любительская девборда на Z80

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    14.06.2005
    Адрес
    г. Калуга
    Сообщений
    10,141
    Спасибо Благодарностей отдано 
    216
    Спасибо Благодарностей получено 
    769
    Поблагодарили
    417 сообщений
    Mentioned
    23 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Все вернулся я в проект. Начал описывать на 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 разрядов
    Последний раз редактировалось Mick; 15.07.2013 в 14:09.
    Сайт поддержки моих изделий - http://micklab.ru/
    Группа ВКонтакте - https://vk.com/micklab

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Прикольная девборда... для спека в самый раз :)
    от ILoveSpeccy в разделе Несортированное железо
    Ответов: 12
    Последнее: 15.08.2008, 07:06

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •