Важная информация

User Tag List

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 31 по 40 из 62

Тема: ЮТ-88: Реализация на ПЛИС (DE1)

  1. #31
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если используешь только половину SRAM (судя по сигналу SRAM_DQ), то маску записи байт надо сделать так:
    SRAM_LB_N <= '0';
    SRAM_UB_N <= '1';
    А то у тебя сейчас включается квазидиск, и пишется старший байт неизвестно откуда.

    ---------- Post added at 19:06 ---------- Previous post was at 18:47 ----------

    И ещё, SRAM_OE_N <= '0'; тоже не есть гуд.

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Member Аватар для Santechnik
    Регистрация
    08.05.2010
    Адрес
    Brisbane, AU
    Сообщений
    193
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я использую обе половинки. Одна - ОЗУ, вторая - квазидиск. Когда включается квазидиск, то старший бит kvazi_block становится 1 и включается половинка UB. Мне кажется, что проблема в самом алгоритме работы с квазидиском. Я видимо его неправильно понимаю. То что я выложил - одна из последних попыток. Изначально было так (и мне кажется это правильнее):

    Код:
    process (clk20, sync_cpu)			--	эмуляция контроллера памяти КР580ВК38
    	begin
    		if (clk20'event and clk20 = '0' and sync_cpu = '1') then
    			db_status <= d_bus_O;
    		end if;	
    end process;
    
    mem_rd <= '1' when (sync_cpu = '0' and db_status(7) = '1' and rd_en = '1' and wr_n = '1') else '0'; -- разрешение чтение из памяти
    io_rd <= '1' when (sync_cpu = '0' and db_status(6) = '1' and rd_en = '1' and wr_n = '1') else '0';	-- разрешение чтение из порта
    mem_wr <= '1' when (sync_cpu = '0' and db_status(1) = '0' and wr_n = '0' and rd_en = '0') else '0';	-- разрешение записи в память
    io_wr <= '1' when (sync_cpu = '0' and db_status(4) = '1' and wr_n = '0' and rd_en = '0') else '0';	-- разрешение записи в порт
    io_stack_rd <= '1' when (sync_cpu = '0' and db_status(2) = '1' and rd_en = '1' and wr_n = '1') else '0';	-- разрешение чтения из стэка (квазидиск)
    io_stack_wr <= '1' when (sync_cpu = '0' and db_status(2) = '1' and wr_n = '0' and rd_en = '0') else '0';	-- разрешение записи в стэк (квазидиск)
    
    ..............
    Здесь вырезан неинтересный блок распределения адресов. В нем же шина данных подается на SDRAM (d_bus_I <= SRAM_DQ(7 downto 0) when (mem_rd = '1' or io_stack_rd = '1'))
    ..............
    
    SRAM_DQ(7 downto 0) <= d_bus_O when (ram_wr = '0' or io_stack_wr = '1') else "ZZZZZZZZ";			
    SRAM_WE_N <= ram_wr;			
    SRAM_CE_N <= '0';
    SRAM_LB_N <= '0' when (kvazi_block(2) = '0' or (io_stack_wr = '0' and io_stack_rd = '0')) else '1';
    SRAM_UB_N <= '0' when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else '1';
    SRAM_OE_N <= '0' when (ram_wr = '0' or io_stack_wr = '1' or io_stack_rd = '1' or mem_rd = '1') else '1';
    SRAM_ADDR <= kvazi_block(1 downto 0) & a_bus when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else "00" & a_bus;
    
    process (clk20)
    	begin
    		if (clk20'event and clk20 = '0') then
    			if (io_wr = '1' and a_bus (15 downto 12) = "0100" and sync_cpu = '0') then
    				case d_bus_O(3 downto 0) is
    					when "1110" => kvazi_block <= "100";
    					when "1101" => kvazi_block <= "101";
    					when "1011" => kvazi_block <= "110";
    					when "0111" => kvazi_block <= "111";
    					when OTHERS => kvazi_block <= "000";
    				end case;
    			end if;
    		end if;
    end process;
    Т.е. мой алгоритм выглядит так:
    1) Если производится запись в порт и адрес порта 40Н (0100 на старших 4-х битах шины адреса), то в зависимости от значения младших 4-х битов шины данных включается нужный блок квазидиска (см. код в case) путем присвоения значения сигналу kvazi_block. У этого сигнала старший бит используется для выбора половинки SRAM, а младшие два подставляются в адрес для SRAM (как 16-ый и 17-ый биты).
    2) Далее при обращении к стеку (когда статусный бит 2 на шине данных при SYNC = 1 равен 1 активируется сигнал io_stack_wr или io_stack_rd) включается вторая половинка SRAM сигналом 0 на SRAM_UB_N, если квазидиск был включен (kvazi_block(2) = '1') записью в порт 40Н. Иначе 0 подается на LB (половинка ОЗУ).

    В этом варианте при попытке выполнения команды SAVE выводится ошибка "NO SPACE". В варианте, который я приводил в предыдущем сообщении, диск работает и пишется без ошибок, но делается это в ОЗУ со всеми вытекающими последствиями, если пишется длинный файл (или много файлов). И команда STAT выдает при этом объем свободного пространства 51k.

    Смущает, что в журнале было написано так: "Таким образом, при обращении к стеку и когда в порт 40Н записано 00, открывается электронный квазидиск. Если инициализация порта 40 не произведена, то стек формируется как обычно, в адресном пространстве основного ОЗУ."
    По схеме же наоборот - если в порт записан 0 (значения старших 4-х битов не учитываются), то на все CAS блоков памяти квазидиска будут поданы нули и они все вместе включатся, что не есть хорошо.
    Я делаю так, как я понял по схеме - ноль в нужном бите шины данных показывает какой блок включать.

  4. #33
    Member Аватар для Santechnik
    Регистрация
    08.05.2010
    Адрес
    Brisbane, AU
    Сообщений
    193
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Одну ошибку нашел - забыл, что вторая половинка SRAM имеет свою шину данных (15..8). Исправил. Но все равно STAT видит только 51K...

  5. #34
    Super Moderator Аватар для Ewgeny7
    Регистрация
    03.07.2005
    Адрес
    Санкт-Петербург
    Сообщений
    10,168
    Спасибо Благодарностей отдано 
    146
    Спасибо Благодарностей получено 
    76
    Поблагодарили
    51 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Santechnik Посмотреть сообщение
    SRAM_OE_N <= '0' when (ram_wr = '0'
    Здесь как-то фиговенько. У тебя OE активен и при записи? Это совсем не гуд. При записи в СРАМ сигнал ОЕ должен быть неактивен, т.е. "1".
    ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
    Speccy-2007 128/AY/TR-DOS

    Сайт с документацией к "Scorpion ZS 256"

  6. #35
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Santechnik Посмотреть сообщение
    Но все равно STAT видит только 51K...
    STAT видит столько, сколько в блоке параметров диска в БИОСе CP/Mа указано.

  7. #36
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    106
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    STAT видит столько, сколько в блоке параметров диска в БИОСе CP/Mа указано.
    Недоработочка!
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  8. #37
    Member Аватар для Santechnik
    Регистрация
    08.05.2010
    Адрес
    Brisbane, AU
    Сообщений
    193
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По даташиту роли не играет. Но убрал на всякий пожарный - ничего не изменилось . STAT выдает стабильно 51k свободного места, т.е. по всей видимости квазидиск не активируется. Вот на всякий случай тот кусок кода со всеми исправлениями на данный момент:

    Код:
    SRAM_DQ(7 downto 0) <= d_bus_O when (ram_wr = '0' or (io_stack_wr = '1' and kvazi_block(2) = '0')) else "ZZZZZZZZ";
    SRAM_DQ(15 downto 8) <= d_bus_O when (io_stack_wr = '1' and kvazi_block(2) = '1') else "ZZZZZZZZ";		
    SRAM_WE_N <= ram_wr;			
    SRAM_CE_N <= '0';
    SRAM_LB_N <= '0' when (kvazi_block(2) = '0' or (io_stack_wr = '0' and io_stack_rd = '0')) else '1';
    SRAM_UB_N <= '0' when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else '1';
    SRAM_OE_N <= '0' when (io_stack_rd = '1' or mem_rd = '1') else '1';
    SRAM_ADDR <= kvazi_block(1 downto 0) & a_bus when (kvazi_block(2) = '1' and (io_stack_wr = '1' or io_stack_rd = '1')) else "00" & a_bus;
    
    process (clk20)
    	begin
    		if (clk20'event and clk20 = '0') then
    			if (io_wr = '1' and a_bus (15 downto 12) = "0100" and sync_cpu = '0') then
    				case d_bus_O(3 downto 0) is
    					when "1110" => kvazi_block <= "100";
    					when "1101" => kvazi_block <= "101";
    					when "1011" => kvazi_block <= "110";
    					when "0111" => kvazi_block <= "111";
    					when OTHERS => kvazi_block <= "000";
    				end case;
    			end if;
    		end if;
    end process;
    ---

    А-а-а-а! Проверил, что стоит по адресу 4А50 загрузчика. А там 39Н - значение для версии квазидиска 64Кб. Причем это во всех источниках - на сайте, в журнале и в книге. Должно быть F9H! Поменял и теперь STAT показывает 242k свободно! Теперь буду тестировать большими файлами.

    ---

    Не работает При попытке записать файл командой SAVE 200 TEST.TXT залезает аж в область дисплейной памяти, т.е. пишет в ОЗУ вместо квазидиска. Все же видимо в алгоритме проблема...
    Последний раз редактировалось Santechnik; 25.12.2010 в 16:09. Причина: Уточнение

  9. #38
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,847
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    167 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я смотрел БИОС CP/M, там пишется в порт 40h:
    0FFh - выключить квазидиск
    0FEh,0FDh,0FBh,0F7h - для включения соответствующего блока 64К
    Так что алгоритм верен. Проверь, правильно ли формируются сигналы io_stack_wr,io_stack_rd. На мой взгляд, достаточно запоминать один сигнал io_stack.

  10. #39
    Member Аватар для Santechnik
    Регистрация
    08.05.2010
    Адрес
    Brisbane, AU
    Сообщений
    193
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У-ф-ф-ф! Завелось! Из-за кучи исправлений/улучшений начала образовываться каша и плодиться новые ошибки. Так что переписал весь блок работы с памятью с нуля. И заработало.
    Осталось добавить интерфейс для работы с DE1 CONTROL PANEL, чтобы записывать/восстанавливать весь дамп памяти включая квазидиск, а не грузить каждый раз с "магнитофона". Ну и конечно натаскать туда программ. Плюс пофиксить дополнительный знакогенератор как хотел. И можно публиковать!
    А сейчас пошел помогать сумки паковать и отчаливаю с утра на неделю пассивного отдыха - пока рождественские/новогодние каникулы здесь . А там никаких компьютеров - только расслабон! Так что доделывать буду уже в Новом году.
    Всех с наступающим!!! :v2_dizzy_newyear:

  11. #40
    Member Аватар для Santechnik
    Регистрация
    08.05.2010
    Адрес
    Brisbane, AU
    Сообщений
    193
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Прошу прощения, что пропал. Приходится учиться на старости лет Времени на хобби не так много остается. Вот в перерывах между учебой, экзаменами и работой и пишу.
    Итак, проект завершен. Ввиду сложности самого компьютера запуск его на ПЛИС тоже не прост. Поэтому пришлось сделать сайт с подробной информацией как запускать и как работать.
    Все интересующиеся приглашаются сюда: http://ut88.hut1.ru .
    Комментарии и пожелания оставляйте здесь или на страничке комментариев сайта. Правда я не обещаю, что пожелания будут выполнены
    JTAG добавлен и работает, так что теперь можно загрузить всю CP/M вместе с программами на квазидиске одним махом. На сайте есть как SOF и POF файлы, так и исходники и программы. Так же там описано как записать другие программы и где их искать. Я готов выкладывать их тоже на сайте если пожелаете.
    В принципе я хочу поставить на этом проекте точку и переходить к следующему, тем более основная, образовательная, цель этого проекта для меня выполнена.
    Удачи!

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Радио-86РК: Реализация компьютера на ПЛИС
    от Santechnik в разделе Радио-86РК
    Ответов: 162
    Последнее: 06.10.2018, 05:51
  2. Ответов: 65
    Последнее: 14.11.2014, 08:05
  3. реализация JavaScript-a на ZX-Spectrum-48k
    от bigral в разделе Программирование
    Ответов: 4
    Последнее: 10.01.2010, 12:02
  4. Лучшая реализация игры
    от Nerzool в разделе Игры
    Ответов: 19
    Последнее: 05.07.2007, 05:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •