nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 07:35



Reply to topic  [ 53 posts ]  Go to page Previous  1, 2, 3, 4
Real i8085 + Xilinx CPLDs + 2 * SIMM30 = Orionix :) 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Пока прикидываю неразогнанный двухсимовый вариант для 5 МГц:
Code:
   |      T 1      |      T 2      |      T 3      |      T 4      |
        ___     ___     ___     ___     ___     ___     ___     ___
PIX ___/   \___/   \___/   \___/   \___/   \___/   \___/   \___/
            _______         _______         _______         _______
CLK _______/       \_______/       \_______/       \_______/
     ______
ALE /      \_______________________________________________________
            _______         _______         _______         _______
RAS _______/       \_______/       \_______/       \_______/
    ___         _______         _______         _______         ___
CAS    \_______/       \_______/       \_______/       \_______/
    _______________                         _______________________
RD                 \_______________________/


Как я понимаю за 4 такта процессора (и 8 тактов пиксельклока) нам надо успеть прочитать один раз из видеопамяти и один-два раза прочитать-записать данные по требованию процессора, ну и может один раз сделать CAS-before-RAS рефреш - так?

Процессор всегда пишет-читает через такт после ALE. У нас может быть четыре состояния s0,s1,s2,s3, в первых трёх из которых по умолчанию будет читаться видеопамять и сохранять видеоданные в регистре, из которого в состоянии s3 видеоданные будут уходить в сдвиговый регистр и ALE может попасть на любое из этих состояний:

ALE попало на s0 - значит общение процессора с памятью будет во время состояния s2 и мы точно знаем, что регистр с видеоданными уже будет записан в текущем такте (s0), значит следующий такт s1 можно посвятить рефрешу CAS-before-RAS, а на s3 снова может выпасть ALE.

ALE попало на s1 - значит общение процессора с памятью будет во время состояния s3 и мы точно знаем, что регистр с видеоданными уже будет записан в текущем такте (s1), значит следующий такт s2 можно посвятить рефрешу CAS-before-RAS.

ALE попало на s2 - значит общение процессора с памятью будет во время состояния s0, а в следующем состоянии s3 регистр с данными уже должен быть записан, значит в текущем такте (s2) пишем регистр с видеоданными и больше ничего не делаем (CAS-before-RAS не заказывается).

ALE попало на s3 - значит общение процессора с памятью будет во время состояния s1 и следующий такт (s0) надо посвятить записи видеорегистра, значит CAS-before-RAS также не заказывается.

P.S. RD и WR надо попросту укоротить, откусив их начала и оставив только кусок, попадающий на T3?


Наверное надо на полтакта сдвинуть формирование RAS/CAS, причём удлиннив RAS и укоротив CAS:
Code:
   |      T 1      |      T 2      |      T 3      |      T 4      |
        ___     ___     ___     ___     ___     ___     ___     ___
PIX ___/   \___/   \___/   \___/   \___/   \___/   \___/   \___/
            _______         _______         _______         _______
CLK _______/       \_______/       \_______/       \_______/
     ______
ALE /      \_______________________________________________________

           |  ROW  |  COL  |  ROW  |  COL  |  ROW  |  COL  |  ROW
            ___             ___             ___             ___
RAS        /   \___________/   \___________/   \___________/   \___

            ___________     ___________    .............    _______
CAS        /           \___/           \___________________/
                                           Hidden CAS-before-RAS
    _______________                         _______________________
RD                 \_______________________/



P.S. Пока прикидки такие - имеем 2 обязательных CPLD чипа:
Orionix Chip1 - дешифратор адресов и почти все порты (см. VHDL код выше)
Orionix Chip2 - видеоконтроллер, перебирающий адреса видеопамяти (PAL и NTSC)
и 2 опциональных:
Orionix ChipX - гибкий доступ к видеопамяти с шагом в 256 байт вместо 16К (горизонтальный скролл)
Orionix ChipY - блиттер (пока в базовом варианте с копированием без прозрачности)
плюс некоторое небольшое количество мелкой логики (регистры, мультиплексоры и т.д.)

P.P.S. По идее можно шаг сдвига видеопамяти и в 1 байт сделать - в этом случае можно будет вертикальный скролл поддержать, правда с минимальной софтверной поддержкой (программно придётся стирать перехлестнувшиеся пикселы), но этоу же мелочи...

P.P.P.S. С другой стороны в качестве мультиплексоров можно тот же Xilinx заюзать - дешевле будет (один XC9572XL-10 стоит $2.26, один XC9536XL-10 стоит $1.18, а шесть 74LS153 - уже $4.50) - тогда обязательными будут 3 CPLD-чипа...


Не получится заюзать в качестве мультиплексоров - ног не хватит :(

Это целый чипсет получается для построения любых Орионов - стандартных и не очень :)

P.S. Я смотрю у 8085 при чтении опкода сигнал RD чуть длиннее получается - по видимому, чтобы всё срасталось, надо все операции с памятью по запросу процессора делать во втором такте - писать в память при WR и читать в регистр по RD, который отдавать процессору в следующем третьем такте, а сам третий такт использовать для видеоконтроллера, тогда имея 4 состояния:
s0 - H2=0 H1=0
s1 - H2=0 H1=1
s2 - H2=1 H1=0
s3 - H2=1 H1=1
их можно наложить на такты процессора таким образом:

s0 - ALE (читаем видеопамять)
s1 - RD/WR (читаем/пишем память для проца)
s2 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD
s3 - отправляем прочитанное из видеопамяти в регистр сдвига (тут снова может быть ALE)

s1 - ALE (читаем видеопамять даже если она была прочитана в s0)
s2 - RD/WR (читаем/пишем память для проца)
s3 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD, и одновременно отправляем прочитанное ранее из видеопамяти в регистр сдвига
s0 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана

s2 - ALE (читаем видеопамять)
s3 - RD/WR (читаем/пишем память для проца и одновременно отправляем прочитанное из видеопамяти в регистр сдвига)
s0 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD
s1 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана

s3 - ALE (отправляем прочитанное из видеопамяти в регистр сдвига)
s0 - RD/WR (читаем/пишем память для проца)
s1 - делаем CAS-before-RAS и одновременно отдаём регистр в проц, если был RD
s2 - тут опять может быть ALE, т.е. считаем что видеопямть будет прочитана перед s3

Получается, что CAS-before-RAS делается каждый раз после WR или RD от проца. Видеопамять читаем в трёх состояниях s0,s1,s2, если на это же время не приходятся такты T2 или T3 процессора. Состояние s3 всегда используется для вскармливания регистра сдвига.

P.P.S. Тогда надо обратно сдвинуть RAS и CAS, чтобы они совпадали с тактами процессора:
Code:
        ___     ___     ___     ___     ___     ___     ___     ___
10M ___/   \___/   \___/   \___/   \___/   \___/   \___/   \___/

   |      T 1      |      T 2      |      T 3      |      T 4      |
            _______         _______         _______         _______
CLK _______/       \_______/       \_______/       \_______/
     ______
ALE /      \_______________________________________________________

   |  ROW  |  COL  |  ROW  |  COL  |  ROW  |  COL  |  ROW  |  COL  |
    ___             ___             ___             ___
RAS    \___________/   \___________/   \___________/   \___________/

    ___________     ___________    .............    ___________
CAS            \___/           \___________________/           \___/
                                   Hidden CAS-before-RAS
    ________________                         _______________________
RD                  \_______________________/



P.P.P.S. Если CAS-before-RAS будет после каждого обращения процессора к памяти, то регистр по RD ненужен, т.к. HIDDEN-CAS-before-RAS оставляет байт нетронутым на выходе, т.е. пока реализацию блиттера придётся отложить на потом...

_________________
:dj: https://mastodon.social/@Shaos


08 Dec 2013 11:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Итак, мы заводим новый системный порт ¹0 по адресу #F7FF, который будет доступен как по записи, так и по чтению (через ОЗУ):

D0 - управляет совместимостью с NTSC (см.ниже)
D1 /
D2 - включает режим 480 точек по горизонтали (для 80x25)
D3 - включает режим альфаканала (просвечивает область с нулевого адреса) ???
D4 - задают режим видимости Devices/FastRAM (см.ниже)
D5 /
D6 - включает теневую память вместо ОЗУ, ПЗУ и портов (порт #F7FF также запрещается)
D7 - запрещает порт #F7FF для совместимости со стандартным Орионом (если 0, то порт разрешён)

При запрещении порта #F7FF битами D6 или D7 его можно вернуть обратно путём осуществления записи скажем по адресу #FFFF (на самом деле по любому #FFxx), что обнулит биты D6 и D7 порта #F7FF (но при чтении всё ещё будут читаться старые значения, т.к. память не обновится пока в порт что-то явно не запишут).

Возможное решение проблемы совместимости с NTSC, где будут видимы только 200 линий:
00 - режим по умолчанию где видны все 256 линий (в режиме NTSC будут видны только верхние 200 строк);
01 - во всех режимах видны только 200 строк с вертикальным отступом 0;
10 - во всех режимах видны только 200 строк с вертикальным отступом 28;
11 - во всех режимах видны только 200 строк с вертикальным отступом 56.
В режиме NTSC результат 00 и 01 будет идентичным, а в режиме PAL значения 01,10,11 будут отображать растянутый по горизонтали кадр с чёрными полосками высотой в 28 пикселов сверху и снизу.

Режимы видимости Devices/FastRAM в области #F400...#F7FF (порт ¹0 по адресу #F7FF всегда виден, если не запрещён):
00 - Devices only (плюс порт #F7FF, который запрещается отдельно);.
01 - Devices+FastRAM (периферия только по стандартным адресам, а между ними - ОЗУ);
10 - Keyboard+FastRAM (из устройств по своим адресам находится только клавиатура, а во всех остальных адресах - ОЗУ);
11 - FastRAM (все устройства спрятаны).

Плюс ко всему в области #F6xx планируется быть шина NI-15, полностью видимая только в режиме 00 :)


Всё что касается видео решил убрать в порт №4 (#FB00), который в оригинальном Орионе предполагался для опционального текстового режима и просто уходил наружу. Как мы уже выяснили, в NTSC впритык может влезть 240 линий, соответственно этот вариант тоже надо поддержать наряду с обычными 256 и урезанными 200. Потом кроме 384 по горизонтали можно сделать 480 (есть такая модификация для 80 символов в строке), а также для разнообразия 320 и предел по максимуму - 512 (годится как для PAL, так и для NTSC). Вобщем как-то так:

Биты 0 и 1:
00 - 320 пикселов в строке;
01 - 384 пиксела в строке (значение по умолчанию);
10 - 480 пикселов в строке;
11 - 512 пикселов в строке.

Биты 2 и 3:
00 - 200 линий в кадре (совместимо с NTSC);
01 - 240 линий в кадре (совместимо с NTSC);
10 - 256 линий в кадре (значение по умолчанию - в режиме NTSC будет видно только верхние 240);
11 - аппаратный текстовый режим 80x25 (на будущее).

P.S. Бит 4 может включать режим бордюра, когда заливка фона берётся из адреса xx11 1111 ?

P.P.S. Соответственно портом опционального горизонтального скроллинга станет #FB01...

_________________
:dj: https://mastodon.social/@Shaos


10 Dec 2013 21:09
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Поразбирался я тут с SIMM30 и вот что получается:

Порт 2 (который #F900), как известно, выбирает подключаемую страницу и мы обозначим его содержимое так:

P7 P6 P5 P4 P3 P2 P1 P0

Причём в Орионе-128/256 в этому порту используются только биты P0 и P1.

Нам надо иметь 2 одинаковые симки, т.к. инфу из видеопамяти логичнее брать параллельно из двух страниц, соответственно бит P0 порта ¹2 всегда будет обозначать какую из двух симок мы подключаем в область адресного пространства (0 - симку с точками, 1 - симку с цветом). SIMM30 бывают размером 256К, 1М и 4М (причём все поддерживают HIDDEN CAS-before-RAS). Разбиение по RAS/CAS придётся делать по разному для разных размеров:
Code:
2 x 256K = 512K

ROW COL
 A0 A9
 A1 A10
 A2 A11
 A3 A12
 A4 A13
 A5 A14
 A6 A15
 A7 P1
 A8 P2

2 x 1M = 2M

ROW COL
 A0 A10
 A1 A11
 A2 A12
 A3 A13
 A4 A14
 A5 A15
 A6 P1
 A7 P2
 A8 P3
 A9 P4

2 x 4M = 8M

ROW COL
 A0 A11
 A1 A12
 A2 A13
 A3 A14
 A4 A15
 A5 P1
 A6 P2
 A7 P3
 A8 P4
 A9 P5
A10 P6


Как видим P0 тут не участвует, т.к. используется для выбора симки. Свободный бит P7 можно задействовать скажем для подключения ром-диска размером до 8 мегов в непосредственное адресное пространство процессора вместо симов.


Придумал как настраивать тип SIMM-ов всего двумя джамперами, перепутав адресные сигналы:
Code:
     ROW | COL
    -----+-----
      A0 | A9  (256K) or P4 (1M,4M) - jumper J1
      A1 | A10 (256K,1M) or P5 (4M) - jumper J2
      A2 | A11
      A3 | A12
      A4 | A13
      A5 | A14
      A6 | A15
      A7 | P1
256K  A8 | P2
---------+-----
  1M  A9 | P3
---------+-----
  4M A10 | P6
---------+-----
 16M  J3 | J4 (optional jumpers for 16M)

Джамперы J1 и J2 будут выбирать что поставлено - 2x256K, 2x1M или 2x4M. Плюс к этому можно добавить джамперы J3 и J4, которые будут выбирать нужную четверть 2x16M, если кто-то захочет их поставить, т.е. например так можно частично-битую 16M симку заюзать, а можно и ноль на эти адресные входы подать...

P.S. На самом деле джамперов надо в 2 раза больше, т.к. надо единообразно переключать как адреса с видеоконтроллера, так и адреса с процессора! Единственное отличие заключается лишь в том, что переключаемые P4 и P5 в случае видеоконтроллера не существуют - там будет земля...

_________________
:dj: https://mastodon.social/@Shaos


11 Dec 2013 18:08
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
При 10 МГц пиксельклоке мы будем иметь 641 пиксель в строке PAL (50 Гц, 312 строк) и 637 пикселя в строке NTSC (59.94 Гц, 262 строки). Цифры для разных разрешений:

512 пикселов по горизонтали: строчный синхроимпульс начинается в 539 и кончается в 586
480 пикселов по горизонтали: строчный синхроимпульс начинается в 523 и кончается в 570
384 пикселов по горизонтали: строчный синхроимпульс начинается в 475 и кончается в 522
320 пикселов по горизонтали: строчный синхроимпульс начинается в 443 и кончается в 490

256 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 279,280,281
240 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 271,272,273
200 пикселов по вертикали в PAL: кадровый синхроимпульс в строках 251,252,253

240 пикселов по вертикали в NTSC: кадровый синхроимпульс в строках 243,244,245
200 пикселов по вертикали в NTSC: кадровый синхроимпульс в строках 223,224,225

_________________
:dj: https://mastodon.social/@Shaos


11 Dec 2013 20:38
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Второй чип готов - этот уже в xc9572xl (в 9536 не влезает):
Code:
----------------------------------------------------------------------------------
-- Company: nedoPC.org
-- Engineer: Shaos
--
-- Create Date:    00:26:44 12/03/2013
-- Design Name:    orionix counter
-- Module Name:    main - Behavioral
-- Project Name:   Orionix-2013
-- Target Devices: xc9572xl
-- Tool versions:  ISE 14.7
-- Description: 2nd CPLD chip for Orionix-2013
--
-- Dependencies:
--
-- Revision: 0.04
-- Revision 0.01 - File Created
-- Additional Comments:
-- This design is Public Domain
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
-- use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity main is
    Port ( CLR : in STD_LOGIC;
           CLK10 : in STD_LOGIC;
           NTSC : in STD_LOGIC;
           WRP4 : in STD_LOGIC;
           ALE : in STD_LOGIC;
           AD0 : in STD_LOGIC;
           AD1 : in STD_LOGIC;
           AD2 : in STD_LOGIC;
           AD3 : in STD_LOGIC;
           H0  : out STD_LOGIC;
           H1  : out STD_LOGIC;
           H2  : out STD_LOGIC;
           H3  : out STD_LOGIC;
           H4  : out STD_LOGIC;
           H5  : out STD_LOGIC;
           H6  : out STD_LOGIC;
           H7  : out STD_LOGIC;
           H8  : out STD_LOGIC;
           H9  : out STD_LOGIC;
           V0  : out STD_LOGIC;
           V1  : out STD_LOGIC;
           V2  : out STD_LOGIC;
           V3  : out STD_LOGIC;
           V4  : out STD_LOGIC;
           V5  : out STD_LOGIC;
           V6  : out STD_LOGIC;
           V7  : out STD_LOGIC;
           V8  : out STD_LOGIC;
           V9  : out STD_LOGIC;
           RAS : out STD_LOGIC;
           CAS : out STD_LOGIC;
           VID : out STD_LOGIC;
           SYNC : out STD_LOGIC;
           EX : out STD_LOGIC);
end main;

architecture Behavioral of main is
signal HTMP : STD_LOGIC_VECTOR(9 downto 0);
signal VTMP : STD_LOGIC_VECTOR(9 downto 0);
signal HSYNC : STD_LOGIC;
signal VSYNC : STD_LOGIC;
signal HSIZE : STD_LOGIC_VECTOR(1 downto 0);
signal VSIZE : STD_LOGIC_VECTOR(1 downto 0);
signal A : STD_LOGIC_VECTOR(3 downto 0);
begin

process (CLR,CLK10,HTMP(0)) is
begin
if CLR='0' then
   CAS <= '1';
   RAS <= '1';
else
 if CLK10='1' and HTMP(0)='0' then
   CAS <= '0';
 else
   CAS <= '1';
 end if;
 if CLK10='0' and HTMP(0)='1' then
   RAS <= '1';
 else
   RAS <= '0';
 end if;
end if;
end process;

process (CLR,ALE,HTMP(0),AD0,AD1,AD2,AD3) is
begin
if CLR='0' then
   EX <= '1';
   A <= "0000";
elsif ALE'event and ALE='0' then
   if HTMP(0)='1' then
      EX <= '0';
   end if;
   A(0) <= AD0;
   A(1) <= AD1;
   A(2) <= AD2;
   A(3) <= AD3;
end if;
end process;

process (CLR,VSYNC,HSYNC) is
begin
if CLR='0' then
   SYNC <= '1';
elsif VSYNC='1' or HSYNC='1' then
   SYNC <= '0';
else
   SYNC <= '1';
end if;
end process;

process (CLR,WRP4,AD0,AD1,AD2,AD3)
begin
if CLR='0' then
   HSIZE <= "01";
   VSIZE <= "10";
elsif WRP4'event and WRP4='1' and A="0000" then
   HSIZE(0) <= AD0;
   HSIZE(1) <= AD1;
   VSIZE(0) <= AD2;
   VSIZE(1) <= AD3;
end if;
end process;

process (CLR,CLK10) is
begin

if CLR='0' then
   HTMP <= "0000000000";
   VTMP <= "0000000000";
   VID <= '1';

elsif CLK10'event and CLK10='0' then

   if ((HSIZE="00" and HTMP<320) or
       (HSIZE="01" and HTMP<384) or
       (HSIZE="10" and HTMP<480) or
       (HSIZE="11" and HTMP<512)
      )and
      ((VSIZE="00" and VTMP<200) or
       (VSIZE="01" and VTMP<240) or
       (VSIZE="10" and VTMP<240 and NTSC='1') or
       (VSIZE="10" and VTMP<256 and NTSC='0')
      )then
       VID <= '1';
      else
       VID <= '0';
      end if;

      if (NTSC='0' and VSIZE="00" and (VTMP=251 or VTMP=252 or VTMP=253)) or
         (NTSC='0' and VSIZE="01" and (VTMP=271 or VTMP=272 or VTMP=273)) or
         (NTSC='0' and VSIZE="10" and (VTMP=279 or VTMP=280 or VTMP=281)) or
         (NTSC='1' and VSIZE="00" and (VTMP=223 or VTMP=224 or VTMP=225)) or
         (NTSC='1' and (VSIZE="01" or VSIZE="10") and (VTMP=243 or VTMP=244 or VTMP=245)) then
           VSYNC <= '1';
      else
           VSYNC <= '0';
      end if;

      if (HSIZE="00" and HTMP>442 and HTMP<490) or
         (HSIZE="01" and HTMP>474 and HTMP<422) or
         (HSIZE="10" and HTMP>522 and HTMP<570) or
         (HSIZE="11" and HTMP>538 and HTMP<586) then
           HSYNC <= '1';
         else
           HSYNC <= '0';
         end if;

      HTMP <= HTMP + 1;

      if (NTSC='0' and HTMP=641) or
         (NTSC='1' and HTMP=637) then
          HTMP <= "0000000000";
          VTMP <= VTMP + 1;
      end if;

      if (NTSC='0' and VTMP=312) or
         (NTSC='1' and VTMP=262) then
          VTMP <= "0000000000";
      end if;

end if;
end process;

H0 <= HTMP(0);
H1 <= HTMP(1);
H2 <= HTMP(2);
H3 <= HTMP(3);
H4 <= HTMP(4);
H5 <= HTMP(5);
H6 <= HTMP(6);
H7 <= HTMP(7);
H8 <= HTMP(8);
H9 <= HTMP(9);

V0 <= VTMP(0);
V1 <= VTMP(1);
V2 <= VTMP(2);
V3 <= VTMP(3);
V4 <= VTMP(4);
V5 <= VTMP(5);
V6 <= VTMP(6);
V7 <= VTMP(7);
V8 <= VTMP(8);
V9 <= VTMP(9);

end Behavioral;

что компилируется вот так:
Code:
                                  Fitter Report
Design Name: main                                Date: 12-13-2013,  2:13AM
Device Used: XC9572XL-10-PC44
Fitting Status: Successful

*************************  Mapped Resource Summary  **************************

Macrocells     Product Terms    Function Block   Registers      Pins           
Used/Tot       Used/Tot         Inps Used/Tot    Used/Tot       Used/Tot       
35 /72  ( 49%) 120 /360  ( 33%) 77 /216 ( 36%)   32 /72  ( 44%) 34 /34  (100%)

** Function Block Resources **

Function    Mcells      FB Inps     Pterms      IO         
Block       Used/Tot    Used/Tot    Used/Tot    Used/Tot   
FB1           2/18        4/54        3/90       9/ 9*
FB2           8/18       27/54       26/90       9/ 9*
FB3          17/18       22/54       44/90       9/ 9*
FB4           8/18       24/54       47/90       7/ 7*
             -----       -----       -----      -----   
             35/72       77/216     120/360     34/34

* - Resource is exhausted

** Global Control Resources **

Signal 'ALE' mapped onto global clock net GCK1.
Signal 'CLK10' mapped onto global clock net GCK2.
Signal 'WRP4' mapped onto global clock net GCK3.
Global output enable net(s) unused.
Signal 'CLR' mapped onto global set/reset net GSR.

** Pin Resources **

Signal Type    Required     Mapped  |  Pin Type            Used    Total
------------------------------------|------------------------------------
Input         :    5           5    |  I/O              :    28      28
Output        :   25          25    |  GCK/IO           :     3       3
Bidirectional :    0           0    |  GTS/IO           :     2       2
GCK           :    3           3    |  GSR/IO           :     1       1
GTS           :    0           0    |
GSR           :    1           1    |
                 ----        ----
        Total     34          34


******************************  Device Pin Out *****************************

Device : XC9572XL-10-PC44


   -------------------------------- 
  /6  5  4  3  2  1  44 43 42 41 40 \
 | 7                             39 |
 | 8                             38 |
 | 9                             37 |
 | 10                            36 |
 | 11       XC9572XL-10-PC44     35 |
 | 12                            34 |
 | 13                            33 |
 | 14                            32 |
 | 15                            31 |
 | 16                            30 |
 | 17                            29 |
 \ 18 19 20 21 22 23 24 25 26 27 28 /
   -------------------------------- 


Pin Signal                         Pin Signal                       
No. Name                           No. Name                         
  1 AD0                              23 GND                           
  2 AD1                              24 H8                           
  3 AD2                              25 H9                           
  4 AD3                              26 V0                           
  5 ALE                              27 V1                           
  6 CLK10                            28 V2                           
  7 WRP4                             29 V3                           
  8 NTSC                             30 TDO                           
  9 SYNC                             31 GND                           
 10 GND                              32 VCC                           
 11 H0                               33 V4                           
 12 H1                               34 V5                           
 13 H2                               35 V6                           
 14 H3                               36 V7                           
 15 TDI                              37 V8                           
 16 TMS                              38 V9                           
 17 TCK                              39 CLR                           
 18 H4                               40 VID                           
 19 H5                               41 VCC                           
 20 H6                               42 EX                           
 21 VCC                              43 RAS                           
 22 H7                               44 CAS                           


Legend :  NC  = Not Connected, unbonded pin
         PGND = Unused I/O configured as additional Ground pin
         TIE  = Unused I/O floating -- must tie to VCC, GND or other signal
         KPR  = Unused I/O with weak keeper (leave unconnected)
         VCC  = Dedicated Power Pin
         GND  = Dedicated Ground Pin
         TDI  = Test Data In, JTAG pin
         TDO  = Test Data Out, JTAG pin
         TCK  = Test Clock, JTAG pin
         TMS  = Test Mode Select, JTAG pin
  PROHIBITED  = User reserved pin


UPD 13-DEC-2013: Кое-что поправил в генерации...

_________________
:dj: https://mastodon.social/@Shaos


Last edited by Shaos on 13 Dec 2013 00:32, edited 1 time in total.



11 Dec 2013 23:03
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Ну и третий чип (xc9572xl), являющийся по сути 12-битным сумматором:
Code:
----------------------------------------------------------------------------------
-- Company: nedoPC.org
-- Engineer: Shaos
--
-- Create Date:    02:20:32 12/12/2013
-- Design Name:    orionix adder
-- Module Name:    main - Behavioral
-- Project Name:   Orionix-2013
-- Target Devices: xc9572xl
-- Tool versions:  ISE 14.7
-- Description:    3rd chip for Orionix-2013 (optional)
--
-- Dependencies:
--
-- Revision: 0.02
-- Revision 0.01 - File Created
-- Additional Comments:
-- This design is Public Domain
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity main is
    Port ( CLR : in STD_LOGIC;
           AD : in STD_LOGIC_VECTOR (7 downto 0);
           ALE : in STD_LOGIC;
           WRP4 : in STD_LOGIC;
           VA : in STD_LOGIC_VECTOR (7 downto 0);
           VAO : out STD_LOGIC_VECTOR (11 downto 0));
end main;

architecture Behavioral of main is
signal A : STD_LOGIC_VECTOR (3 downto 0);
signal F : STD_LOGIC;
signal O : STD_LOGIC_VECTOR (11 downto 0);
signal T : STD_LOGIC_VECTOR (11 downto 0);
begin

process (CLR,ALE,AD) is
begin
if CLR='0' then
   A <= "0000";
elsif ALE'event and ALE='0' then
   A(0) <= AD(0);
   A(1) <= AD(1);
   A(2) <= AD(2);
   A(3) <= AD(3);
end if;
end process;

process (CLR,WRP4,A,AD) is
begin
if CLR='0' then
   O <= "000000000000";
   F <= '0';
elsif WRP4'event and WRP4='1' then
   if A="0000" then -- #FB00 (bit 7)
      F <= AD(7);
   end if;
   if A="0010" then -- #FB02
      O(0) <= AD(0);
      O(1) <= AD(1);
      O(2) <= AD(2);
      O(3) <= AD(3);
      O(4) <= AD(4);
      O(5) <= AD(5);
      O(6) <= AD(6);
      O(7) <= AD(7);
   end if;
   if A="0011" then -- #FB03
      O(8) <= AD(0);
      O(9) <= AD(1);
      O(10) <= AD(2);
      O(11) <= AD(3);
   end if;
end if;
end process;

process (VA,O) is
begin
T <= O+VA;
if F='0' then
   T(8) <= '0';
   T(9) <= '0';
   T(10) <= '0';
   T(11) <= '0';
end if;
end process;

VAO <= T;

end Behavioral;


Статистика:

Code:
                                  Fitter Report
Design Name: main                                Date: 12-13-2013,  1:04AM
Device Used: XC9572XL-10-PC44
Fitting Status: Successful

*************************  Mapped Resource Summary  **************************

Macrocells     Product Terms    Function Block   Registers      Pins           
Used/Tot       Used/Tot         Inps Used/Tot    Used/Tot       Used/Tot       
37 /72  ( 51%) 259 /360  ( 72%) 81 /216 ( 37%)   17 /72  ( 24%) 31 /34  ( 91%)

** Function Block Resources **

Function    Mcells      FB Inps     Pterms      IO         
Block       Used/Tot    Used/Tot    Used/Tot    Used/Tot   
FB1          15/18       12/54       28/90       9/ 9*
FB2           9/18       23/54       84/90       8/ 9
FB3           8/18       23/54       64/90       7/ 9
FB4           5/18       23/54       83/90       7/ 7*
             -----       -----       -----      -----   
             37/72       81/216     259/360     31/34

* - Resource is exhausted

** Global Control Resources **

Signal 'ALE' mapped onto global clock net GCK1.
Signal 'WRP4' mapped onto global clock net GCK2.
Global output enable net(s) unused.
Signal 'CLR' mapped onto global set/reset net GSR.

** Pin Resources **

Signal Type    Required     Mapped  |  Pin Type            Used    Total
------------------------------------|------------------------------------
Input         :   16          16    |  I/O              :    25      28
Output        :   12          12    |  GCK/IO           :     3       3
Bidirectional :    0           0    |  GTS/IO           :     2       2
GCK           :    2           2    |  GSR/IO           :     1       1
GTS           :    0           0    |
GSR           :    1           1    |
                 ----        ----
        Total     31          31


Этот опциональный чип позволяет делать горизонтальный скроллинг с шагом 8 пикселов либо в пределах 64К (когда старший бит порта #FB00 равено 0), либо в пределах 1М (когда старший бит порта #FB00 равен 1). Смещение задаётся в портах #FB02 (средний байт) и #FB03 (старшие 4 бита) - всего 12 бит, но так как при горизонтальном скроллинге младший бит адреса не меняется, то это нам даёт 12+8=20 бит (адресует 1 мегабайт). 12 бит выбрано потому, что 8 уже не влезало в xc9536xl (изначально я хотел ограничиться 8-битным сумматором), а 14 бит (максимум возможного при 2x4MB) не влезало в xc9572xl - соответственно я откатился на меньшее "круглое" число, охватывающее 1 Мб видеопамяти...

P.S. Если чип не устанавливать, то VA[0..7] надо просто подсоединить перемычками к VAO[0..7], а на VAO[8..11] подать землю - тогда это будет классический Орион с четырьмя экранами (VA[6] и VA[7] подсоединены к выходам IS0 и IS1 первого чипа, а VA[0...5] - к выходам H3...H7 второго).

P.P.S.#FB01 оставил на будущее - под младшую часть сдвига адреса видеопамяти (для реализации полуаппаратного вертикального скролла)...

_________________
:dj: https://mastodon.social/@Shaos


12 Dec 2013 01:52
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Подвожу итоги:

Orionix-2013 1st Chip:
Code:
Device : XC9536XL-10-PC44


   -------------------------------- 
  /6  5  4  3  2  1  44 43 42 41 40 \
 | 7                             39 |
 | 8                             38 |
 | 9                             37 |
 | 10                            36 |
 | 11       XC9536XL-10-PC44     35 |
 | 12                            34 |
 | 13                            33 |
 | 14                            32 |
 | 15                            31 |
 | 16                            30 |
 | 17                            29 |
 \ 18 19 20 21 22 23 24 25 26 27 28 /
   -------------------------------- 

Pin Signal                         Pin Signal                       
No. Name                           No. Name                         
  1 CSRAM2                           23 GND                           
  2 AD7                              24 WRP4                         
  3 CSD2                             25 AD3                           
  4 IS0                              26 AD4                           
  5 ALE                              27 AD2                           
  6 SAND                             28 CSROM2                       
  7 WR                               29 A13                           
  8 AD5                              30 TDO                           
  9 IS1                              31 GND                           
 10 GND                              32 VCC                           
 11 A15                              33 CSRAM                         
 12 VM0                              34 CSEX                         
 13 AD6                              35 AD0                           
 14 VM1                              36 A11                           
 15 TDI                              37 A12                           
 16 TMS                              38 CSD1                         
 17 TCK                              39 CLR                           
 18 A9                               40 AD1                           
 19 VM2                              41 VCC                           
 20 A8                               42 A10                           
 21 VCC                              43 CSKB                         
 22 WRP2                             44 A14                           


ВХОДЫ:

CLR : очистка (подключается к /RESET)
AD0...AD7 : мультиплексированная шина данных-адреса от процессора
A8...A15 : старший байт адреса от процессора
ALE : сигнал наличия адреса на мультиплексированной шине от процессора
WR : сигнал записи (подключается к /WR процессора)
SAND : сигнал чтения инструкции (S1 & S2) - используется для начального пуска (при обращении ко второй инструкции ПЗУ 2K убирается из адресного пространства на своё место с адреса #F800)

ВЫХОДЫ:

CSRAM : сигнал разрешения динамической памяти
CSRAM2 : сигнал разрешения ОЗУ 2К (#F000...#F3FF или #F000...#F7FF)
CSROM2 : сигнал разрешения ПЗУ 2К (#F800...#FFFF, но после ресета покрывает всё адресное пространство процессора для начального пуска)
CSKB : сигнал разрешения порта клавиатуры (по адресу #F4xx)
CSD1 : сигнал разрешения первого пользовательского устройства (по адресу #F5xx)
CSD2 : сигнал разрешения второго пользовательского устройства (по адресу #F6xx)
CSEX : сигнал разрешения платы расширения (по адресу #F7xx)
VM0...VM2 : выходы регистра видережима (порт №1 доступный на запись по адресу #F8xx)
WRP2 : сигнал записи во внешний регистр выбора страницы памяти (порт №2 доступный на запись по адресу #F9xx)
IS0,IS1 : инвертированные выходы регистра выбора экранной области (порт №3 доступный на запись по адресу #FAxx)
WRP4 : сигнал записи во внешние регистры видеоконтроллера (порт №4 доступный на запись по адресу #FBxx)

Orionix-2013 2nd Chip:
Code:
Device : XC9572XL-10-PC44


   -------------------------------- 
  /6  5  4  3  2  1  44 43 42 41 40 \
 | 7                             39 |
 | 8                             38 |
 | 9                             37 |
 | 10                            36 |
 | 11       XC9572XL-10-PC44     35 |
 | 12                            34 |
 | 13                            33 |
 | 14                            32 |
 | 15                            31 |
 | 16                            30 |
 | 17                            29 |
 \ 18 19 20 21 22 23 24 25 26 27 28 /
   -------------------------------- 


Pin Signal                         Pin Signal                       
No. Name                           No. Name                         
  1 AD0                              23 GND                           
  2 AD1                              24 H8                           
  3 AD2                              25 H9                           
  4 AD3                              26 V0                           
  5 ALE                              27 V1                           
  6 CLK10                            28 V2                           
  7 WRP4                             29 V3                           
  8 NTSC                             30 TDO                           
  9 SYNC                             31 GND                           
 10 GND                              32 VCC                           
 11 H0                               33 V4                           
 12 H1                               34 V5                           
 13 H2                               35 V6                           
 14 H3                               36 V7                           
 15 TDI                              37 V8                           
 16 TMS                              38 V9                           
 17 TCK                              39 CLR                           
 18 H4                               40 VID                           
 19 H5                               41 VCC                           
 20 H6                               42 EX                           
 21 VCC                              43 RAS                           
 22 H7                               44 CAS   


ВХОДЫ:

CLR : очистка (подключается к /RESET)
CLK10 : тактирование 10 МГц
NTSC : сигнал включения режима NTSC
WRP4 : вход сигнала записи в регистры видеоконтроллера
ALE : сигнал наличия адреса на мультиплексированной шине от процессора
AD0...AD3 : младшая половина мультиплексированной шины данных-адреса от процессора

ВЫХОДЫ:

H0...H9 : горизонтальная координата (сигнал H9 необязателен)
V0...V9 : вертикальная координата (сигналы V8 и V9 необязательны)
RAS : сигнал ввода адреса рядов для динамической памяти
CAS : сигнал ввода адреса столбцов для динамической памяти
VID : сигнал прохождения через область видео изображения
SYNC : сигнал синхронизации (совмещённая горизонтальная и вертикальная синхра)
EX : инверсный сигнал исключительной ситуации (подключается к схеме ресета)

Orionix-2013 3rd Chip (optional):
Code:
XC9572XL-10-PC44


   -------------------------------- 
  /6  5  4  3  2  1  44 43 42 41 40 \
 | 7                             39 |
 | 8                             38 |
 | 9                             37 |
 | 10                            36 |
 | 11       XC9572XL-10-PC44     35 |
 | 12                            34 |
 | 13                            33 |
 | 14                            32 |
 | 15                            31 |
 | 16                            30 |
 | 17                            29 |
 \ 18 19 20 21 22 23 24 25 26 27 28 /
   -------------------------------- 


Pin Signal                         Pin Signal                       
No. Name                           No. Name                         
  1 AD<0>                            23 GND                           
  2 AD<1>                            24 VAO<2>                       
  3 AD<2>                            25 VA<2>                         
  4 AD<3>                            26 VAO<3>                       
  5 ALE                              27 VA<3>                         
  6 WRP4                             28 VAO<10>                       
  7 AD<4>                            29 VAO<9>                       
  8 AD<5>                            30 TDO                           
  9 AD<6>                            31 GND                           
 10 GND                              32 VCC                           
 11 AD<7>                            33 VAO<4>                       
 12 KPR                              34 VA<4>                         
 13 VAO<0>                           35 VAO<5>                       
 14 VA<0>                            36 VA<5>                         
 15 TDI                              37 VAO<6>                       
 16 TMS                              38 VA<6>                         
 17 TCK                              39 CLR                           
 18 VAO<1>                           40 VAO<8>                       
 19 VA<1>                            41 VCC                           
 20 KPR                              42 VAO<7>                       
 21 VCC                              43 VA<7>                         
 22 VAO<11>                          44 KPR     


ВХОДЫ:

CLR : очистка (подключается к /RESET)
AD<0>...AD<7> : мультиплексированная шина данных-адреса от процессора
ALE : сигнал наличия адреса на мультиплексированной шине от процессора
WRP4 : вход сигнала записи в регистры видеоконтроллера
VA<0>...VA<7> : вход немодифицированного адреса видеопамяти

ВЫХОДЫ:

VAO<0>...VAO<11> : выход модифицированного адреса видеопамяти

Тут остаются свободными три ноги (12,20,44). VA[6] и VA[7] подсоединены к выходам IS0 и IS1 первого чипа, а VA[0...5] - к выходам H3...H7 второго. Как я уже писал - если третий чип не устанавливается, то VA[0..7] надо просто подсоединить перемычками к VAO[0..7], а на VAO[8..11] подать землю - тогда это будет классический Орион с четырьмя экранами (без возможности горизонтального скроллинга).

_________________
:dj: https://mastodon.social/@Shaos


13 Dec 2013 02:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Этот опциональный чип позволяет делать горизонтальный скроллинг с шагом 8 пикселов либо в пределах 64К (когда старший бит порта #FB00 равено 0), либо в пределах 1М (когда старший бит порта #FB00 равен 1). Смещение задаётся в портах #FB02 (средний байт) и #FB03 (старшие 4 бита) - всего 12 бит, но так как при горизонтальном скроллинге младший бит адреса не меняется, то это нам даёт 12+8=20 бит (адресует 1 мегабайт)...


А теперь самое интересное - как этот чип может помочь превратить Орион в чёрно-белый Специалист :)

Если мы поставим себе задачу, заставить работать только те программы, которые пользуются стандартными точками входа монитора (#C8xx), то надо просто написать программку-транслятор этих вызовов в монитор Ориона, располагающуюся c адреса #C800, а далее делаем некоторые действия для перемещения экрана в нестандартный для Ориона адрес #9000:

MVI A,3 ; задаём базовый адрес экрана #0000
STA #FA00
MVI A,#90 ; прибавляем к нему #9000
STA #FB02

или

MVI A,2 ; задаём базовый адрес экрана #4000
STA #FA00
MVI A,#50 ; прибавляем к нему #5000
STA #FB02

или

MVI A,1 ; задаём базовый адрес экрана #8000
STA #FA00
MVI A,#10 ; прибавляем к нему #1000
STA #FB02

ну или совсем хитро:

XRA A ; задаём базовый адрес экрана #C000 (уже должно быть по умолчанию)
STA #FA00
MVI A,#D0 ; прибавляем к нему #D000 ;)
STA #FB02

P.S. последнее будет работать только если у нас видеокольцо 64КB - не 1MB, т.к. для 1MB придётся ещё и старший байт задать:

MVI A,#0F
STA #FB03

_________________
:dj: https://mastodon.social/@Shaos


13 Dec 2013 14:26
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 53 posts ]  Go to page Previous  1, 2, 3, 4

Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.