1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-27 12:21:57 +00:00
Files
Gehstock.Mist_FPGA/Computer_MiST/OricInFPGA_MiST/rtl/memmap.vhd
2019-07-22 00:02:14 +02:00

79 lines
2.9 KiB
VHDL

--
-- memmap.vhd
--
-- Manage offset for read ula
--
-- Copyright (C)2001 - 2005 SEILEBOST
-- All rights reserved.
--
-- $Id: memmap.vhd, v0.02 2005/01/01 00:00:00 SEILEBOST $
--
-- TODO :
-- Remark :
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
--use IEEE.std_logic_arith.all;
--use IEEE.numeric_std.all;
entity memmap is
port ( TXTHIR_SEL : in std_logic;
DBLHGT_SEL : in std_logic;
FORCETXT : in std_logic;
CPT_H : in std_logic_vector(6 downto 0);
CPT_V : in std_logic_vector(8 downto 0);
VAP1 : out std_logic_vector(15 downto 0);
CHROWCNT : out std_logic_vector(2 downto 0);
TXTHIR_DEC : out std_logic
);
end entity memmap;
architecture memmap_arch of memmap is
signal lDBLHGT_EN : std_logic; -- ENABLE DOUBLE HEIGT
signal lTXTHIR_DEC : std_logic; -- MODE TEXT / HIRES
signal lCPT_V_TMP : std_logic_vector(8 downto 0); -- VERTICAL COUNTER
signal lCPT_V_8_TMP : std_logic_vector(8 downto 0); -- VERTICAL COUNTER DIVIDE OR NOT BY 8
signal lVAP1 : std_logic_vector(12 downto 0); -- VIDEO ADDRESS PHASE 1
signal lOFFSCR : std_logic_vector(15 downto 0); -- OFFSET SCREEN
signal ltmpBy10 : std_logic_vector(12 downto 0); -- Using to mult by 10
begin
-- local signal
lTXTHIR_DEC <= (TXTHIR_SEL and FORCETXT);
lDBLHGT_EN <= (DBLHGT_SEL and lTXTHIR_DEC);
-- Compute video adress phase 1
lCPT_V_TMP <= '0'&CPT_V(8 downto 1) when lDBLHGT_EN = '1' else CPT_V(8 downto 0);
-- divide by 8 if necessary : erreur sur la manière de diviser par 8? 03/02/2010
--lCPT_V_8_TMP <= lCPT_V_TMP when lTXTHIR_DEC = '1' else lCPT_V_TMP(8 downto 3) & "000";
lCPT_V_8_TMP <= lCPT_V_TMP when lTXTHIR_DEC = '1' else "000" & lCPT_V_TMP(8 downto 3) ;
-- 03/02/2010 : Le bonne blague : après la phase de synthese, le 'bench' ne
-- fonctionnait plus. Le synthetiseur de XILINX avait utilisé un multiplieur 18x18
-- pour générer la multiplication par 10 et la simulation a repris cela. Or le
-- multiplier a une latence de 1 µs (latence de l'horloge PHI2) d'où les problèmes
-- durant les simulations (génération de 2 fois de suite de l'adresse vidéo)
-- On revient à la bonne vieille méthode Bx10 = Bx8 + Bx2 !!
--lVAP1 <= ("0000000" & CPT_H) + (lCPT_V_8_TMP * "1010");
ltmpBy10 <= ("0" & lCPT_V_8_TMP & "000") + ("000" & lCPT_V_8_TMP & "0");
-- le décalage en Y : il faut multiplier par 40 donc 4 * ltmpBy10
lVAP1 <= ("00000" & CPT_H) + (ltmpBy10(10 downto 0) & "00");
lOFFSCR <= X"A000" when lTXTHIR_DEC = '1' else X"BB80";
VAP1 <= ("000" & lVAP1) + lOFFSCR;
-- Compute character row counter
CHROWCNT <= CPT_V(2 downto 0) when lDBLHGT_EN = '1' else CPT_V(3 downto 1);
-- Output signal for texte/hires mode decode
TXTHIR_DEC <= lTXTHIR_DEC;
end architecture memmap_arch;