Advertisement
andreil

Orion-128 main body

Jan 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 19.19 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  4.  
  5. entity orion is
  6.     port (
  7.         CLOCK_50        : in  std_logic;
  8.        
  9.         SW              : in std_logic_vector(9 downto 0);
  10.         KEY         : in std_logic_vector(3 downto 0);
  11.        
  12.         LEDR            : out std_logic_vector(9 downto 0);
  13.        
  14.         HEX0            : out std_logic_vector(6 downto 0);
  15.         HEX1            : out std_logic_vector(6 downto 0);
  16.         HEX2            : out std_logic_vector(6 downto 0);
  17.         HEX3            : out std_logic_vector(6 downto 0);
  18.         HEX4            : out std_logic_vector(6 downto 0);
  19.         HEX5            : out std_logic_vector(6 downto 0);
  20.        
  21.         VGA_R           : out std_logic_vector(7 downto 0);
  22.         VGA_G           : out std_logic_vector(7 downto 0);
  23.         VGA_B           : out std_logic_vector(7 downto 0);
  24.         VGA_BLANK_N : out std_logic;
  25.         VGA_CLK     : out std_logic;
  26.         VGA_HS      : out std_logic;
  27.         VGA_SYNC_N  : out std_logic;
  28.         VGA_VS      : out std_logic
  29.     );
  30. end entity;
  31.  
  32. architecture rtl of orion is
  33.  
  34.     component orion_pll is
  35.         port (
  36.             refclk   : in  std_logic := 'X'; -- clk
  37.             rst      : in  std_logic := 'X'; -- reset
  38.             outclk_0 : out std_logic;        -- clk 10MHz
  39.             outclk_1 : out std_logic         -- clk 100MHz
  40.         );
  41.     end component orion_pll;
  42.    
  43.     component pll is
  44.         port (
  45.             refclk   : in  std_logic := 'X'; -- clk
  46.             rst      : in  std_logic := 'X'; -- reset
  47.             outclk_0 : out std_logic         -- clk 148.5MHz
  48.         );
  49.     end component pll;
  50.    
  51.     component vga
  52.     port
  53.     (
  54.         clk     :    in std_logic;
  55.         clk_10  :    in std_logic;
  56.        
  57.         /*SSI       :    in std_logic;
  58.         KSI     :    in std_logic;
  59.         R           :    in std_logic;
  60.         G           :    in std_logic;
  61.         B           :    in std_logic;
  62.         I           :    in std_logic;*/
  63.         vaddr       :    in std_logic_vector(15 downto 0);
  64.         vdata       :    in std_logic_vector(15 downto 0);
  65.        
  66.         reset_n :    in std_logic;
  67.        
  68.         vga_r       :    out std_logic_vector(7 downto 0);
  69.         vga_g       :    out std_logic_vector(7 downto 0);
  70.         vga_b       :    out std_logic_vector(7 downto 0);
  71.         hsync       :    out std_logic;
  72.         vsync       :    out std_logic;
  73.         blank_n :    out std_logic
  74.     );
  75.     end component;
  76.  
  77.     component debounce
  78.         generic (
  79.             WIDTH : INTEGER := 14;
  80.             POLARITY : STRING := "HIGH";
  81.             TIMEOUT : INTEGER := 50000;
  82.             TIMEOUT_WIDTH : INTEGER := 20
  83.         );
  84.         port
  85.         (
  86.             clk     :   in std_logic;
  87.             reset_n :   in std_logic;
  88.             data_in :   in std_logic_vector(WIDTH-1 downto 0);
  89.             data_out    :   out std_logic_vector(WIDTH-1 downto 0)
  90.         );
  91.     end component;
  92.  
  93.     component hex_led
  94.         port (
  95.             clk     : in    std_logic;
  96.             reset_n : in    std_logic;
  97.             hex_code    : in    std_logic_vector(3 downto 0);
  98.             hex_led : out   std_logic_vector(6 downto 0)
  99.         );
  100.     end component;
  101.  
  102.     component vm80a
  103.         port
  104.         (
  105.             pin_clk     :    in std_logic;
  106.             pin_f1      :    in std_logic;
  107.             pin_f2      :    in std_logic;
  108.             pin_reset   :    in std_logic;
  109.             pin_a           :    out std_logic_vector(15 downto 0);
  110.             pin_d           :    inout std_logic_vector(7 downto 0);
  111.             pin_hold        :    in std_logic;
  112.             pin_hlda        :    out std_logic;
  113.             pin_ready   :    IN std_logic;
  114.             pin_wait        :    out std_logic;
  115.             pin_int     :    in std_logic;
  116.             pin_inte        :    out std_logic;
  117.             pin_sync        :    out std_logic;
  118.             pin_dbin        :    out std_logic;
  119.             pin_wr_n        :    out std_logic
  120.         );
  121.     end component;
  122.  
  123.     component rom_base
  124.         port
  125.         (
  126.             address : in  std_logic_vector(10 downto 0);
  127.             clock       : in  std_logic;
  128.             rden        : in  std_logic;
  129.             q           : out std_logic_vector(7 downto 0)
  130.         );
  131.     end component;
  132.  
  133.     component ram_base
  134.         port
  135.         (
  136.             address : in  std_logic_vector(15 downto 0);
  137.             clock       : in  std_logic;
  138.             data        : in std_logic_vector(7 downto 0);
  139.             wren        : in  std_logic;
  140.             q           : out std_logic_vector(7 downto 0)
  141.         );
  142.     end component;
  143.  
  144. --------------------------------------------------------------------------------
  145. --                          ГЛОБАЛЬНЫЕ СИГНАЛЫ                                --
  146. --------------------------------------------------------------------------------
  147. signal clk_50MHz            : std_logic;
  148. signal clk_10MHz            : std_logic;
  149. signal clk_100MHz           : std_logic;
  150. signal clk_148_5MHz     : std_logic;
  151.  
  152. signal debounced            : std_logic_vector(13 downto 0);
  153. signal KEY_debounced        : std_logic_vector(3 downto 0);
  154. signal SW_debounced     : std_logic_vector(9 downto 0);
  155.  
  156. --------------------------------------------------------------------------------
  157. --                  СИГНАЛЫ ДЛЯ ФОРМИРОВАНИЯ ВИДЕОСИГНАЛА                     --
  158. --------------------------------------------------------------------------------
  159. signal vram_read            : std_logic;                            -- переключение адресации памяти на видео
  160. signal vram_addr            : std_logic_vector(15 downto 0);    -- адрес для чтения из видеопамяти
  161. signal vram_nib_addr        : std_logic_vector(15 downto 0);
  162. signal vram_buf00           : std_logic_vector( 7 downto 0); -- данные, прочитанные из 0-ого банка
  163. signal vram_buf01           : std_logic_vector( 7 downto 0); -- данные, прочитанные из 1-ого банка
  164. signal vram_buf10           : std_logic_vector( 7 downto 0);
  165. signal vram_buf11           : std_logic_vector( 7 downto 0);
  166. signal vram_data            : std_logic_vector(15 downto 0);    -- преобразованные пиксели (4 пикселя)
  167. signal vram_bank_idx        : std_logic_vector( 1 downto 0); -- номер банка памяти
  168. signal vram_bank_idx_tmp: std_logic_vector( 1 downto 0) := "11";
  169.  
  170.  
  171. signal video_frame_end  : std_logic;
  172.  
  173. constant VIDEO_PXL_IN_LINE      : std_logic_vector(8 downto 0) := 9X"17f";  -- 384 пикселя в строке
  174. constant VIDEO_LINE_IN_FRAME    : std_logic_vector(8 downto 0) := 9X"ff";       -- 256 строк в кадре
  175.  
  176. --------------------------------------------------------------------------------
  177. --                             СИГНАЛЫ ПАМЯТИ                                 --
  178. --------------------------------------------------------------------------------
  179. signal ram_addr         : std_logic_vector(15 downto 0);
  180. signal ram_we0_n            : std_logic;
  181. signal ram_re0_n            : std_logic;
  182. signal ram_data_wr0     : std_logic_vector( 7 downto 0);
  183. signal ram_data_rd0     : std_logic_vector( 7 downto 0);
  184. signal ram_we1_n            : std_logic;
  185. signal ram_re1_n            : std_logic;
  186. signal ram_data_wr1     : std_logic_vector( 7 downto 0);
  187. signal ram_data_rd1     : std_logic_vector( 7 downto 0);
  188.  
  189.  
  190. signal clk_F1               : std_logic;
  191. signal clk_F2               : std_logic;
  192.  
  193. --------------------------------------------------------------------------------
  194. --                         ВНЕШНИЕ СИГНАЛЫ ОРИОНА                             --
  195. --------------------------------------------------------------------------------
  196. signal or_reset_btn     : std_logic;
  197. signal or_ready         : std_logic := '1';
  198.  
  199. --------------------------------------------------------------------------------
  200. --                       ВНУТРЕННИЕ СИГНАЛЫ ОРИОНА                            --
  201. --------------------------------------------------------------------------------
  202. signal clock_cnt_0      : std_logic_vector(8 downto 0) := 9X"0";
  203. signal clock_ovf_0      : std_logic;
  204. signal clock_cnt_1      : std_logic_vector(8 downto 0) := 9X"0";
  205.  
  206. signal reset_p              : std_logic;
  207. signal reset_n              : std_logic;
  208. signal cpu_ready            : std_logic;
  209. signal cpu_int              : std_logic;
  210. signal cpu_int_n            : std_logic;
  211. signal cpu_inte         : std_logic;
  212. signal cpu_inte_n           : std_logic;
  213. signal cpu_sync         : std_logic;
  214. signal cpu_hlda         : std_logic := '0';
  215. signal cpu_rd               : std_logic;
  216. signal cpu_rd_n         : std_logic;
  217. signal cpu_wr               : std_logic;
  218. signal cpu_wr_n         : std_logic;
  219. signal bus_addr         : std_logic_vector(17 downto 0);
  220. signal bus_data         : std_logic_vector( 7 downto 0);
  221.  
  222. signal addr_FXXX            : std_logic;
  223. signal addr_F4XX            : std_logic;
  224. signal addr_F8XX            : std_logic;
  225.  
  226. signal dsyn_p               : std_logic;
  227. signal dsyn_n               : std_logic;
  228.  
  229. signal rom_re               : std_logic;
  230. signal rom_data         : std_logic_vector( 7 downto 0);
  231.  
  232. signal port_F800            : std_logic_vector(3 downto 0); -- управление цветом
  233. signal port_F900            : std_logic_vector(1 downto 0); -- управление страницами памяти
  234. signal port_FA00            : std_logic_vector(1 downto 0); -- управление экранными облястями
  235. --signal port_FB00          : std_logic_vector(2 downto 0); -- резерв
  236.  
  237. signal mem_addr         : std_logic_vector(15 downto 0);
  238. signal mem_addr_hi      : std_logic_vector( 1 downto 0);
  239. signal mem_wdata0           : std_logic_vector( 7 downto 0);
  240. signal mem_rdata0           : std_logic_vector( 7 downto 0);
  241. signal mem_wdata1           : std_logic_vector( 7 downto 0);
  242. signal mem_rdata1           : std_logic_vector( 7 downto 0);
  243. signal mem_wdata2           : std_logic_vector( 7 downto 0);
  244. signal mem_rdata2           : std_logic_vector( 7 downto 0);
  245. signal mem_wdata3           : std_logic_vector( 7 downto 0);
  246. signal mem_rdata3           : std_logic_vector( 7 downto 0);
  247. signal mem_we               : std_logic;
  248. signal mem_we_bank      : std_logic;
  249. signal mem_we_bank_0        : std_logic;
  250. signal mem_we_bank_1        : std_logic;
  251. signal mem_we_bank_2        : std_logic;
  252. signal mem_we_bank_3        : std_logic;
  253. signal mem_cs_bank      : std_logic;
  254. signal mem_cs_bank_0        : std_logic;
  255. signal mem_cs_bank_1        : std_logic;
  256. signal mem_cs_bank_2        : std_logic;
  257. signal mem_cs_bank_3        : std_logic;
  258.  
  259. signal sel_CSROM            : std_logic;
  260. signal sel_CSROM_n      : std_logic;
  261. signal sel_port_F4XX        : std_logic;
  262. signal sel_port_F400        : std_logic;
  263. signal sel_port_F500        : std_logic;
  264. signal sel_port_F600        : std_logic;
  265. signal sel_port_F700        : std_logic;
  266. signal sel_port_F8XX        : std_logic;
  267. signal sel_port_F800        : std_logic;
  268. signal sel_port_F900        : std_logic;
  269. signal sel_port_FA00        : std_logic;
  270. signal sel_port_FB00        : std_logic;
  271.  
  272. begin
  273. --------------------------------------------------------------------------------
  274. --                       СВЯЗЬ СИГНАЛОВ С ПИНАМИ МС                           --
  275. --------------------------------------------------------------------------------
  276. clk_50MHz <= CLOCK_50;
  277. or_reset_btn <= KEY_debounced(0);
  278. LEDR(0) <= clk_10MHz;
  279. LEDR(1) <= clk_F1;
  280. LEDR(2) <= clk_F2;
  281. LEDR(3) <= '0';
  282. LEDR(4) <= '0';
  283. LEDR(5) <= '0';
  284. LEDR(6) <= '0';
  285. LEDR(7) <= '0';
  286. LEDR(8) <= '0';
  287. LEDR(9) <= '0';
  288.  
  289. cpu_int <= not cpu_int_n;
  290. cpu_inte_n <= not cpu_inte;
  291. cpu_wr <= not cpu_wr_n;
  292. cpu_rd_n <= cpu_rd;
  293.  
  294. --------------------------------------------------------------------------------
  295. --                      ПОДКЛЮЧЕНИЕ ВНЕШНИХ МОДУЛЕЙ                           --
  296. --------------------------------------------------------------------------------
  297. -- основной PLL
  298. pll_orion: orion_pll
  299.     port map (
  300.         clk_50MHz,
  301.         '0',
  302.         clk_10MHz,
  303.         clk_100MHz
  304.     );
  305.  
  306. -- PLL для видеовыхода
  307. pll_vga: pll
  308.     port map (
  309.         clk_50MHz,
  310.         '0',
  311.         clk_148_5MHz
  312.     );
  313.  
  314. -- фильтр дребезга контактов
  315. deb: debounce
  316.     port map (
  317.         clk_10MHz,
  318.         '1',
  319.         KEY & SW,
  320.         debounced
  321.     );
  322. KEY_debounced <= debounced(13 downto 10);
  323. SW_debounced  <= debounced(9 downto 0);
  324.  
  325. h0: hex_led
  326.     port map (
  327.         clk_10MHz,
  328.         reset_n,
  329.         bus_addr(3 downto 0),
  330.         HEX0
  331.     );
  332.  
  333. h1: hex_led
  334.     port map (
  335.         clk_10MHz,
  336.         reset_n,
  337.         bus_addr(7 downto 4),
  338.         HEX1
  339.     );
  340.  
  341. h2: hex_led
  342.     port map (
  343.         clk_10MHz,
  344.         reset_n,
  345.         bus_addr(11 downto 8),
  346.         HEX2
  347.     );
  348.  
  349. h3: hex_led
  350.     port map (
  351.         clk_10MHz,
  352.         reset_n,
  353.         bus_addr(15 downto 12),
  354.         HEX3
  355.     );
  356.  
  357. h4: hex_led
  358.     port map (
  359.         clk_10MHz,
  360.         reset_n,
  361.         bus_data(3 downto 0),
  362.         HEX4
  363.     );
  364.  
  365. h5: hex_led
  366.     port map (
  367.         clk_10MHz,
  368.         reset_n,
  369.         bus_data(7 downto 4),
  370.         HEX5
  371.     );
  372.  
  373. video: vga
  374.     port map (
  375.         clk_148_5MHz,
  376.         clk_10MHz,
  377.  
  378.         vram_nib_addr,
  379.         vram_data,
  380.  
  381.         reset_n,
  382.  
  383.         VGA_R,
  384.         VGA_G,
  385.         VGA_B,
  386.         VGA_HS,
  387.         VGA_VS,
  388.         VGA_BLANK_N
  389.     );
  390.  
  391. VGA_SYNC_N <= '0';
  392. VGA_CLK <= clk_148_5MHz;
  393.  
  394. cpu: vm80a
  395.     port map (
  396.         pin_clk     => clk_10MHz,
  397.         pin_f1      => clk_F1,
  398.         pin_f2      => clk_F2,
  399.         pin_reset   => reset_p,
  400.         pin_a           => bus_addr(15 downto 0),
  401.         pin_d           => bus_data,
  402.         pin_hold        => '0',
  403.         pin_hlda        => cpu_hlda,
  404.         pin_ready   => cpu_ready,
  405.         pin_int     => cpu_int,
  406.         pin_inte        => cpu_inte,
  407.         pin_sync        => cpu_sync,
  408.         pin_dbin        => cpu_rd,
  409.         pin_wr_n        => cpu_wr_n
  410.     );
  411.  
  412. rom: rom_base
  413.     port map (
  414.         bus_addr(10 downto 0),
  415.         clk_10MHz,
  416.         rom_re,
  417.         rom_data
  418.     );
  419. rom_re <= sel_CSROM and cpu_rd;
  420. bus_data <= rom_data when (rom_re = '1')
  421.     else (others => 'Z');
  422.  
  423. ram0: ram_base
  424.     port map
  425.     (
  426.         mem_addr,
  427.         clk_10MHz,
  428.         mem_wdata0,
  429.         mem_we_bank_0,
  430.         mem_rdata0
  431.     );
  432. mem_wdata0 <= bus_data when ((mem_cs_bank_0 = '1') and (cpu_rd = '0'))
  433.             else (others => 'Z');
  434. bus_data <= mem_rdata0 when ((mem_cs_bank_0 = '1') and (cpu_rd = '1'))
  435.             else (others => 'Z');
  436.  
  437. ram1: ram_base
  438.     port map
  439.     (
  440.         mem_addr,
  441.         clk_10MHz,
  442.         mem_wdata1,
  443.         mem_we_bank_1,
  444.         mem_rdata1
  445.     );
  446. mem_wdata1 <= bus_data when ((mem_cs_bank_1 = '1') and (cpu_rd = '0'))
  447.             else (others => 'Z');
  448. bus_data <= mem_rdata1 when ((mem_cs_bank_1 = '1') and (cpu_rd = '1'))
  449.             else (others => 'Z');
  450.  
  451. --------------------------------------------------------------------------------
  452. --                    ФОРМИРОВАНИЕ ТАКТОВЫХ СИГНАЛОВ                          --
  453. --------------------------------------------------------------------------------
  454.  
  455.     process (clk_10MHz)
  456.     begin
  457.         if (rising_edge(clk_10MHz)) then
  458.             if (clock_cnt_0 = VIDEO_PXL_IN_LINE) then
  459.                 clock_ovf_0 <= '1';
  460.                 clock_cnt_0 <= 9X"0";
  461.             else
  462.                 clock_ovf_0 <= '0';
  463.                 clock_cnt_0 <= clock_cnt_0 + '1';
  464.             end if;
  465.         end if;
  466.     end process;
  467.  
  468. clk_F1 <= (clock_cnt_0(0) and clock_cnt_0(1));
  469. clk_F2 <= (not clock_cnt_0(1));
  470.  
  471.     process (clock_ovf_0)
  472.     begin
  473.         if (rising_edge(clock_ovf_0)) then
  474.             if (clock_cnt_1 = VIDEO_LINE_IN_FRAME) then
  475.                 clock_cnt_1 <= 9X"0";
  476.                 video_frame_end <= '1';
  477.             else
  478.                 clock_cnt_1 <= clock_cnt_1 + '1';
  479.                 video_frame_end <= '0';
  480.             end if;
  481.         end if;
  482.     end process;
  483.  
  484. vram_nib_addr <= '0' & clock_cnt_1(7 downto 0) & clock_cnt_0(8 downto 2);
  485. vram_addr <= vram_bank_idx & clock_cnt_0(8 downto 3) & clock_cnt_1(7 downto 0);
  486.  
  487. --------------------------------------------------------------------------------
  488. --                      ФОРМИРОВАНИЕ ВИДЕО-СИГНАЛОВ                           --
  489. --------------------------------------------------------------------------------
  490.  
  491. mem_addr <= vram_addr when (dsyn_p = '0')
  492.     else bus_addr(15 downto 0);
  493.  
  494.     -- DD48, DD48 - занесение данных в первый буффер
  495.     process (clk_10MHz)
  496.     begin
  497.         if (rising_edge(clk_10MHz)) then
  498.             if (dsyn_p = '0') then
  499.                 --vram_buf00 <= mem_rdata0;
  500.                 vram_buf00 <= SW_debounced(9 downto 2);
  501.                 vram_buf01 <= mem_rdata1;
  502.             end if;
  503.         end if;
  504.     end process;
  505.  
  506.     -- DD51, DD52 - занесение данных во 2-ой буффер
  507.     process (clk_10MHz)
  508.     begin
  509.         if (rising_edge(clk_10MHz)) then
  510.             if (clock_cnt_0(2 downto 0) = "111") then
  511.                 vram_buf10 <= vram_buf00;
  512.                
  513.                 if (port_F800(2) = '0') then
  514.                     vram_buf11 <= (others => '0');
  515.                 elsif (port_F800(1) = '0') then
  516.                     vram_buf11 <= vram_buf01;
  517.                 end if;
  518.             end if;
  519.         end if;
  520.     end process;
  521.  
  522.     -- формирование цветов для 4-х пикселей
  523. vram_data(15) <= '0';   -- I
  524. vram_data(14) <= '0';   -- B
  525. vram_data(13) <= vram_buf10(7) when (clock_cnt_0(2) = '0')  -- G
  526.                 else vram_buf10(3);
  527. vram_data(12) <= '0';   -- R
  528. vram_data(11) <= '0';   -- I
  529. vram_data(10) <= '0';   -- B
  530. vram_data( 9) <= vram_buf10(6) when (clock_cnt_0(2) = '0')  -- G
  531.                 else vram_buf10(2);
  532. vram_data( 8) <= '0';   -- R
  533. vram_data( 7) <= '0';   -- I
  534. vram_data( 6) <= '0';   -- B
  535. vram_data( 5) <= vram_buf10(5) when (clock_cnt_0(2) = '0')  -- G
  536.                 else vram_buf10(1);
  537. vram_data( 4) <= '0';   -- R
  538. vram_data( 3) <= '0';   -- I
  539. vram_data( 2) <= '0';   -- B
  540. vram_data( 1) <= vram_buf10(4) when (clock_cnt_0(2) = '0')  -- G
  541.                 else vram_buf10(0);
  542. vram_data( 0) <= '0';   -- R
  543.  
  544. --------------------------------------------------------------------------------
  545. --                            ОБРАБОТКА ПОРТОВ                                --
  546. --------------------------------------------------------------------------------
  547.  
  548. addr_FXXX <= bus_addr(12) and bus_addr(13) and bus_addr(14) and bus_addr(15);
  549. addr_F4XX <= addr_FXXX and bus_addr(10);
  550. addr_F8XX <= addr_FXXX and bus_addr(11);
  551. sel_CSROM <= addr_F8XX or (not port_F800(3));
  552.  
  553. sel_CSROM_n      <= not sel_CSROM;
  554.  
  555.     -- DD18.1 - переключение страниц памяти
  556.     process (clk_10MHz)
  557.     begin
  558.         if (rising_edge(clk_10MHz)) then
  559.             if (sel_port_F900 = '1') then
  560.                 bus_addr(16) <= bus_data(0);
  561.                 bus_addr(17) <= bus_data(1);
  562.             end if;
  563.         end if;
  564.     end process;
  565.  
  566.     -- DD18.2
  567.     process (clk_10MHz)
  568.     begin
  569.         if (rising_edge(clk_10MHz)) then
  570.             if (clk_F2 = '1') then
  571.                 reset_p <= not or_reset_btn;
  572.                 reset_n <= or_reset_btn;
  573.  
  574.                 cpu_ready <= or_ready;
  575.             end if;
  576.         end if;
  577.     end process;
  578.  
  579.     -- DD13.2
  580.     process (clk_F2)
  581.     begin
  582.         if (rising_edge(clk_F2)) then
  583.             dsyn_p <= cpu_sync;
  584.             dsyn_n <= not cpu_sync;
  585.         end if;
  586.     end process;
  587.  
  588.     -- DD29 - управление банками памяти
  589. mem_addr_hi(0) <= bus_addr(16) and (not addr_FXXX);
  590. mem_addr_hi(1) <= bus_addr(17) and (not addr_FXXX);
  591. mem_we <= clk_F2 and (not cpu_rd);
  592. mem_cs_bank <= dsyn_p and sel_CSROM and (not addr_F4XX);
  593.     mem_cs_bank_0 <= '1' when ((mem_addr_hi = "00") and (mem_cs_bank = '1'))
  594.                     else '0';
  595.     mem_cs_bank_1 <= '1' when ((mem_addr_hi = "01") and (mem_cs_bank = '1'))
  596.                     else '0';
  597.     mem_cs_bank_2 <= '1' when ((mem_addr_hi = "10") and (mem_cs_bank = '1'))
  598.                     else '0';
  599.     mem_cs_bank_3 <= '1' when ((mem_addr_hi = "11") and (mem_cs_bank = '1'))
  600.                     else '0';
  601. mem_we_bank <= dsyn_p and mem_we;
  602.     mem_we_bank_0 <= '1' when ((mem_addr_hi = "00") and (mem_we_bank = '1'))
  603.                     else '0';
  604.     mem_we_bank_1 <= '1' when ((mem_addr_hi = "01") and (mem_we_bank = '1'))
  605.                     else '0';
  606.     mem_we_bank_2 <= '1' when ((mem_addr_hi = "10") and (mem_we_bank = '1'))
  607.                     else '0';
  608.     mem_we_bank_3 <= '1' when ((mem_addr_hi = "11") and (mem_we_bank = '1'))
  609.                     else '0';
  610.  
  611. -- DD27 - дешифратор портов
  612. sel_port_F4XX <= addr_F4XX and (not sel_CSROM);
  613.     sel_port_F400 <= '1' when ((sel_port_F4XX = '1') and (bus_addr(9 downto 0) = "00"))
  614.                     else '0';
  615.     sel_port_F500 <= '1' when ((sel_port_F4XX = '1') and (bus_addr(9 downto 0) = "01"))
  616.                     else '0';
  617.     sel_port_F600 <= '1' when ((sel_port_F4XX = '1') and (bus_addr(9 downto 0) = "10"))
  618.                     else '0';
  619.     sel_port_F700 <= '1' when ((sel_port_F4XX = '1') and (bus_addr(9 downto 0) = "11"))
  620.                     else '0';
  621. sel_port_F8XX <= mem_we_bank_0 and sel_CSROM;
  622.     sel_port_F800 <= '1' when ((sel_port_F8XX = '1') and (bus_addr(9 downto 0) = "00"))
  623.                     else '0';
  624.     sel_port_F900 <= '1' when ((sel_port_F8XX = '1') and (bus_addr(9 downto 0) = "01"))
  625.                     else '0';
  626.     sel_port_FA00 <= '1' when ((sel_port_F8XX = '1') and (bus_addr(9 downto 0) = "10"))
  627.                     else '0';
  628.     sel_port_FB00 <= '1' when ((sel_port_F8XX = '1') and (bus_addr(9 downto 0) = "11"))
  629.                     else '0';
  630.  
  631.     -- DD28 - переключение экранных областей
  632.     process (clk_10MHz)
  633.     begin
  634.         if (rising_edge(clk_10MHz)) then
  635.             if (sel_port_FA00 = '1') then
  636.                 vram_bank_idx_tmp <= bus_data(1 downto 0);
  637.             end if;
  638.            
  639.             if (video_frame_end = '1') then
  640.                 vram_bank_idx <= vram_bank_idx_tmp;
  641.             end if;
  642.         end if;
  643.     end process;
  644.  
  645.     -- DD30 - управление цветом
  646.     process (reset_n, sel_port_F800)
  647.     begin
  648.         if (reset_n = '0') then
  649.             port_F800 <= "0000";
  650.         elsif (rising_edge(sel_port_F800)) then
  651.             port_F800 <= '1' & bus_data(2 downto 0);
  652.         end if;
  653.     end process;
  654. end rtl;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement