Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:10

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Трехъядерный форт-процессор в ПЛИС
СообщениеДобавлено: Сб окт 17, 2009 05:27 
Не в сети
Administrator
Administrator
Аватара пользователя

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

VHDL-код:

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


ENTITY fcpu IS

GENERIC ( widtx : integer :=16; Ddepth : integer :=8; Rdepth : integer :=5);

   Port(
   clk   : in std_logic;
   rst   : in std_logic;
   all_ena : in std_logic :='1';
   addr      : out std_logic_vector (widtx-1 downto 0);
   data_in      : in std_logic_vector (widtx-1 downto 0);
   data_out   : out std_logic_vector (widtx-1 downto 0);
   rd_ram      : out std_logic;
   wr_ram      : out std_logic;
   cs_ram       : out std_logic;
   addr_fix   : out std_logic_vector (widtx-1 downto 0);
   command      : out std_logic_vector (3 downto 0);
   starts      : in std_logic :='1';
   stops      : in std_logic :='1';
   working      : in std_logic_vector (2 downto 0);
   taskX      : out std_logic_vector (1 downto 0)
   );

END fcpu;

ARCHITECTURE RTL OF fcpu IS

   TYPE TstackD IS array (Ddepth-1 downto 0 ) of std_logic_vector (widtx-1 downto 0);
   TYPE TstackR IS array (Rdepth-1 downto 0 ) of std_logic_vector (widtx-1 downto 0);
   TYPE All_REGS IS array (3 downto 0) of std_logic_vector (widtx-1 downto 0);
-- TYPE comands IS (NOP,LIT,CALL,RET,BRANCH,DUP,SWAP,DROP,RAZIM,PRISV,toR,fromR,MOVE,NEXXT);

   signal RESET : std_logic;
   signal PC : std_logic_vector (widtx-1 downto 0);
   signal newPC : std_logic_vector (widtx-1 downto 0);
   signal TOP :  std_logic_vector (widtx-1 downto 0);
   signal newTOP : std_logic_vector (widtx-1 downto 0);
   signal BOT : std_logic_vector (widtx-1 downto 0);
   signal newBOT : std_logic_vector (widtx-1 downto 0);
   signal CMD   : std_logic_vector (widtx-1 downto 0);
   signal newCMD   : std_logic_vector (widtx-1 downto 0);
   signal rrd : std_logic;
   signal rwr : std_logic;
   signal rcs : std_logic;
   signal CMD4shr : std_logic_vector (widtx-1 downto 0);
   signal CMD8shr : std_logic_vector (widtx-1 downto 0);
   signal RStack : TstackR; -- array (depth-1 downto 0) of std_logic_vector (widtx-1 downto 0);
   signal DStack : TstackD; -- array (depth-1 downto 0) of std_logic_vector (widtx-1 downto 0);
   signal newRStack : TstackR; -- std_logic_vector (widtx-1 downto 0);
   signal newDStack : TstackD; -- std_logic_vector (widtx-1 downto 0);
   signal alu1_resT  : std_logic_vector (widtx-1 downto 0);
   signal alu1_resB  : std_logic_vector (widtx-1 downto 0);
   signal alu2_resT  : std_logic_vector (widtx-1 downto 0);
   signal alu2_resB  : std_logic_vector (widtx-1 downto 0);
   signal alu3_resT  : std_logic_vector (widtx-1 downto 0);
   signal alu3_resB  : std_logic_vector (widtx-1 downto 0);   
   signal mul_res    : std_logic_vector (widtx+widtx-1 downto 0);   
   signal pre_mul    : std_logic_vector (widtx+widtx-1 downto 0);
   
   signal enaX   : std_logic;
   signal xSWAP : std_logic;
   
   signal DStackRD : std_logic_vector (widtx-1 downto 0);
   signal DStackWR : std_logic_vector (widtx-1 downto 0);
   signal RStackRD : std_logic_vector (widtx-1 downto 0);
   signal RStackWR : std_logic_vector (widtx-1 downto 0);
   signal DStackPUSH : TstackD;
   signal DStackPOP : TstackD;
   signal DStackSWAP : TstackD;
   signal RStackPUSH : TstackR;
   signal RStackPOP : TstackR;
   signal RStackSWAP : TstackR;
   signal zero : std_logic_vector (widtx-1 downto 0);

   signal level1 : All_REGS;
   signal level2 : All_REGS;
   signal Dl1   : TstackD;
   signal Dl2   : TstackD;
   signal Rl1   : TstackR;
   signal Rl2   : TstackR;
   
   signal nops, nopsX : std_logic;
   signal nopx : std_logic_vector (2 downto 0);
   
   signal task : std_logic_vector (1 downto 0);

BEGIN

   process (clk,starts,stops,task) begin
      if (clk'event and clk='1') then
         if (conv_integer(task) = 2) then task <= "00"; else task <= (task+1); end if;
      end if;
      nops <= nopsX;
   end process;

   process (task,nopx) begin
      case conv_integer(task) is
         when 0 => nopsX<=working(0);
         when 1 => nopsX<=working(1);
         when 2 => nopsX<=working(2);
         when others => nopsX<='0';
      end case;
   end process;
   

   zero <= (others => '0');
   -- вспомогательные сигналы:
   -- регистр команд, сдвинутый на 4 бита (для большинства команд)
   CMD4shr(widtx-5 downto 0) <= (CMD(widtx-1 downto 4));
   CMD4shr(widtx-1 downto widtx-4)<=zero(widtx-1 downto widtx-4);
   -- регистр команд, сдвинутый на 8 бит для дкоманд-префиксов
   CMD8shr(widtx-9 downto 0) <= (CMD(widtx-1 downto 8));
   CMD8shr(widtx-1 downto widtx-8)<=zero(widtx-1 downto widtx-8);
   -- стек данных
   DStackRD <= DStack(0);
   DStackPUSH(0) <= DStackWR; DStackPUSH(Ddepth-1 downto 1) <= DStack(Ddepth-2 downto 0);
   DStackPOP(Ddepth-2 downto 0) <= DStack(Ddepth-1 downto 1); DStackPOP(Ddepth-1) <= zero;
   DStackSWAP(Ddepth-1 downto 1) <= DStack(Ddepth-1 downto 1);DStackSWAP(0) <= DStackWR;
   -- стек возвратов
   RStackRD <= RStack(0);
   RStackPUSH(0) <= RStackWR; RStackPUSH(Rdepth-1 downto 1) <= RStack(Rdepth-2 downto 0);
   RStackPOP(Rdepth-2 downto 0) <= RStack(Rdepth-1 downto 1); RStackPOP(Rdepth-1) <= zero;
   RStackSWAP(Rdepth-1 downto 1) <= RStack(Rdepth-1 downto 1); RStackSWAP(0) <= RStackWR;
   -- результат умножения
--   mul_res <= TOP * BOT;
   mul_res <= (others => '0');
--   mul_res <= pre_mul;
   
   -- ALU для команд типа DUP#, SWAP#, DROP#
   process (CMD) begin
      case conv_integer(CMD(7 downto 4)) is
         when 0 =>
            -- DUP
            alu1_resB <= TOP; -- caaeooea aey DUP
            alu1_resT <= TOP; -- caaeooea aey DUP
            -- SWAP
            alu2_resB <= TOP; -- caaeooea aey SWAP
            alu2_resT <= BOT; -- caaeooea aey SWAP
            -- DROP               
            alu3_resB <= DStackRD; -- caaeooea aey DROP
            alu3_resT <= BOT; -- caaeooea aey DROP               
         when 1 =>
            -- OVER
            alu1_resB <= TOP; -- caaeooea aey DUP
            alu1_resT <= BOT; -- caaeooea aey DUP
            -- INC
            alu2_resB <= BOT; -- caaeooea aey SWAP
            alu2_resT <= TOP+1; -- caaeooea aey SWAP
            -- ADD
            alu3_resB <= DStackRD; -- caaeooea aey DROP
            alu3_resT <= BOT+TOP; -- caaeooea aey DROP
         when 2 =>
            -- TRUE
            alu1_resB <= TOP; -- caaeooea aey DUP
            alu1_resT <= zero; -- caaeooea aey DUP
            -- DEC
            alu2_resB <= BOT; -- caaeooea aey SWAP
            alu2_resT <= TOP-1; -- caaeooea aey SWAP
            -- SUB
            alu3_resB <= DStackRD; -- caaeooea aey DROP
            alu3_resT <= BOT-TOP; -- caaeooea aey DROP
         when 3 =>
            -- FALSE
            alu1_resB <= TOP; -- caaeooea aey DUP
            alu1_resT <= (others => '1'); -- caaeooea aey DUP
            -- MUL
            alu2_resB <= mul_res(widtx+widtx-1 downto widtx);
            alu2_resT <= mul_res(widtx-1 downto 0);
            --alu2_resB <= BOT; -- caaeooea aey SWAP
            --alu2_resT <= TOP-1; -- caaeooea aey SWAP
            -- AND
            alu3_resB <= DStackRD; -- caaeooea aey DROP
            alu3_resT <= BOT and TOP; -- caaeooea aey DROP
         when 4 =>
            -- ONE
            alu1_resB <= TOP; -- caaeooea aey DUP
            alu1_resT <= (0 => '1',others => '0'); -- caaeooea aey DUP
            -- MUL
            alu2_resB <= mul_res(widtx+widtx-1 downto widtx);
            alu2_resT <= mul_res(widtx-1 downto 0);
            --alu2_resB <= BOT; -- caaeooea aey SWAP
            --alu2_resT <= TOP-1; -- caaeooea aey SWAP
            -- OR
            alu3_resB <= DStackRD; -- caaeooea aey DROP
            alu3_resT <= BOT or TOP; -- caaeooea aey DROP
         when others =>
            alu1_resB <= TOP; -- заглушка для DUP
            alu1_resT <= TOP; -- заглушка для DUP
            alu2_resB <= TOP; -- заглушка для SWAP
            alu2_resT <= BOT; -- заглушка для SWAP
            alu3_resB <= DStackRD; -- заглушка для DROP
            alu3_resT <= BOT; -- заглушка для DROP
      end case;
   end process;

   -- вся логика процессора
   process (RESET,CMD) begin
      -- установки при сбросе
      if RESET = '0' then

         newPC <= zero;
         newBOT <= BOT;
         newTOP <= TOP;
         DStackWR <= DStackRD;
         RStackWR <= RStackRD;
         newRStack <= RStack; -- RStack-NOP
         newDStack <= DStack; -- DStack-NOP
         enaX <= '0';
         rrd <= '1';
         rcs <= '1';
         rwr <= '1';
         newCMD <= zero;
         enaX <= '0';
      else
         if nops='0' then
            newPC <= PC;
            enaX <= enaX;
            newCMD <= CMD;
            newBOT <= BOT;
            newTOP <= TOP;
            RSTackWR <= RStackRD;
            DSTackWR <= DStackRD;
            newRStack <= RStack;
            newDStack <= DStack;
            rrd <= '1';
            rcs <= '1';
            rwr <= '1';
            enaX <= enaX;
         else
         -- система команд здесь!
         case conv_integer(CMD(3 downto 0)) is
            -- NOP
            when 0 =>
               newPC <= PC+1;
               enaX <= '0';
               newCMD <= data_in;
               newBOT <= BOT;
               newTOP <= TOP;
               RSTackWR <= RStackRD;
               DSTackWR <= DStackRD;
               newRStack <= RStack;
               newDStack <= DStack;
               rrd <= '0';
               rcs <= '0';
               rwr <= '1';
               enaX <= '0';
            -- LIT
            when 1 =>
               enaX <= '0';
               newBOT <= TOP;
               newTOP <= data_in;
               newPC <= PC+1;
               rrd <= '0';
               rcs <= '0';
               rwr <= '1';
               newDStack <= DStackPUSH; DStackWR <= BOT;
               newRStack <= RStack; RStackWR <= RStackRD;
               newCMD <= CMD4shr;
            -- CALL
            when 2 =>
               enaX <= '0';
               newBOT <= BOT;
               newTOP <= TOP;
               newPC <= data_in;
               rrd <= '0';
               rcs <= '0';
               rwr <= '1';
               DStackWR <= DStackRD;
               newRStack <= RStackPUSH; RStackWR <= PC+1;
               newDStack <= DStack;
               newCMD <= zero;
            -- RET
            when 3 =>
               enaX <= '0';
               newBOT <= BOT;
               newTOP <= TOP;
               newPC <= RStackRD;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD; DSTackWR <= DStackRD;
               newDStack <= DStack;
               newRStack <= RStackPOP; -- RStack-POP
               newCMD <= CMD4shr;
            -- IF   
            when 4 =>
               enaX <= '0';
               if (conv_integer(TOP) = 0) then
                  newPC <= PC+1;
                  newCMD <= CMD4shr;
               else
                  newPC <= data_in;
                  newCMD <= CMD4shr;
               end if;
               newBOT <= BOT;
               newTOP <= TOP;
               rrd <= '0';
               rcs <= '0';
               rwr <= '1';      
               RSTackWR <= RStackRD; DSTackWR <= DStackRD;
               newRStack <= RStack;
               newDStack <= DStack;
            -- DUP operations
            when 5 =>
               enaX <= '0';
               newPC <= PC;
               newBOT <= alu1_resB;
               newTOP <= alu1_resT;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD;
               DSTackWR <= BOT;
               newDStack <= DStackPUSH; -- BOT; -- DStack-PUSH
               newRStack <= RStack;
               newCMD <= CMD8shr;
            -- SWAP opeations
            when 6 =>  -- SWAP, ROT, -ROT, INC, DEC, NEG, NOT...
               enaX <= '0';
               newPC <= PC;
               newBOT <= alu2_resB;
               newTOP <= alu2_resT;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD; DSTackWR <= DStackRD;
               newDStack <= DStackSWAP;
               newRStack <= RStack;
               newCMD <= CMD8shr;
            -- DROP operations
            when 7 =>
               enaX <= '0';
               newPC <= PC;
               newBOT <= alu3_resB;
               newTOP <= alu3_resT;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD; DSTackWR <= DStackRD;
               newDStack <= DStackPOP; -- DStack-POP
               newRStack <= RStack;
               newCMD <= CMD8shr;
            -- @
            when 8 =>
               enaX <= '1';
               if (xSWAP = '0') then
                  newPC <= TOP;
                  newTOP <= BOT;
                  newBOT <= DStackRD;
                  rrd <= '1';
                  rcs <= '1';
                  rwr <= '1';
                  RSTackWR <= PC;
                  DSTackWR <= DStackRD;
                  newDStack <= DStackPOP; -- SDtack-POP
                  newRStack <= RStackPUSH; -- PC; -- RStack-PUSH
                  newCMD <= CMD; -- команда не меняется
               else
                  newPC <= RStackRD;
                  newBOT <= TOP;
                  newTOP <= data_in;
                  rrd <= '0';
                  rcs <= '0';
                  rwr <= '1';
                  RSTackWR <= RStackRD; DSTackWR <= BOT;
                  newDStack <= DStackPUSH; -- DStack-POP
                  newRStack <= RStackPOP; -- RStack-POP
                  newCMD <= CMD4shr;   -- следующая команда
               end if;
            -- !
            when 9 =>
               enaX <= '1';
               if (xSWAP = '0') then
                  newPC <= TOP;
                  newTOP <= BOT;
                  newBOT <= DStackRD; -- SDtack-POP
                  rrd <= '1';
                  rcs <= '1';
                  rwr <= '1';
                  RSTackWR <= PC;
                  DSTackWR <= DStackRD;
                  newDStack <= DStackPOP; -- SDtack-POP
                  newRStack <= RStackPUSH; -- PC; -- RStack-PUSH
                  newCMD <= CMD; -- команда не меняется
               else
                  newPC <= RStackRD;
                  newBOT <= DStackRD;
                  newTOP <= BOT;
                  rrd <= '1';
                  rcs <= '0';
                  rwr <= '0';
                  RSTackWR <= RStackRD; DSTackWR <= DStackRD;
                  newDStack <= DStackPOP; -- DStack-POP
                  newRStack <= RStackPOP; -- RStack-POP
                  newCMD <= CMD4shr;   -- следующая команда
               end if;
            -- >R
            when 10 =>
               enaX <= '0';
               newPC <= PC;
               newBOT <= DStackRD;
               newTOP <= BOT;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= TOP; DSTackWR <= DStackRD;
               newDStack <= DStackPOP;
               newRStack <= RStackPUSH;
               newCMD <= CMD4shr;
            -- R>
            when 11 =>
               enaX <= '0';
               newPC <= PC;
               newBOT <= TOP;
               newTOP <= RStackRD;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD; DSTackWR <= RStackRD;
               newDStack <= DStackPUSH; -- DStack-PUSH
               newRStack <= RStackPOP; -- RSTack-POP
               newCMD <= CMD4shr;
            -- MOVE
            when 12 =>
               enaX <= '1';
               if (xSWAP = '0') then
                  newPC <= RStackRD;
                  newBOT <= TOP;
                  newTOP <= data_in;
                  rrd <= '0';
                  rcs <= '0';
                  rwr <= '1';
                  RSTackWR <= PC+1;
                  DSTackWR <= BOT;
                  newDStack <= DStackPUSH;
                  newRStack <= RStackSWAP;
                  newCMD <= CMD;
               else
                  newPC <=RStackRD;
                  newTOP <= BOT-1;
                  newBOT <= DStackRD;
                  rrd <= '1';
                  rcs <= '0';
                  rwr <= '0';
                  RSTackWR <= PC+1;
                  DSTackWR <= DStackRD;
                  newDStack <= DStackPOP;
                  newRStack <= RStackSWAP;
                  if (conv_integer(BOT) = 1) then
                     newCMD <= CMD4shr;
                  else
                     newCMD <= CMD;
                  end if;
               end if;
            -- NEXT
            when 13 =>
               enaX <= '1';
               if (xSWAP = '0') then
                  newPC <= RStackRD;
                  newBOT <= BOT;
                  newTOP <= TOP;
                  rrd <= '1';
                  rcs <= '1';
                  rwr <= '1';
                  RSTackWR <= RStackRD; DSTackWR <= DStackRD;
                  newDStack <= DStack;
                  newRStack <= RStackPOP;
                  newCMD <= CMD; -- здесь команда не меняется
               else
                  newPC <= data_in;
                  newBOT <= BOT;
                  newTOP <= TOP;
                  rrd <= '0';
                  rcs <= '0';
                  rwr <= '1';
                  RSTackWR <= PC+1;
                  DSTackWR <= DStackRD;
                  newDStack <= DStackPUSH;
                  newRStack <= RStackPUSH;
                  newCMD <= CMD4shr;
               end if;
               
               
            when others =>

               enaX <= '0';
               newPC <= PC;
               newBOT <= BOT;
               newTOP <= TOP;
               rrd <= '1';
               rcs <= '1';
               rwr <= '1';
               RSTackWR <= RStackRD;
               DSTackWR <= DStackRD;
               newDStack <= DStack;
               newRStack <= RStack;
               newCMD <= CMD4shr;
         end case;
         end if;
      end if;
   end process;
   
   -- все регистры
   process (clk,all_ena) begin
      if (clk'event and clk='1' and all_ena='1') then

         level1(3) <= newCMD;
         level1(2) <= newPC;
         level1(1) <= newTOP;
         level1(0) <= newBOT;
         level2 <= level1;
         Dl1 <= newDStack;
         Rl1 <= newRStack;
         Dl2 <= Dl1;
         Rl2 <= Rl1;


         level2 <= level1;
      
         CMD <= level2(3); -- newCMD;
         PC <= level2(2); -- newPC;
         TOP <= level2(1); -- newTOP;
         BOT <= level2(0); -- newBOT;
         RESET <= rst;
         RStack <= Rl2; -- newRStack;
         DStack <= Dl2; -- newDStack;
         xSWAP <= (not xSWAP) and enaX;
         addr_fix <= newPC;
      end if;
   end process;
   
   -- умножение производится сразу, как в TOP и BOT появились новые значения
   -- независимо от all_ena
   process (clk) begin
      if (clk'event and clk='1') then
         pre_mul <= TOP * BOT;
      end if;
   end process;

   -- назначения выходов
--   addr <= PC;
   addr <= newPC;
   data_out <= TOP;
   rd_ram <= rrd;
   wr_ram <= rwr;
   cs_ram <= rcs;   
   command   <= CMD (3 downto 0);
   taskX <= task;

END ARCHITECTURE;



Работает с синхронной внешней памятью, имеющей задержку в 2 клока.

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

Сигналы working(2 downto 0) - определяют, включено соответствующее ядро или гоняется вхлолостую.

Процессор отличается от того, что описан в соседней теме дополнительными регистрами ~ 300 на ядро.
Объем чуть больше 1000LE.

Тактовая частота, общая на всех - 180MHz, для каждого ядра - по 60 MHz. (окончательный результат на вечер 17 числа)

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


Последний раз редактировалось WingLion Вс окт 25, 2009 09:56, всего редактировалось 4 раз(а).

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

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

16 разрядная версия занимает ~1000LE и работает на частоте 120MHz (на циклоне-2) (по 40MHz на ядро)
32 разрядная версия занимает ~2400LE и работает на частоте 120MHz (на циклоне-3) (по 40MHz на ядро)

Сейчас собираю тестовую систему с трехголовым процессором и памятью (16Кx32 - почти вся, что есть в EP3C25)

некоторые проблемы возникают из-за настойчивых попыток фиттера упаковать регистры, похожие на регистры сдвига в блоки памяти.
Из-за этого возникает ошибка из-за превышения требуемых ресурсов над имающимися.
Пытаюсь найти установки, которые запрещают фиттеру так безобразничать.

п.с. так как название "Горыныч" уже как бы занято, подумываю назвать сей процессор "Цербером" ;)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 14:43 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
WingLion писал(а):
На данный момент результаты симуляции следующие.
16 разрядная версия занимает ~1000LE и работает на частоте 120MHz
(на циклоне-2) (по 40MHz на ядро)
32 разрядная версия занимает ~2400LE и работает на частоте 120MHz
(на циклоне-3) (по 40MHz на ядро)
Сейчас собираю тестовую систему с трехголовым процессором и памятью (16Кx32 - почти вся, что есть в EP3C25)
1000LE - а там их 25000. Девяток ядер запросто? Ты хочешь именно Альтеру использовать?
Потом ЭТО в Ксайлинкс перенесётся с учётом что там EEPROM загрузчик внутри?

Погоняй такой вариант, учитывая что у тебя кратно 3-м!?
ядра - 9 шт по 16 бит - 32 МГц на ядро, кристал EP3C16Q240, без внешнего ОЗУ!
Адресация ОЗУ 64K в ОБЩЕМ адресном пространстве делится по 8К*16 - там можно и флаги развесить, 9 штук - ты рекомендовал по три - 9 ядер в EP3C16Q240C8 - для начала, возможен рост
16 бит - один форт атом при 32 МГц 32*9=288 МИПС этого достаточно много, возможен рост
у каждого ядра в общем адресном 64K пространстве свои 8К с изменением ёмкости кристалла будет у ядра не 4K*16 а, например, 6К или 3К и никакие адреса соседей (при другом кристалле) никуда "не уплывут".

ATtiny2313 EPROM 2K*8, EEPROM 128*8, SRAM 128*8 = $1
И про стоны "мало внутри ОЗУ". У меня 50% изделий на нём.
Ставлю их много рядом с кучей датчиков и гоняю по одной сетке 485.
И там ASM а не Форт. :) Так всё и останется. Удобно очень.

Нормы на печатные платы: один файл гербера PCB!
минимальное отверстие - 0,6 мм
максимальное - 3 мм
ширина проводника - 0,25 мм
между проводниками - 0,25 мм
Всегда делаю шаблон номинально 300*300мм,
С этого делается фотошаблон на два слоя и две маски на них = $40.
Можно и маркировку, но ещё два шаблона - это лишнее.
Одна заготовка 300*300 для меня $15, при партии 10шт.
Можно больше, можно меньше заготовок.
Время - номинально неделя. Попав в "струю" - один день!
К сожалению фрезеровки нет. Фрезеровщик заболел. ;)
Только в больших партиях.

На период эксперимента бонус - я 11 плат раздаю,
получаю одну рабочую! Подходит? :)

Под BGA 256 подойдут такие нормы при двухсторонней плате?
Вроде BGA дешевле, а запаять на плату на автомате есть возможность?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 17:58 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Задал вопрос на Альтеровском форуме и уже получил ответ.

Разультат - 16битная версия с памятью 32Kx16 в EP3C25F324C6
- логический объем 1486LE (6%) (увеличился за счет размещения регистров в логических ячейках, а не в памяти)
- объем занятой памяти для кода и данных 512KBit (86%)
- рабочая частота 180,15MHz (по 60MHz на ядро, как и хотелось с самого начала).

Для 32-битной версии с памятью 16Кx32 в EP3C25F324C6
- логический объем 2912LE (12%)
- объем занятой памяти для кода и данных 512KBit (86%)
- рабочая частота 156,42MHz (по 50MHz на ядро).

Экспериментировать пока буду с 16-разрядным, т.к. оно и разводится быстрее, и рабочая частота красивее (180MHz удобно для sVGA контроллера дисплея).

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
2Sotnik на счет платы надо еще хорошо подумать, что на нее поставить, чтобы потом локти себе не кусать из-за какой-нибудь глупой ошибки.
BGA по такой норме не развести. Для него надо многослойку делать. Если такой возможности нет, надо сразу закладываться на EP3C40Q240, потому что с нее на EP3C16Q240 перейти можно, а назад - вряд ли, потому что у 16-й большее количество пользовательских ножек (такой вот парадокс, 40-я ПЛИС больше, а ножек меньше).

На плату я предполагаю ставить следующее:

0. ПЛИС EP3C40Q240xxx (с возможностью поставить на ее место при необходимости 16-ю или 25-ю)
1. Статическую синхронную память на 256Кx32 как минимум
2. Динамическую память SD-RAM 64Мx16 (128MB)
3. Flash память от 2 до 16Bbit (одно посадочное место) (на 2Gbit - K9F02G08xxx)
4. ПЛИС EPM240T100C5 для загрузки из Flash-памяти и доступа к этому флешу во время работы.
5. Генератор SG8002 на 100MHz (при необходимости, частота может быть изменена)
6. Интерфейсы JTAG, RS232 (x2?), USB (FT245BL), RS245, параллельный интерфейс с выходом на разъем типа IDC40 (как у IDE винчестера), интефейс для SD/MMC,
не забыть Ethernet10/100 с RJ45.
7. Выход на sVGA, два входа PS/2 (клава, мышь)
8. На все свободные места платы - монтажные поля - отверстия с шагом 2.5мм
9. Все незадействованные ножки ПЛИС выводятся на дополнительные разъемы, которые можно ставить, можно не ставить.

Схему буду рисовать в OrCAD-е. Разводить - там же.
Выход из Оркада - Gerber RS234X если не вру. Или прямо файл разводки (*.MAX)

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Sotnik писал(а):
Под BGA 256 подойдут такие нормы при двухсторонней плате?
Вроде BGA дешевле, а запаять на плату на автомате есть возможность?

Отверстие надо 0,4. И для BGA желательно хотя бы 4 слоя.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
USB (FT245BL)

FT232R поудобнее будет в плане стыковки с ПЛИС и обвязки. У нее конденсатор на 0,1 снаружи надо, и все.

10. EEPROM (есть FRAM, совместимые по выводам)


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

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

245-й хочу, потому что на ней сразу байт-бластер альтеровский получится (если прошивку найти).
хм... а FT232R - это не просто RS232 случайно?

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
245-й хочу, потому что на ней сразу байт-бластер альтеровский получится (если прошивку найти).
хм... а FT232R - это не просто RS232 случайно?

USB <-> RS232. И у нее есть 4 программируемых вывода, на байт-бластер хватит.


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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 19:20 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Цитата:
WingLion писал(а):
2Sotnik на счет платы надо еще хорошо подумать, что на нее поставить
Думай.
Цитата:
На плату я предполагаю ставить следующее:
Рисуй схему. :)

Цитата:
Выход из Оркада - Gerber RS234X если не вру. Или прямо файл разводки (*.MAX)

Скинь чего-нить только посмотреть и прикинуть на SotnikSTO@yandex.ru
В теме напиши какое нить умное слово по теме, типа FPGA. :)
У тебя город какой?


Последний раз редактировалось Sotnik Сб окт 17, 2009 19:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 19:23 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Хищник писал(а):
Sotnik писал(а):
Под BGA 256 подойдут такие нормы при двухсторонней плате?
Вроде BGA дешевле, а запаять на плату на автомате есть возможность?

Отверстие надо 0,4. И для BGA желательно хотя бы 4 слоя.
Расстояние между центрами и ширина пина? BGA256 получается четырёхрядный.
У тебя город какой?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 19:31 
Не в сети
Administrator
Administrator
Аватара пользователя

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

WingLion писал(а):
Откуда: St.Petersburg

Sotnik писал(а):
BGA256 получается четырёхрядный.

от типа корпуса количество ядер фактически не зависит, от него зависит только, сколько сигналов вывести можно.

А ядер можно много упаковать. Вот, прямо сейчас 5-ядерный вариант компилирую

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 17, 2009 19:42 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Sotnik писал(а):
16 бит - один форт атом при 32 МГц 32*9=288 МИПС


Сие есть unreal, если делать общую память, потому что каждое ядро должно иметь доступ к памяти, 32 млн. раз в секунду, т.е. память должна обеспечить 288 миллионов операций чтения/записи за секунду, что возможно только на дорогих чипах. Циклон по даташиту не даст более 250MHz, реально же оказывается итого ниже. Сейчас - 170-180MHz, т.е. 180 MIPS - это предел по скорости памяти, который перепрыгнуть не так просто.

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Sotnik писал(а):
Расстояние между центрами и ширина пина?

От контактной площадки BGA надо сделать короткий отвод в центр квадрата, образованного четырьмя площадками, и там сделать переходное отверстие в другой слой. При шаге в 1 мм получается отверстие 0,4, а лучше бы еще меньше.

Sotnik писал(а):
У тебя город какой?

Москва


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

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


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

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


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

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