Последние темы
» Вити больше нет!автор bug19 Пн Фев 20 2023, 19:54
» Собираем оригинальный Орион 128
автор bug19 Пн Фев 20 2023, 19:47
» Проблема плющеного экрана ОРИОНА
автор kanzler Пн Ноя 28 2022, 12:05
» Орион 128 и его клоны возрождение 2019-2022 год
автор kanzler Пн Ноя 28 2022, 12:03
» Электроника КР-04. Информация, документы, фото.
автор kanzler Пн Ноя 28 2022, 12:02
» Новости форума
автор kanzler Пн Ноя 28 2022, 11:52
» Орион-128 НГМД запуск 2021 года
автор matrixplus Сб Сен 10 2022, 17:36
» ПЗУ F800 для РК86
автор ведущий_специалист Сб Сен 10 2022, 10:37
» Микропроцессорная лаборатория "Микролаб К580ИК80", УМК-80, УМПК-80 и др.
автор Электротехник Вт Июл 26 2022, 19:33
» Орион-128 SD карта в Орионе
автор matrixplus Чт Июн 02 2022, 09:00
» 7 Мая. День Радио!
автор Viktor2312 Чт Май 12 2022, 10:58
» Серия: Массовая радио библиотека. МРБ
автор Viktor2312 Ср Май 11 2022, 12:17
» Полезные книги
автор Viktor2312 Пн Май 09 2022, 15:07
» Орион 128 Стандарты портов и системной шины Х2
автор matrixplus Вс Май 08 2022, 23:08
» Орион-128 и Орион ПРО еще раз про блоки питания
автор matrixplus Вс Май 08 2022, 19:09
» Орион-128 Программаторы
автор matrixplus Вс Май 08 2022, 19:02
» Орион ПРО история сборки 2021 до 2022
автор matrixplus Вс Май 08 2022, 18:47
» Анонсы монет (New coin).
автор Viktor2312 Сб Май 07 2022, 23:11
» Хочу свой усилок для квартиры собрать не спеша
автор Viktor2312 Сб Май 07 2022, 19:33
» Амфитон 25у-002С
автор Viktor2312 Сб Май 07 2022, 09:38
» Майнер: T-Rex
автор Viktor2312 Вс Май 01 2022, 09:12
» GoWin. Изучение документации. SUG100-2.6E_Gowin Software User Guide. Среда разработки EDA.
автор Viktor2312 Пн Апр 25 2022, 01:01
» GoWin. Изучение документации. UG286-1.9.1E Gowin Clock User Guide.
автор Viktor2312 Сб Апр 23 2022, 18:22
» GoWin. Documentation Database. Device. GW2A.
автор Viktor2312 Ср Апр 20 2022, 14:08
» GOWIN AEC IP
автор Viktor2312 Ср Апр 20 2022, 12:08
Самые активные пользователи за месяц
Нет пользователей |
Поиск
Тренируемся писать Софт-процессоры
Страница 1 из 1 • Поделиться
Тренируемся писать Софт-процессоры
1
Тут немного предварительных изысканий.
Эхх, надо всё таки писать, по крайней мере начинать писать свой Soft-процессор.
В общим думаю, что 32-бит для данных будет вполне достаточно.
Для команд остановимся на 40 битах, то есть всего команд может быть 256.
Верхний уровень иерархии будет в схемотехническом виде, чтобы наглядно было.
Остальные все модули и блоки на VHDL естественно.
Сначала попробую сделать простенькое, что-то, но работающее, а потом уже буду пробовать усложнять проект.
Пока всё, дальше нужно думать.
В общим пока код такой:
Так же ясно, что первая команда которая точно будет, это
NOP с кодом 0x0000000000 (нет операции).
***
Пожалуй можно добавить ещё одну команду, довольно простую, которая сразу приходит на ум.
JMP
безусловный переход по адресу заданному в младших 32-разрядах команды.
0х01хххххххх
И немного дополнил код:
***
Но нужно добавлять описание системы команд, начну пожалуй с NOP
Выглядеть это будет так:
when 0 => cp <= cp + 1;
Так сказать перейдём на десятичную систему, чтобы уменьшить объём кода, а то 40 ноликов и единицек, будет слишком громоздко.
И соответственно код примет вид:
***
Нужно добавить теперь эту команду в код.
0х0100000000...0х0111111111 - это весь диапазон адресов на которые возможен переход.
То есть в десятичной системе получается 4.294.967.296 - 8.589.934.591, естественно описывать их поштучно не реально, слишком много when -ов получится аж 4.294.967.296
Поэтому опишем их одной строчкой:
when 4294967296 to 8589934591 => cp <= com(31 downto 0);
но не получается, пишет, что литерал 4294967296, и второй соответственно тоже превышает максимальное целочисленное значение.
ERROR:HDLCompiler:916 - "E:\Project\cpu1\cpu1_core.vhd" Line 37: Literal 4294967296 exceeds maximum integer value
А вот почему, понять не могу, com у нас 40 разрядный, 4294967296 только 33 разряда использует, вот придётся разбираться.
Возможно причина в разрешённом диапазоне допустимых значений определяемых этой строкой: case conv_integer(com) is
Эх, как всё сложно...
***
Перешёл на 24 бита для данных и 32 бита для команд, переписал код, и компилятор ругаться перестал.
Пока код выглядит так:
Теперь нужна команда условного перехода.
Если регистр АR равен 0 (Z).
JMPZ
0x02xxxxxx переход по адресу заданному младшими 24 битами при выполнении условия.
Так же есть диапазон адресов, чтобы не было много when -ов, запишем компактной записью.
Следующим образом:
И теперь код выглядит вот так:
***
Вот думал, что она у меня ругается немного, а я для case не добавил в конце other, дописать нужно ещё одну строчку:
when others => cp <= cp + 1; -- cp + 1 при others
Теперь, пока код выглядит так:
Эхх, надо всё таки писать, по крайней мере начинать писать свой Soft-процессор.
В общим думаю, что 32-бит для данных будет вполне достаточно.
Для команд остановимся на 40 битах, то есть всего команд может быть 256.
Верхний уровень иерархии будет в схемотехническом виде, чтобы наглядно было.
Остальные все модули и блоки на VHDL естественно.
Сначала попробую сделать простенькое, что-то, но работающее, а потом уже буду пробовать усложнять проект.
Пока всё, дальше нужно думать.
В общим пока код такой:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(39 downto 0); -- Вх. команд
cp : inout std_logic_vector(31 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(31 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(31 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
begin
end Behavioral;
Так же ясно, что первая команда которая точно будет, это
NOP с кодом 0x0000000000 (нет операции).
***
Пожалуй можно добавить ещё одну команду, довольно простую, которая сразу приходит на ум.
JMP
безусловный переход по адресу заданному в младших 32-разрядах команды.
0х01хххххххх
И немного дополнил код:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(39 downto 0); -- Вх. команд
cp : inout std_logic_vector(31 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(31 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(31 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
signal stage : std_logic; -- Номер такта
signal rr : std_logic_vector(31 downto 0); -- Регистр стек
begin
process(clk)
begin
if clk'event and clk = '1' then -- По фронту работа
case stage is -- Выбор такта
when '0' => stage <= '1';
when others => stage <= '0';
-- Описание системы команд
end case;
end if;
end process;
end Behavioral;
***
Но нужно добавлять описание системы команд, начну пожалуй с NOP
Выглядеть это будет так:
when 0 => cp <= cp + 1;
Так сказать перейдём на десятичную систему, чтобы уменьшить объём кода, а то 40 ноликов и единицек, будет слишком громоздко.
И соответственно код примет вид:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(39 downto 0); -- Вх. команд
cp : inout std_logic_vector(31 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(31 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(31 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
signal stage : std_logic; -- Номер такта
signal rr : std_logic_vector(31 downto 0); -- Регистр стек
begin
process(clk)
begin
if clk'event and clk = '1' then -- По фронту работа
case stage is -- Выбор такта
when '0' => stage <= '1';
when others => stage <= '0';
case conv_integer(com) is -- Команды
when 0 => cp <= cp + 1; -- NOP
end case;
end case;
end if;
end process;
end Behavioral;
***
Viktor2312;832028 пишет:JMP
безусловный переход по адресу заданному в младших 32-разрядах команды.
0х01хххххххх
Нужно добавить теперь эту команду в код.
0х0100000000...0х0111111111 - это весь диапазон адресов на которые возможен переход.
То есть в десятичной системе получается 4.294.967.296 - 8.589.934.591, естественно описывать их поштучно не реально, слишком много when -ов получится аж 4.294.967.296
Поэтому опишем их одной строчкой:
when 4294967296 to 8589934591 => cp <= com(31 downto 0);
но не получается, пишет, что литерал 4294967296, и второй соответственно тоже превышает максимальное целочисленное значение.
ERROR:HDLCompiler:916 - "E:\Project\cpu1\cpu1_core.vhd" Line 37: Literal 4294967296 exceeds maximum integer value
А вот почему, понять не могу, com у нас 40 разрядный, 4294967296 только 33 разряда использует, вот придётся разбираться.
Возможно причина в разрешённом диапазоне допустимых значений определяемых этой строкой: case conv_integer(com) is
Эх, как всё сложно...
***
Перешёл на 24 бита для данных и 32 бита для команд, переписал код, и компилятор ругаться перестал.
Пока код выглядит так:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(31 downto 0); -- Вх. команд
cp : inout std_logic_vector(23 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(23 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(23 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
signal stage : std_logic; -- Номер такта
signal rr : std_logic_vector(23 downto 0); -- Регистр стек
begin
process(clk)
begin
if clk'event and clk = '1' then -- По фронту работа
case stage is -- Выбор такта
when '0' => stage <= '1';
when others => stage <= '0';
case conv_integer(com) is -- Команды
when 0 => cp <= cp + 1; -- NOP
-- JMP
when 16777216 to 33554431 => cp <= com(23 downto 0);
end case; -- end com
end case; -- end stage
end if;
end process;
end Behavioral;
Теперь нужна команда условного перехода.
Если регистр АR равен 0 (Z).
JMPZ
0x02xxxxxx переход по адресу заданному младшими 24 битами при выполнении условия.
Так же есть диапазон адресов, чтобы не было много when -ов, запишем компактной записью.
Следующим образом:
- Код:
-- JMPZ
when 33554432 to 50331647 => if conv_integer(ar) = 0 then
cp <= com(23 downto 0);
else cp <= cp + 1;
end if;
И теперь код выглядит вот так:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(31 downto 0); -- Вх. команд
cp : inout std_logic_vector(23 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(23 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(23 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
signal stage : std_logic; -- Номер такта
signal rr : std_logic_vector(23 downto 0); -- Регистр стек
begin
process(clk)
begin
if clk'event and clk = '1' then -- По фронту работа
case stage is -- Выбор такта
when '0' => stage <= '1';
when others => stage <= '0';
case conv_integer(com) is -- Команды
when 0 => cp <= cp + 1; -- NOP
-- JMP
when 16777216 to 33554431 => cp <= com(23 downto 0);
-- JMPZ
when 33554432 to 50331647 => if conv_integer(ar) = 0 then
cp <= com(23 downto 0);
else cp <= cp + 1;
end if;
end case; -- end com
end case; -- end stage
end if;
end process;
end Behavioral;
***
Вот думал, что она у меня ругается немного, а я для case не добавил в конце other, дописать нужно ещё одну строчку:
when others => cp <= cp + 1; -- cp + 1 при others
Теперь, пока код выглядит так:
- Спойлер:
- Код:
----------------------------------------------------------------------------
-- Module Name: cpu1_core - Behavioral
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
entity cpu1_core is
Port(clk : in std_logic; -- Вх. тактового сигнала
com : in std_logic_vector(31 downto 0); -- Вх. команд
cp : inout std_logic_vector(23 downto 0); -- Порт счётчика адреса
ar : inout std_logic_vector(23 downto 0); -- Дополнительный порт1
br : inout std_logic_vector(23 downto 0)); -- Дополнительный порт2
end cpu1_core;
architecture Behavioral of cpu1_core is
signal stage : std_logic; -- Номер такта
signal rr : std_logic_vector(23 downto 0); -- Регистр стек
begin
process(clk)
begin
if clk'event and clk = '1' then -- По фронту работа
case stage is -- Выбор такта
when '0' => stage <= '1';
when others => stage <= '0';
case conv_integer(com) is -- Команды
when 0 => cp <= cp + 1; -- NOP
-- JMP
when 16777216 to 33554431 => cp <= com(23 downto 0);
-- JMPZ
when 33554432 to 50331647 => if conv_integer(ar) = 0 then
cp <= com(23 downto 0);
else cp <= cp + 1;
end if;
when others => cp <= cp + 1; -- cp + 1 при others
end case; -- end com
end case; -- end stage
end if;
end process;
end Behavioral;
Viktor2312- RIP
- Сообщения : 15492
Дата регистрации : 2012-08-10
Возраст : 45
Откуда : Пятигорск
Похожие темы
» Софт для владельцев АТМ Турбо-2 с винчестером
» Обсуждение желаемых новодельных плат расширения и мелких усовершенствований базовых плат
» Техническая документация - ПО, процессоры, платы
» Радио-86РК: Расширение ОЗУ
» Обсуждение желаемых новодельных плат расширения и мелких усовершенствований базовых плат
» Техническая документация - ПО, процессоры, платы
» Радио-86РК: Расширение ОЗУ
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения