Так, короче я пока в ступоре - не могу сформировать нормальный Инт.
Либо у меня крыша уехала, либо не знаю что думать.
Короче, господа ПЛИСоносцы, прошу вас помочь сочинить этот злочастный инт.
Верилог я не знаю, можно и на VHDL, а лучше на AHDL. Только просьба реально работающие куски. А то буксую не по-детски.
Смысл такой по окончанию кадрового импльса по идее должен защелкиваться триггер, а спустя 32 такта процессора сбрасываться.Код:------------------------------------------------------------------------------------ -- Сигнал прерывания -- Примечание: прерывание генерится с частотой 50Гц ------------------------------------------------------------------------------------ Int_sync.clk = VSync; -- прерывание на 256 импульсе --VSync; -- сигнал KS/ Int_sync.d = GND; IF Turbo_en == 0 THEN Int_sync.prn = !(HSync_count[5].q # HSync_count[4].q # HSync_count[3].q); ELSE Int_sync.prn = !(HSync_count[5].q # HSync_count[4].q # HSync_count[3].q # HSync_count[2].q); END IF; ------------------------------------------------------------------------------------ -- Сигнал прерывания ------------------------------------------------------------------------------------ C_INT = Int_sync.q;
Но ведет себя вообще странно, то появляется один раз, то два раза, а то вообще не появляется. По идее он должен появлятся синхронно с окончанием кадрового импульса.
Посмотрел кусок у KOE в P2.2 там вроде тоже есть такой триггер
Но я полагаю, что у него там все работает.Код:inttrg.clk=ksi; inttrg.d=gnd; inttrg.prn=((not av2) nand av3); int=inttrg.q;
Имхо, использование асинхронной предустановки в рабочих циклах - это плохой тон Может работать - может нет. Зависит от ПЛИС, компилятора, фаз луны
Я бы подумал примерно так - не пинать сильно - проверить нечем - всего проекта у меня нет
if RST='0' then int <= '1';
elsif clk_cpu'event and clk_cpu='1' then
va <= VSync;
vb <= va;
vc <= va and not vb; --выделили фронт 0-1
if vc='1' then
int <= '0';
else
if Turbo_en='0' then
int <= bla bla bla;
else
int <= not bla bla bla; --
end if;
end if;
end if;
Pentagon 128 / 1993 - PS/2 - HDMI (в процессе)
Mick, а такой вариант:
думаю не стоит заводить сигнал о вкл. турборежима в изменение длины инта, ведь есть стандартная команда проца о приходе прерывания, вот её и завести на сброс тригера, зачем отсчитывать 32 такта?Код:process (m1, iorq, f14) -- синхронный m1 or iorq begin if f14'event and f14='1' then int_cpu_reset <= m1 or iorq; end if; end process; process (f14, reset, int_cpu_reset) begin if reset='0' or int_cpu_reset='0' then int <= '1'; -- сброс инт в 1 по команде проца о приходе прерывания или reset elsif f14'event and f14='1' then if условие перехода vsync в 1 ='1' then -- начало инт; int <= '0'; end if; end if; end process;
Последний раз редактировалось solegstar; 29.01.2015 в 13:54.
Это конечно понятно, но мне хочется по старинке, по времени.
Кстати я ошибся, забыл что у меня сейчас VGA развертка и посему забыл исправить количество тактов на прерывание. Получилось 16, видимо процессору это очень маловато стало, вот и колбасило. Сейчас изменил на полноценные 32 такта, стал вроде как нормально работать - по крайней мере пока не замечал провалов.
Теперь вернусь к выборке SAA, что то мне не нравится как SAA отрабатывает, будто бы через рванный динамик играет. Явно кто то ей там подсерает.
Последний раз редактировалось Mick; 29.01.2015 в 14:03.
а как она у тебя выбирается?
---------- Post added at 13:27 ---------- Previous post was at 13:15 ----------
у себя в профи сделал так:
долго экспериментировал, чтобы никакие оцифровки не включали частоту саа, вроде получилось свести их на нет.Код:-----------------SAA------------------------ CSFFFD <= '0' when adress(15 downto 0)=X"fffd" and mrq='1' and iorq='0' and m1='1' and nemo_ebl='0' and profi_ebl='0' and spi_iorqge='0' and iorqge_mc='0' else '1'; -- условия выборки порта и контроль всех остальных устройств -- висящих на шине по выборкам дешифраторов (iorqge проще говоря) saa_sel <= '0' when Data(7 downto 4)="1111" and Data(2 downto 0)="110" and wr='0' and CSFFFD='0' else '1'; -- учитываются все биты шины данных, кроме ессно самого вкл. саа, -- т.к. на всяких оцифровках (Digital Studio и т.д.) -- бывали глюки со звуком, сильно срало в порты ау) process(f14,saa_bit,res,csts,saa_sel,Data) begin if (res='0') then saa_bit <= '1'; elsif ((f14'event and f14='0') and saa_sel='0') then saa_bit <= Data(3); end if; end process; saa_cs <= '0' when adress(15)='0' and adress(14)='0' and adress(7 downto 0)=X"ff" and saa_bit='0' and m1='1' and iorq='0' and rd='1' and wr='0' and dos='1' and cpm='1' else '1'; -- здесь стандартная выборка, кроме сигнала спм (это для профи, аналог dos в обычном режиме) saa_a0 <= adress(8) or saa_bit; saa_clk <= f8 or saa_bit;
Да дело тут не в выборе SAA похоже. Я вообще взял перекинул в прошивке на другой порт, взял например FB. В программке вывода звука на SAA тоже поменял порты.
Теперь казалось бы от сигнала DOS никак не зависит. Ан нет тот же рваный динамик.
Что то явно в другом.
---------- Post added at 16:03 ---------- Previous post was at 14:46 ----------
Ха, ха нашел причину эффекта рваного динамика SAA. Короче оказалось дело в форме частоты 8МГЦ которая идет с ПЛИС. Стал щупом осцилографа на 8 ногу SAA, вижу нормальную такую синусоиду 8МГЦ и хорошо что я звук при этом включил. Слышу чище стал играть. Ну думаю дай кондер на землю повешу. Порылся на предмет что под рукой, нашел 680пф. Аккуратно приставил к 8 и 9 ногам. Видимо SAA не нравится форма сигнала. Надо похоже было через инвертор пропустить частоту.
вообще странно, может где непропай? у тебя ж с плисины идет сразу на саашку частота, откуда там синусоида? может на переходных отверстиях дорожки где-то теряется? если посмотреть форму сигнала на самой плисине?
---------- Post added at 15:28 ---------- Previous post was at 15:27 ----------
у меня частота на саашку идет прямо с епмки и ниче, нормальные чистые прямоугольные 8 МГц.
Ну как бы у меня другаю ПЛИС это раз и кто ее знает из чего она там собрана, а во вторых у piroxilin тажа петрушка. С другой стороны осцил сам так может показывать. Не забывай что щуп вносит некоторые изменения на форму сигнала и уменьшает пердежку.
И да как бы переходных отверстий в этой дорожки нет. Так что уж непропай тут не причем.
Более того, если стать осцилом на самой ПЛИСине, то эффекта уменьшения пердежа не наблюдается.
Последний раз редактировалось Mick; 30.01.2015 в 06:54.
Попробовал поиграться емкостью кондера. Поставил 33пФ, эффекта никакого. Затем поставил 100пФ, стало получше, но не чисто. И 680пФ стало чисто, на этом пожалуй остановлюсь и запаяю его.
Начал играться с Compact Flash.
Взял из дома переходник
Так сказать отобрал у Феникса, который с ним всегда работал и еще один адаптер, который работает как зря
И обнаружил, что второй либо спаян как зря потому как между некоторыми ногами там как бы замкнуто, либо фиг его знает. Попробую убрать те перемычки, может заработает как надо.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)