Цитата(imperman @ Oct 17 2011, 17:53)

Spartan 3 - получилось довесить I2C SROM, но нужна параллельная... не знаю реально ли сделать обертку в ПЛИС для параллельности. Потом данные идут в PCI-E.
Что-то как-то непонятно... PCI-E оно очень быстрое, а I2C SROM - очень медленное, да еще и с ограниченным количеством перезаписей. Соответственно, пока PCI-E успеет прокачать несколько пакетов, байт эдак по 128, I2C SROM вряд ли даже успеет один такой блок в себя записать... - так что его применимость для меня - загадка... однако, и проект не мой.
Может проще сделать PCI-E Master, который будет худо-бедно (зато примитивно и ресурсоэкономично) наталкивать данные в ОЗУ машины ?
Цитата(imperman @ Oct 17 2011, 17:53)

Или же нужно как-то просто выжать по максимуму 3s400.
Нужно Xx32 (PCI-E 32 bit)
Yx32 что-то хреново получается в Spartan-3.
А вот 2048x64 можно реализовать на 7 RAM и 466 LUT (210 - на логику и 256 - на саму память) - итого: 6.5% LUT (7.1% SliceM) + 43.7% RAMB (осталось 9 RAMB)..
2048x128 можно реализовать на 14 RAM и 792 LUT (280 - на логику и 512 - на саму память) - итого: 11.0% LUT (14.2% SliceM) + 87.5% RAMB (осталось 2 RAMB).
В обоих случаях прийдётся немного потратить логики на схему, которая будет производить запись в ОЗУ (собирать 2/4 группы по 32 в единую порцию 64/128 бит) и аналогично добавить дополнительный выходной мультиплексор.
Оставшиеся RAMB и SliceM можно использовать в каких-либо более мелких местах - сдаётся мне они тоже должны быть.
Для тех, кто хочет сам что-то ручками повертеть, прикинуть так и эдак:
Код
library IEEE;
use IEEE.Std_Logic_1164.all;
use IEEE.Std_Logic_unsigned.all;
entity qwe is generic (
constant cnRAM_W: positive := 11
); port (
WR_A: in std_logic_vector(cnRAM_W-1 downto 0);
-- WR_D: in std_logic_vector(31 downto 0);
-- WR_D: in std_logic_vector(63 downto 0);
WR_D: in std_logic_vector(127 downto 0);
WR_C: in std_logic;
RD_A: in std_logic_vector(cnRAM_W-1 downto 0);
-- RD_D: out std_logic_vector(31 downto 0);
-- RD_D: out std_logic_vector(63 downto 0);
RD_D: out std_logic_vector(127 downto 0);
RD_C: in std_logic
);
end entity;
architecture Tushka of qwe is
constant cnRAM_D: positive := 2**cnRAM_W;
-- alias RAMB_WR_D: std_logic_vector(26 downto 0) is WR_D(26 downto 0);
-- alias RAMD_WR_D: std_logic_vector(31 downto 27) is WR_D(31 downto 27);
-- alias RAMB_WR_D: std_logic_vector(62 downto 0) is WR_D(62 downto 0);
-- alias RAMD_WR_D: std_logic_vector(63 downto 63) is WR_D(63 downto 63);
alias RAMB_WR_D: std_logic_vector(125 downto 0) is WR_D(125 downto 0);
alias RAMD_WR_D: std_logic_vector(127 downto 126) is WR_D(127 downto 126);
alias RAMB_RD_D: std_logic_vector(RAMB_WR_D'Range) is RD_D(RAMB_WR_D'Range);
alias RAMD_RD_D: std_logic_vector(RAMD_WR_D'Range) is RD_D(RAMD_WR_D'Range);
type taRAMB is array (0 to cnRAM_D-1) of std_logic_vector(RAMB_WR_D'Range);
type taRAMD is array (0 to cnRAM_D-1) of std_logic_vector(RAMD_WR_D'Range);
signal aRAMB: taRAMB;
signal aRAMD: taRAMD;
attribute RAM_Style: string;
attribute RAM_Style of aRAMD: signal is "distributed";
begin
process(WR_C) begin
if rising_edge(WR_C) then
aRAMB(conv_integer(WR_A)) <= RAMB_WR_D;
aRAMD(conv_integer(WR_A)) <= RAMD_WR_D;
end if;
end process;
process(RD_C) begin
if rising_edge(RD_C) then
RAMB_RD_D <= aRAMB(conv_integer(RD_A));
RAMD_RD_D <= aRAMD(conv_integer(RD_A));
end if;
end process;
end architecture;
P.S. компилировал на ISE 10.1 SP3.