ПентЭва - это что?
Вид для печати
USERHOME
http://nedopc.com/zxevo/zxevo.php
Как отучить квактус за меня лишние связи делать?
Вот, например код
RTL рисует мне лишнюю линию. (она красным выделена и разрезана)
Как мне избавиться от этого соединения не меняя код?
PS Рисую то же самое, только схемно, он в RTLe прорисовывает как на схеме... То есть без лишней связи. Преобразую схему в VHDL, потом этот VHDL компилирую, и, оппа - опять лишняя линия...:mad:
вообще нездорово писать что бы юзалиль pre и clr где нить кроме как начальная иницилизация, очень плохая практика для fpga/cpld, из за гонок сигналов можно очень веселые глюки ловить.
а красная перечеркнутая цепь отражает
красненькоеКод:if dos_on = '0' then
dos <= '0';
elsif dos_of = '0' then
dos <= '1';
Переделать этот кусок кода по другому...
---------- Post added at 22:03 ---------- Previous post was at 21:50 ----------
Например:
Таким образом, по переднему фронту set_dos мы устанавливаем признак активности доса, а сбрасываем его асинхронно (вход clr триггера dos) сигналом res_dos.Код:res_dos <= '1' when ( m1 = 0, mreq = 0, (a14 or a15) = 1 ) else '0';
set_dos <= '1' when ( m1 = 0, mreq = 0, (a15..a8) = "#3D" ) else '0';
process(res_dos,set_dos)
begin
if res_dos = '1' then
dos <= '0';
elseif ( rising_edge(set_dos)) then
dos <= '1';
end if;
end process;
Вопрос к знатокам. Почему для симуляции процессора z80 всегда используется T80 (VHDL, 35MHz) и его разновидности и нет никакого упоминания про использование других OpenCore процессоров, таких как: nextz80 (Verilog, 40 MHZ), tv80 (Verilog), Wishbone High Performance Z80 (Verilog, 90 MHZ), z80control (VHDL)?
Наверное потому, что большинство начинают свои проекты смотря на других и T80 был, наверное, первым общедоступным полноценным Z80. Кому охота, не имея особой уверенности в собственных силах, испытывать еще какой-то непроверенный код? К тому же то, что T80 работает максимально приближенно к оригиналу, для большинства проектов важнее той максимальной тактовой частоты, которую он способен выдержать.
Сделайте проект на каком-нибудь другом. У T80 немного достоинств. Толстый, в коде черт ногу сломит. Из-за его универсальности часто невозможно понять что там вообще относится к делу, а что нет. Точно совершенно можно сделать лучше.
Т80 вылизан по самое не горюй. В нем уже все команды работают корректно.
Что там творится в прочих реализациях на Верилоге - точно не известно.
Вся Амига 1200 со всеми потрохами в одном чипе уже есть http://opencores.org/project,aoocs , а ведь это более сложная система, чем спек...
Вообще-то - это А1000 - самая первая амига с OCS чипсетом. до А1200 этому проекту весьма далековато...
Спасибо. А звуковая часть у A1000 и A1200 одинаковая? Я к тому, чтобы ее оттуда выдернуть и использовать со спеком?
krotan, проще спек припаять сбоку к амиге - получится как раз Sega Megadrive.
Народ как реализовать выборку сигнала DOS для того чтобы в окно TR DOS залезть. У меня он пролетает. Если на дискретах можно было кондерчиком подзадержать, а тут как. Сегодня полдня голову ломал, решил пока отдохнуть. Я делаю прошлогодний проект - второго феникса. Там применены CPLDшки EPM7032. Пишется на языке подобном AHDL. Вобщем поскажите неразумному.
в каком смысле пролетает?
ты должен дос устанавливать по логике
ROMS = 1 A[15:8]=3D M1=0 MREQ=0
сброс
A[15:14] != 0 M1=0 MREQ=0
а задержки сигналов делают сдвиговым регистром
А синхронизирован сигнал DOS с клоком CPU?
Вот фрагмент относительно DOS от старой реализации Скорпа:
Код:process(clock,res_n,dos_win,ramm1,nmi_n)
begin
if (clock'event and clock = '1') then
if (res_n = '0') then
dos <= '0';
else
if (ramm1 = '1') then
dos <= not(nmi_n);
end if;
if (dos_win = '1') then
dos <= '1';
end if;
end if;
end if;
end process;
ramm1 <= '1' when (m1_n = '0' and rom_sel = '0' and rd_n = '0' and mreq_n = '0') else '0';
dos_win <= '1' when (cpu_a_bus(13 downto 8) = "111101" and m1_n = '0' and p_7ffd(4) = '1' and rom_sel = '1') else '0';
Нужно сигнал /DOS завести на вход D триггера, на вход C триггера подать CLK Z80 или 14 МГц, главное тут учесть что если Z80 работает по заднему фронту CLK то /DOS нужно защелкивать по переднему.
Просьба не пинать сильно, я описал кусок схемы из фени.
A45 - это A[15,14]
Код:%============== Формирователь сигнала выбора кода инструкции из памяти ================%
SEL_CODE = M1 # MREQ;
%============== Формирователь сигнала выбора окна ПЗУ =================================%
SEL_3DXX = !(ADDR[8] & !ADDR9 & ADDR[10] & ADDR[11] & ADDR[12] & ADDR[13] & ROM128 & A45 & !SEL_CODE);
%================ Формирователь сигнала NMI ============================================%
NMI_REG.d = MAGIC;
NMI_REG.clrn = VCC;
NMI_REG.clk = SEL_CODE;
NMI_REG.prn = SEL_3DXX;
NMI = NMI_REG.q;
%===================== Формирователь сигнала DOS =========================================%
DOS_REG.d = VCC;
DOS_REG.clrn = RES & (SEL_CODE # A45);
DOS_REG.clk = VCC;
DOS_REG.prn = SEL_3DXX & NMI_REG.q;
DOS = !DOS_REG.q;
Как-то так...
Код:DOSRG = !DOS_REG.q;
DOS_SYNC.d = DOSRG ;
DOS_SYNC.clrn = VCC;
DOS_SYNC.clk = F14; или Z80 CLK
DOS_SYNC.prn = VCC;
DOS = DOS_SYNC.q;
Это типа примитива SRFF вместо DFF. Я так понял.
Код:
%===================== Формирователь сигнала DOS =========================================%
DOS_REG.clrn = VCC;
DOS_REG.prn = VCC;
DOS_REG.r = RES & (SEL_CODE # A45);
DOS_REG.clk = CLK;
DOS_REG.s = SEL_3DXX & NMI_REG.q;
DOS = !DOS_REG.q;
Попробовал твой вариант - не помогло.
---------- Post added at 20:38 ---------- Previous post was at 20:36 ----------
А твой помог. Вот мож кому пригодится - рабочий код.
Код:%============== Формирователь сигнала выбора кода инструкции из памяти ================%
SEL_CODE = M1 # MREQ;
%============== Формирователь сигнала выбора окна ПЗУ =================================%
SEL_3DXX = !(ADDR[8] & !ADDR[9] & ADDR[10] & ADDR[11] & ADDR[12] & ADDR[13] & ROM128 & A45 & !SEL_CODE);
%================ Формирователь сигнала NMI ============================================%
NMI_REG.d = MAGIC; %A45 # MAGIC;%
NMI_REG.clrn = VCC;
NMI_REG.clk = SEL_CODE;
NMI_REG.prn = SEL_3DXX;
NMI = NMI_REG.q;
%===================== Формирователь сигнала DOS =========================================%
DOS_REG.clrn = VCC;
DOS_REG.prn = VCC;
DOS_REG.s = !(RES & (SEL_CODE # A45));
DOS_REG.clk = !CLKZ;
DOS_REG.r = !(SEL_3DXX & NMI_REG.q);
DOS = DOS_REG.q;
А такое никто не пробовал? LabVIEW_FPGA
Кстати еще один глючок нашел при отладки фени. Прерывания временами шли с удвоенной частотой. Я и так и сяк думал как же так, когда по формуле чито должен идти с нормальной частотой. Полез в файл отчета при компиляции. А там это чудо программной мысли(MAX PLUS II) сгенерил мне примитивы EXP, а в литературе пишут, что это глючные примитивы. Вот формулы запихал в примитив LCELL. Вуаля прерывания стали идти с нормальной частотой. Так что при компиляции заглядывайте в файл отчета что там он наделал.
Опять я с тупым вопросом. Пытаюсь читать из AY, а он судя по осцилу пытается писать, линии BDIR и BC1 активны.
Вод код, может я ошибся - в упор смотрю и не вижу.
Код:%============== Формирователь сигнала разрешения доступа к портам AY ============%
BC1 = !CSFD & ADDR14 & ADDR15;
BDIR = !CSFD & !WR & ADDR15;
Дело не в bc1 и bdir
Надо ещё вывести данные на шину
DATi <=(Dat AY) when (a_bus(15 downto 0) = X"FFFD" and cpu_iorq_n='0' and cpu_m1_n = '1' ) else "11111111"
Ну так сотри.
Я пример привёл... Его надо вставить в процесс, где у тебя выставляются данные с чего либо.
---------- Post added at 19:31 ---------- Previous post was at 19:26 ----------
Запиши - DATi <=(Dat AY) when (a_bus(15 downto 8) = X"FF" and CSFD = '1' ) else ........
Только не говори, что csfd у тебя активно = '0'. Сам исправишь, это опять пример.
Гыыыыы, не знал, сорри.
Тогда пусть попробуй как в реверсе
bc1 <= '1' when (nM1 = '1' and nIORQ = '0' and A(15 downto 14) = "11" and A(1 downto 0) = "01") else '0';
bdir <= '1' when (nM1 = '1' and nIORQ = '0' and nWR = '0' and A(15) = '1' and A(1 downto 0) = "01") else '0';
И без CSFD, а там посмотрим.
Аська пока недоступна (прогу снес).
Я чисто промоделировал дешифратор то что у меня на схеме обработчик порта xxFD.
Для полной ясности вот весь код.
По логике BDIR возникать должен только при записи. А у меня и при чтении.Код:%============ Формирователь сигнала разрешения доступа к портам ввода-вывода =========%
ENABLE_IO = !M1 # IORQ # IORQGE;
%============ Формирователь сигнала разрешения доступа к портам FXh =================%
ENABLE_FX = !(ADDR[7] & ADDR[6] & ADDR[5] & ADDR[4]) # ENABLE_IO;
%============= Формирователь сигнала разрешения доступа к портам FDh ================%
CSFD = !ADDR[3] # !ADDR[2] # ADDR[1] # !ADDR[0] # ENABLE_FX;
%============== Формирователь сигнала разрешения доступа к портам AY ============%
BC1 = !CSFD & ADDR14 & ADDR15;
BDIR = !CSFD & !WR & ADDR15;
Естетсвенно он ничего не делает в этом случае и считывает FF с шины.
У меня не проблема довести данные до шины данных ЦП. Проблема в возникновении активного BDIR при чтении.