Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 14:47

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 137 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.
Автор Сообщение
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Сб фев 05, 2011 23:58 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
ПОБЕДА!!

Четырехядерник работает в симуляторе!

Теперь делаю следующий шаг.

Надо это дело прописать в ПЛИС и заставить ее одновременно петь, плясать, на дуде играть и сказку рассказывать... Короче, четыре процесса одновременно запустить в работу так, чтобы это было видно невооруженным глазом ;)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 01:10 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Попробовал развести 32-хбитный вариант...

После нескольких правок, развелся со стеками глубиной 3 элемента, на частоту 150MHz.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 01:18 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а на что, кроме количества используемых триггеров влияет глубина стека?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 01:26 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
формально оно и на скорость влияет.
При чем совершенно непредсказуемо.
на 16-битном варианте переход с глубины 8 на глубину 3 серьезно снизил частоту (до 166MHz), хотя ожидалось, если не повышение, то хотя бы на том же уровне.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 09:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Последний бой, он трудный самый (c)

Проснулся с новой идеей для процессора, и подумалось, а почему бы и нет?
Полагаю, мысля интересная, а звучит она примерно так:

"in-line вставки на аппаратном уровне"

Ну, а железно должно выглядеть примерно так:

один из кодов команд объявляется префиксом, и при его появлении в регистр команды грузится длинная цепочка кодов - по сути подпрограмма, которая оказывается загруженной без обращения к памяти, так как содржится внутри процессорного ПЗУ, закодированного на этапе проектирования. А можно подумать даже и о том, чтобы его программировать налету(!). Загрузили программу в длинный регистр сдвига, и она пошла исполняться, пока process не наткнулся на NOP.

СЕЙЧАС буду пробовать эту идейку, а потом займусь вписыванием процессора в реальное железо.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 09:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Запускаю Quartus, сохраняю (в винкомандере) результаты вчерашних трудов в отдельную папку (прямо тут же в папке проекта F7 v1.06.02.2011 Enter), сохраняю старый главный файл под именем myltyCPU, и меняю в нем в трех местах singleCPU на myltyCPU.
Главный файл так и остается одноядерной версией, на которой все эксперименты проводить и буду. Хотя, по окончании ожидаю, что все наработки будут действительны и в многоядерном варианте.
И делать я их собираюсь только в файле пакета, поэтому с ним поступаю так же и сохраняю рядом старую версию под именем CPUpack_v1
а в старом пакете и начинаю ковыряться.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 11:24 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
WingLion писал(а):
Последний бой, он трудный самый (c)

Проснулся с новой идеей для процессора, и подумалось, а почему бы и нет?
Полагаю, мысля интересная, а звучит она примерно так:

"in-line вставки на аппаратном уровне"

Ну, а железно должно выглядеть примерно так:

один из кодов команд объявляется префиксом, и при его появлении в регистр команды грузится длинная цепочка кодов - по сути подпрограмма, которая оказывается загруженной без обращения к памяти, так как содржится внутри процессорного ПЗУ, закодированного на этапе проектирования. А можно подумать даже и о том, чтобы его программировать налету(!).

Это нужно помоделировать, прежде, чем решать что.
Мысль соединить операции в единую цепочку - она то тут то там (вот даже rorelf :D ) это такое соединение - но на уровне строения компилятора а не на уровне процессора) , но нужно хорошо продумывать, что за цепочка.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 11:49 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
вопрос писал(а):
Это нужно помоделировать, прежде, чем решать что.


A я тут чем занимаюсь, вот уже второй час? :))

Именно моделированием этого самого дела с возможностью вписать 16 цепочек команд в систему процессора.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 12:12 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
У... интересно.
Второй час - это правда мало Изображение , но (подробности можно видеть?) :?:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 12:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Подробности отлавливания блох - вряд ли интересны, а когда заработает как надо, тогда и отпишусь.

Пока только типы для inline в пакете прописал и редактирую функцию LogicKernel()

А в главном исходнике изменения только в целях выдачи тестовых линий наружу.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 15:10 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Кажется начало получаться, поэтому продолжаю.

все имзнения в файле пакета

константа для длины кодовой цепочки:

Код:
   -- количество кодов inline регистра
   constant inl_width : natural :=8; -- пока только до 8 команд


тип для регистра с цепочкой:

Код:
subtype inl_word is std_logic_vector (inl_width*4-1 downto 0);


добавка в структуре cpu_t:

Код:
      inl_mode: std_logic; -- режим inline
      inl_reg   : inl_word;   -- inline регистр


Объявление для функции выдающей цепочку кодов по номеру:

Код:
   function INLINE(prefix : std_logic_vector(3 downto 0)) return inl_word;


В конец тела пакета дописываю ее описание:

Код:
function INLINE(prefix : std_logic_vector(3 downto 0)) return inl_word is
   variable rezult_code : inl_word;
begin
   -- по умолчанию все нули
   rezult_code := (others => '0');
   case prefix is
      -- цепочка кодов для вычитания : SUB DUP NAND ADD DUP NAND ;
      when "0000" => rezult_code := dup&c_nand&c_add&dup&c_nand&nop&nop&nop;
      -- : TRUE DUP DUP DUP NAND NAND ; -- константа -1
      when "0001" => rezult_code := dup&dup&c_nand&nop&nop&nop&nop&nop;
      -- : FALSE DUP DUP DUP NAND NAND DUP NAND ; -- константа 0
      when "0010" => rezult_code := dup&dup&c_nand&dup&c_nand&nop&nop&nop;
      -- : DEC DUP DUP DUP NAND NAND ADD ;
      when "0011" => rezult_code := dup&dup&dup&c_nand&c_add&nop&nop&nop;
      -- мой любимый : NEXT RET CALL ;
      -- программа не успевает вернуться, а сразу вызывает новую подпрограмму
      -- по адресу, на который указывал стек возвратов
      when "0100" => rezult_code := ret&call&nop&nop&nop&nop&nop&nop;
      
      when others => rezult_code := (others => '0');
   end case;
   
   return rezult_code;
end;


В главном CASE меняется код для команд NOP и NEXT
Код:
         when nop =>
            if CPU.inl_mode = '0' then
               -- если нет режима инлайна
               -- считывается новая команда
               new_CPU.pc := CPU.pc+1;
               new_CPU.cmd := Data;
               new_CPU.mem := Mread;
            else
               -- иначе
               -- в регистр команд сдвигается следующая, возможно,
               -- не нулевая команда, оставшаяся при включении inline
               new_CPU.cmd := sh_cmd;            
            end if;
            -- inline mode выключается!
            new_CPU.inl_mode := '0';
            -- регистр инлайна просто обнуляется
            new_CPU.inl_reg := (others => '0');      


для next пишу просто:
Код:
when c_next => null;

а выполняемая функция описывается выше главного CASE как действие "по умолчанию"

Код:
      if CPU.cmd(width-1 downto width-4) = c_next then
         -- переход к инлайн режиму
         new_CPU.inl_mode := '1';
         -- загрузка в регистр команды первой команды инлайна и сдвинутого на 8(!) бит регистра команды
         new_CPU.cmd := tmp_inl(inl_width*4-1 downto inl_width*4-4)&CPU.cmd(width-9 downto 0)&nop;
         -- в инлайн регистр загружается осальная часть цепочки и завершающий NOP
         new_CPU.inl_reg := tmp_inl(inl_width*4-5 downto 0)&nop;
      else
         if CPU.inl_mode = '1' then
            -- !!!  inline !!!
            -- следующая команда берется из inline регистра, все остальное в регистре команд сохраняется
            if CPU.inl_reg(inl_width*4-1 downto inl_width*4-4) = 0 then
               -- если следующая inline команда равна нулю, в регистр команд грузится своя следующая команда
               new_CPU.cmd := CPU.cmd(width-5 downto 0)&nop;
               -- и отключается режим инлайна
               new_CPU.inl_mode := '0';
            else
               -- иначе грузится просто следующая инлайн-команда
               new_CPU.cmd := CPU.inl_reg(inl_width*4-1 downto inl_width*4-4)&CPU.cmd(width-5 downto 0);
            end if;
            -- а inline регистр сдвигается на четыре бита в любом случае
            new_CPU.inl_reg := CPU.inl_reg(inl_width*4-5 downto 0)&nop;
         else
            -- нормальный режим --
            -- регистр команд просо сдвигается на четыре бита
            new_CPU.cmd := CPU.cmd(width-5 downto 0)&nop;
         end if;
      end if;      
      


Вот с этим навороченым IF-ом с кучей вложенностей и бился с утра, пока не заставил работать как надо.

Компилируется, в симуляторе работает, рабочая частота на данный момент 177MHz.
Занимаемый объем увеличился незначительно относительно вчерашнего одноядерного состояния: 838 логических ячеек, 362 регистра, 128 килобит памяти.

Отрезаю тестовые выходы... копилирую. Частота подымается до 190MHz.

А пока экспериментировал, доходила и до 195.01MHz (предельная частота внутренней памяти у второго циклона)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 16:30 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
WingLion писал(а):
один из кодов команд объявляется префиксом, и при его появлении в регистр команды грузится длинная цепочка кодов - по сути подпрограмма, которая оказывается загруженной без обращения к памяти, так как содржится внутри процессорного ПЗУ, закодированного на этапе проектирования.

Вау! микрокод переизобретен! :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 16:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
dynamic-wind писал(а):
Вау! микрокод переизобретен!


A фортовый микрокод кто-нибудь делал?

A тем временем в квартусе компилится тестовая схемка для заливки в реальную ПЛИС.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 17:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
A фортовый микрокод кто-нибудь делал?

да, конечно делали. Кажется, с него и начинали 8)
WISC CPU/16 смотри в Stack Computers: the new wave страницы 50 - 61

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: процессор за час
СообщениеДобавлено: Вс фев 06, 2011 18:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Следующий шаг - делаю схему в графическом редакторе, ставлю SingleCPU, PLL, выдающую 160MHz на одном выходе и 40MHz (25% скважности) на другом и подсоединяю выходы к процессору. 160MHz на clk, 40MHz на enable, и выход locked на вход reset процессора.

Делаю нужные входы выходы для всей схемы и компилирую.

пока комплируется, "рисую" контроллер параллельного порта на VHDL специально для этого процессора.

Код:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
USE WORK.CPUpack.all;


entity Parallel_Port is

Generic(
   core : natural :=1;
   Addr1 : natural := 32768;
   Addr2 : natural := 32769;
   Addr3 : natural := 32770;
   Addr4 : natural := 32771
);

   Port(
      clk   : in std_logic;
      -- ???????????? ????
      iAddr : in word;
      CPU_data_in : in word;
      CPU_data_out : out word;
      data_wr : in std_logic;
      id : in byte := "00000000";
      -- ???????????? ????
      Port1in : in word :=zero;
      Port1out : out word;
      Port2in : in word :=zero;
      Port2out : out word;
      Port3in : in word :=zero;
      Port3out : out word;
      Port4in : in word :=zero;
      Port4out : out word   
   );

end Parallel_Port;

architecture rtl of Parallel_Port is
   signal out_reg1,out_reg2,out_reg3,out_reg4 : word;
   signal in_reg1,in_reg2,in_reg3,in_reg4 : word;
   signal sel1,sel2,sel3,sel4 : std_logic;
begin

   process (clk) begin
      if clk'event and clk = '1' then
         in_reg1 <= Port1in;
         if sel1 = '1' and data_wr = '1' then
            out_reg1 <= CPU_data_in;
         end if;
         
         in_reg2 <= Port2in;
         if sel2 = '1' and data_wr = '1' then
            out_reg2 <= CPU_data_in;
         end if;
         
         in_reg3 <= Port3in;
         if sel3 = '1' and data_wr = '1' then
            out_reg3 <= CPU_data_in;
         end if;
         
         in_reg4 <= Port4in;
         if sel4 = '1' and data_wr = '1' then
            out_reg4 <= CPU_data_in;
         end if;
         
         if iAddr = Addr1 then sel1 <=  '1'; else sel1 <= '0'; end if;
         if iAddr = Addr2 then sel2 <=  '1'; else sel2 <= '0'; end if;
         if iAddr = Addr3 then sel3 <=  '1'; else sel3 <= '0'; end if;
         if iAddr = Addr4 then sel4 <=  '1'; else sel4 <= '0'; end if;
         
         if sel1 = '1' then
            CPU_data_out <= in_reg1;
         elsif sel2 = '1' then
            CPU_data_out <= in_reg2;
         elsif sel3 = '1' then
            CPU_data_out <= in_reg3;
         elsif sel4 = '1' then
            CPU_data_out <= in_reg4;
         end if;
         
         
      end if;
      

      
   end process;


   port1out <= out_reg1;
   port2out <= out_reg2;
   port3out <= out_reg3;
   port4out <= out_reg4;

end rtl;


Схема откомпилилась, частота нормальная (больше 160MHz, т.е. на 160 должно работать)
Делаю графический символ для Parallel_Port, ставлю и соединяю его с процессором

В процессоре предварительно был сделан мультиплексор входной шины:

Код:
      if new_CPU_addr < 16384 then
         ram_q <= ram_qq;
      else
         ram_q <= iData;
      end if;


в process-е отвечающем за память.

Компилирую, правлю параллельный порт, что бы он не глушил частору (выше исходник уже поправленый). Компилирую.

Пока все нормально. 176MHz, 871 LCELL вся система, выходов у нее много лишних, на ките столько светодиодов нет, поэтому убавляю лишние выходы...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 137 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7 ... 10  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB