Forth http://fforum.winglion.ru/ |
|
Трехъядерный форт-процессор в ПЛИС http://fforum.winglion.ru/viewtopic.php?f=56&t=2296 |
Страница 1 из 6 |
Автор: | WingLion [ Сб окт 17, 2009 05:27 ] |
Заголовок сообщения: | Трехъядерный форт-процессор в ПЛИС |
Такая вот штука появилась и заработала (в симуляторе) 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 [ Сб окт 17, 2009 12:38 ] |
Заголовок сообщения: | |
На данный момент результаты симуляции следующие. 16 разрядная версия занимает ~1000LE и работает на частоте 120MHz (на циклоне-2) (по 40MHz на ядро) 32 разрядная версия занимает ~2400LE и работает на частоте 120MHz (на циклоне-3) (по 40MHz на ядро) Сейчас собираю тестовую систему с трехголовым процессором и памятью (16Кx32 - почти вся, что есть в EP3C25) некоторые проблемы возникают из-за настойчивых попыток фиттера упаковать регистры, похожие на регистры сдвига в блоки памяти. Из-за этого возникает ошибка из-за превышения требуемых ресурсов над имающимися. Пытаюсь найти установки, которые запрещают фиттеру так безобразничать. п.с. так как название "Горыныч" уже как бы занято, подумываю назвать сей процессор "Цербером" |
Автор: | Sotnik [ Сб окт 17, 2009 14:43 ] |
Заголовок сообщения: | |
WingLion писал(а): На данный момент результаты симуляции следующие. 1000LE - а там их 25000. Девяток ядер запросто? Ты хочешь именно Альтеру использовать?
16 разрядная версия занимает ~1000LE и работает на частоте 120MHz (на циклоне-2) (по 40MHz на ядро) 32 разрядная версия занимает ~2400LE и работает на частоте 120MHz (на циклоне-3) (по 40MHz на ядро) Сейчас собираю тестовую систему с трехголовым процессором и памятью (16Кx32 - почти вся, что есть в EP3C25) Потом ЭТО в Ксайлинкс перенесётся с учётом что там 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 дешевле, а запаять на плату на автомате есть возможность? |
Автор: | WingLion [ Сб окт 17, 2009 17:58 ] |
Заголовок сообщения: | |
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 [ Сб окт 17, 2009 18:05 ] |
Заголовок сообщения: | |
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) |
Автор: | Hishnik [ Сб окт 17, 2009 18:06 ] |
Заголовок сообщения: | |
Sotnik писал(а): Под BGA 256 подойдут такие нормы при двухсторонней плате?
Вроде BGA дешевле, а запаять на плату на автомате есть возможность? Отверстие надо 0,4. И для BGA желательно хотя бы 4 слоя. |
Автор: | Hishnik [ Сб окт 17, 2009 18:14 ] |
Заголовок сообщения: | |
WingLion писал(а): USB (FT245BL)
FT232R поудобнее будет в плане стыковки с ПЛИС и обвязки. У нее конденсатор на 0,1 снаружи надо, и все. 10. EEPROM (есть FRAM, совместимые по выводам) |
Автор: | WingLion [ Сб окт 17, 2009 18:17 ] |
Заголовок сообщения: | |
Хищник писал(а): FT232R поудобнее будет в плане стыковки с ПЛИС и обвязки. У нее конденсатор на 0,1 снаружи надо, и все.
245-й хочу, потому что на ней сразу байт-бластер альтеровский получится (если прошивку найти). хм... а FT232R - это не просто RS232 случайно? |
Автор: | Hishnik [ Сб окт 17, 2009 18:20 ] |
Заголовок сообщения: | |
WingLion писал(а): 245-й хочу, потому что на ней сразу байт-бластер альтеровский получится (если прошивку найти).
хм... а FT232R - это не просто RS232 случайно? USB <-> RS232. И у нее есть 4 программируемых вывода, на байт-бластер хватит. |
Автор: | WingLion [ Сб окт 17, 2009 18:30 ] |
Заголовок сообщения: | |
Альтеровский байт-бластер на 245-м сделан. А с самопальным на 232-м квартус работать наверняка не станет. |
Автор: | Sotnik [ Сб окт 17, 2009 19:20 ] |
Заголовок сообщения: | |
Цитата: WingLion писал(а): 2Sotnik на счет платы надо еще хорошо подумать, что на нее поставить Думай.Цитата: На плату я предполагаю ставить следующее: Рисуй схему. Цитата: Выход из Оркада - Gerber RS234X если не вру. Или прямо файл разводки (*.MAX) Скинь чего-нить только посмотреть и прикинуть на SotnikSTO@yandex.ru В теме напиши какое нить умное слово по теме, типа FPGA. У тебя город какой? |
Автор: | Sotnik [ Сб окт 17, 2009 19:23 ] |
Заголовок сообщения: | |
Хищник писал(а): Sotnik писал(а): Под BGA 256 подойдут такие нормы при двухсторонней плате? Вроде BGA дешевле, а запаять на плату на автомате есть возможность? Отверстие надо 0,4. И для BGA желательно хотя бы 4 слоя. У тебя город какой? |
Автор: | WingLion [ Сб окт 17, 2009 19:31 ] |
Заголовок сообщения: | |
Sotnik писал(а): У тебя город какой? WingLion писал(а): Откуда: St.Petersburg Sotnik писал(а): BGA256 получается четырёхрядный.
от типа корпуса количество ядер фактически не зависит, от него зависит только, сколько сигналов вывести можно. А ядер можно много упаковать. Вот, прямо сейчас 5-ядерный вариант компилирую |
Автор: | WingLion [ Сб окт 17, 2009 19:42 ] |
Заголовок сообщения: | |
А теперь маленькая бочка дегтя в ложке с медом. Sotnik писал(а): 16 бит - один форт атом при 32 МГц 32*9=288 МИПС
Сие есть unreal, если делать общую память, потому что каждое ядро должно иметь доступ к памяти, 32 млн. раз в секунду, т.е. память должна обеспечить 288 миллионов операций чтения/записи за секунду, что возможно только на дорогих чипах. Циклон по даташиту не даст более 250MHz, реально же оказывается итого ниже. Сейчас - 170-180MHz, т.е. 180 MIPS - это предел по скорости памяти, который перепрыгнуть не так просто. |
Автор: | Hishnik [ Сб окт 17, 2009 20:10 ] |
Заголовок сообщения: | |
Sotnik писал(а): Расстояние между центрами и ширина пина? От контактной площадки BGA надо сделать короткий отвод в центр квадрата, образованного четырьмя площадками, и там сделать переходное отверстие в другой слой. При шаге в 1 мм получается отверстие 0,4, а лучше бы еще меньше. Sotnik писал(а): У тебя город какой?
Москва |
Страница 1 из 6 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |