реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Создание компонета для SOPC Builder с несколькими регистрами ввода/вывода
altlogic
сообщение Jul 25 2012, 06:23
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Простая по идее задача - хочу созадать свой компонент I2C для SOPC с возможностью конфигурирования его через внутренние регистры компонента (да хотя бы флаг RUN реализоватьsm.gif ). Как это сделать? Нашел на сайте Altera пример Memory Mapped Slave. В этом шаблоне у устройства задается использование 16 внутренних регистров. Но там мощный шаблон, на 700 сток кода. Я аж испугалсяsm.gif
А мне кажется можно это все сделать проще. Ведь всего лишь нужно вытянуть из SOPC информацию о том, по какому адресу он разместил внутренние регистры устройства, ну и сделать их программно доступными конечо с шины Avalon. Примеров других пока не разбирал. Но мне кажется моя задача должна встречаться у всех разработчиков периферии под процессор для FPGA. Товарищ показал код для Xilinx MicroBlaze в аналогичной ситуации. Там, как и в примере Altera в описании компонента применяется специальная нотация.

Смотрел IP-core I2C от Terasic. Там, как я понял используется несколько отдельных регистров ввода-вывода, то есть устройство состоит из нескольких устройств на шине Авалон. Видимо это вообще самое простое решение. Но ведь как-то некрасиво?..


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
Konst_777
сообщение Jul 25 2012, 17:41
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644



Цитата(altlogic @ Jul 25 2012, 09:23) *
...Смотрел IP-core I2C от Terasic...

Возможно, для Вас будет интересным IP-core I2C с alterawiki.com.Там как раз обновили этот компонент для Quartus 12.
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jul 26 2012, 02:05
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Спасибо, буду иметь ввиду. Надо поковырять этот модуль, чтобы посмотреть прицнип управления.


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
barabek
сообщение Jul 29 2012, 22:32
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(altlogic @ Jul 26 2012, 12:05) *
Спасибо, буду иметь ввиду. Надо поковырять этот модуль, чтобы посмотреть прицнип управления.

Могу свой дать посмотреть. Конечно документации нет, но в подключаемом файле I2C_component_regs.h назначение регистров описано.

И прошу прощения за мой английский sm.gif
Прикрепленные файлы
Прикрепленный файл  I2Cmaster.rar ( 7.75 килобайт ) Кол-во скачиваний: 51
 
Go to the top of the page
 
+Quote Post
Orochi
сообщение Jul 30 2012, 20:00
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 6-07-11
Из: Кострома
Пользователь №: 66 096



Я учился работать с регистрами анализируя код этого компонента (файл прилагается). Всё с коментариями, даже с таблицами (карты регистров). Посмотрите, там всё понятно изложено.
Прикрепленные файлы
Прикрепленный файл  SD_Card_Controller_SPI.7z ( 42.6 килобайт ) Кол-во скачиваний: 59
 
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 13 2012, 13:41
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Orochi @ Jul 30 2012, 23:00) *
Я учился работать с регистрами анализируя код этого компонента (файл прилагается). Всё с коментариями, даже с таблицами (карты регистров). Посмотрите, там всё понятно изложено.


Пытаюсь на базе данного компонента разобраться как из регистров пользовательской логики переносить данные на шину Авалон.
Для начала из верхнеуровневого модуля sd_controller.v в SOPC создаю компонент. В компоненте кроме сигналов Авалон шины имеются сигналы интерфейса SPI ( spi_data_out,
spi_data_in,
spi_cs_n,
spi_clk
).
Прикрепленное изображение

Не пойму почему при создании компонента эти сигналы попадают опять на шину Авалон (avalon_slave_1)? Как при создании компонента на базе данного модуля оставить SPI сигналы просто пользовательской логикой?
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Aug 13 2012, 16:40
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Сигналы, идущие наружу должны иметь тип интерфейса Conduit, а не Avalon Memory Mapped Slave, как у Вас.
Go to the top of the page
 
+Quote Post
Orochi
сообщение Aug 13 2012, 17:15
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 6-07-11
Из: Кострома
Пользователь №: 66 096



Вот как подключен этот этот компонент у меня. avalon_slave_export type: conduit (как раз внешняя логика).

P.S.: Если не ответил на вопрос предыдущего поста переформулируйте и поподробней)

Сообщение отредактировал Orochi - Aug 13 2012, 17:49
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 14 2012, 07:05
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Orochi @ Aug 13 2012, 20:15) *
Вот как подключен этот этот компонент у меня. avalon_slave_export type: conduit (как раз внешняя логика).

P.S.: Если не ответил на вопрос предыдущего поста переформулируйте и поподробней)

Спасибо. Все получилось. У меня Q9. Поэтому только Conduit.
Прикрепленное изображение

Теперь на базе Вашего примера представляется возможным написать (vhdl) логику переноса данных из двухпортовой памяти на шину Avalon.
Пока не до конца понимаю процессы чтения и записи из(в) процессора в(из) ram. Попробую выполнить диаграмму
Прикрепленное изображение

Непонятна вкладка Deprecated

Сообщение отредактировал Acvarif - Aug 14 2012, 07:08
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Aug 14 2012, 08:53
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Deprecated-параметрами не следует пользоваться.
Это параметры, которые уже не имеют значения (для совместимости с предыдущими версиями)
или будут отменены в будущих версиях Квартуса.
Например адресация DYNAMIC/NATIVE, по умолчанию =DYNAMIC.
Ваша программа должна использовать макросы доступа к регистрам для соответствующего типа адресации.
Альтера настоятельно рекомендует пользоваться динамической адресацией.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 17 2012, 06:44
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Создал компонент Avalon MM Slave с пользовательской логикой.
В качестве пользовательской логики двухпортовая RAM куда с помощью
внешней кнопки загружаются 4 слова данных с последующим тестом чтения (для просмотра на wavwform) в
соответствии с диаграммой работы двухпортовой памяти.
Вот верхний уровень
CODE
--------------------------------------------------------------------
-- Project : ramtest
--------------------------------------------------------------------

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;

entity ramtest is
port (
-- Avalon Slave
clk : in std_logic := '0'; -- clock.clk
reset_n : in std_logic := '0'; -- .reset_n
avs_s0_address : in std_logic_vector(1 downto 0) := (others => '0'); -- s0.address
avs_s0_read_n : in std_logic := '0'; -- .read_n
avs_s0_readdata : out std_logic_vector(15 downto 0); -- .readdata
avs_s0_write_n : in std_logic := '0'; -- .write_n
avs_s0_writedata : in std_logic_vector(15 downto 0) := (others => '0'); -- .writedata
avs_s0_chipselect : in std_logic := '1'; -- .chipselect
-- ins_irq0_irq : out std_logic;

-- RAM Exports
-- Вспомогательные сигналы (тест загрузки и чтения RAM)
ldrd : in std_logic := '1'; -- внешний старт записи-чтения RAM (от кнопки)
ram_load : out std_logic; -- старт загрузки RAM (для теста)
ram_wr : out std_logic; -- строб записи RAM
ram_rd : out std_logic; -- строб чтения RAM
ram_ld : out std_logic; --
ram_wt : out std_logic; --
cnt_out : out std_logic; --
ram_read : out std_logic; -- старт чтение RAM (для теста)
ram_data_in : out std_logic_vector(15 downto 0); -- входные данные RAM (для теста)
ram_data_out : out std_logic_vector(15 downto 0) -- выходные данные RAM (для теста)
);

end entity ramtest;

architecture rtl of ramtest is

--------------------------------------------------------------------
-- компонент двухпортовая RAM

component ramresult
generic
(
DATA_WIDTH : integer := 16;
ADDR_WIDTH : integer := 2
);

port
(
rclk : in std_logic;
wclk : in std_logic;
raddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
waddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
data : in std_logic_vector((DATA_WIDTH-1) downto 0);
we : in std_logic := '1';
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);
end component;

-- сигналы загрузки и теста чтения RAM
signal cnt : std_logic_vector(3 downto 0) := X"0"; -- делитель
signal s_data_in : std_logic_vector(15 downto 0) := X"0000"; -- данные RAM (вход)
signal s_data_out : std_logic_vector(15 downto 0); -- данные RAM (выход)
signal s_rd : std_logic; -- клок чтения из RAM
signal s_wr : std_logic; -- клок записи в RAM
signal s_we : std_logic := '1'; -- выбор кристалла
signal s_addr_rd_ram : std_logic_vector(1 downto 0); -- адрес чтения
signal s_addr_wr_ram : std_logic_vector(1 downto 0); -- адрес записи
signal en_loadcnt : std_logic := '0'; -- разрешение загрузки в RAM
signal en_readcnt : std_logic := '0'; -- разрешение чтения из RAM
signal s_lrcnt : std_logic_vector(5 downto 0) := "000000"; -- счетчик
signal s_ramload : std_logic := '1'; --
signal s_ramread : std_logic := '1'; --
signal en_wrrd : std_logic := '0'; --

-- сигналы для шины Avalon
signal avs_s0_readdata_reg : std_logic_vector(15 downto 0);

begin

uramresult : ramresult
generic map (16, 2)
port map (rclk => s_rd, wclk => s_wr, raddr => s_addr_rd_ram,
waddr => s_addr_wr_ram, data => s_data_in, we => s_we, q => s_data_out);

--------------------------------------------------------------------
-- Вспомогательные сигналы
--------------------------------------------------------------------
--
process(clk)
begin
if (rising_edge(clk)) then
cnt <= cnt + 1;
end if;
end process;

cnt_out <= cnt(0);

process(cnt(0))
begin
if (rising_edge(cnt(0))) then
if(ldrd = '0') then
en_wrrd <= '1';
end if;
if(en_wrrd = '1') then
s_lrcnt <= s_lrcnt + 1;
end if;
if (s_lrcnt = "000011") then
s_ramload <= '0';
elsif (s_lrcnt = "000101") then
s_ramload <= '1';
elsif (s_lrcnt = "001011") then
s_ramread <= '0';
elsif (s_lrcnt = "001101") then
s_ramread <= '1';
elsif (s_lrcnt = "101101") then
en_wrrd <= '0';
end if;
end if;
end process;

ram_ld <= s_ramload;
ram_wt <= s_ramread;

--------------------------------------------------------------------
-- Заполнение RAM
--------------------------------------------------------------------

-- старт стоп перебора адресов RAM
process(cnt(0))
begin
if (falling_edge(cnt(0))) then
if(s_ramload = '0') then
en_loadcnt <= '1';
end if;
if(en_loadcnt = '1') then
s_addr_wr_ram <= s_addr_wr_ram + 1;
else
s_addr_wr_ram <= (others => '0');
end if;
if(s_addr_wr_ram = "11") then
en_loadcnt <= '0';
end if;
end if;
end process;

ram_load <= en_loadcnt;
s_wr <= not((cnt(0) and en_loadcnt) and (not clk));
ram_wr <= s_wr;

-- загрузка RAM
process(cnt(0))
begin
if (rising_edge(cnt(0))) then
if(en_loadcnt = '1') then
if(s_addr_wr_ram = "00") then
s_data_in <= X"0102";
elsif(s_addr_wr_ram = "01") then
s_data_in <= X"0304";
elsif(s_addr_wr_ram = "10") then
s_data_in <= X"0506";
elsif(s_addr_wr_ram = "11") then
s_data_in <= X"0708";
end if;
end if;
end if;
end process;

ram_data_in <= s_data_in;

--------------------------------------------------------------------
-- Чтение RAM (для тестирования)
--------------------------------------------------------------------

-- старт стоп перебора адресов RAM
process(cnt(0))
begin
if (falling_edge(cnt(0))) then
if(s_ramread = '0') then
en_readcnt <= '1';
s_we <= '0';
end if;
if(en_readcnt = '1') then
s_addr_rd_ram <= s_addr_rd_ram + 1;
end if;
if(s_addr_rd_ram = "11") then
en_readcnt <= '0';
s_we <= '1';
end if;
end if;
end process;

ram_read <= en_readcnt;
s_rd <= cnt(0) and en_readcnt;
ram_rd <= s_rd;
ram_data_out <= s_data_out;

--------------------------------------------------------------------
-- Avalon slave register read logic
--------------------------------------------------------------------
process(clk)
begin
if (falling_edge(clk)) then
if(reset_n = '0') then
avs_s0_readdata_reg <= (others => '0');
else if(avs_s0_read_n = '0' and ) then
avs_s0_readdata_reg <= s_data_out;
end if;
end if;
end if;
end process;

avs_s0_readdata <= avs_s0_readdata_reg;

end architecture rtl; -- of ramtest

Вот двухпортовая RAM
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ramresult is

generic
(
DATA_WIDTH : natural := 16;
ADDR_WIDTH : natural := 2
);

port
(
rclk : in std_logic;
wclk : in std_logic;
raddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
waddr : in std_logic_vector (0 to ADDR_WIDTH - 1);
data : in std_logic_vector((DATA_WIDTH-1) downto 0);
we : in std_logic;
q : out std_logic_vector((DATA_WIDTH -1) downto 0)
);

end ramresult;

architecture behavioural of ramresult is

-- Build a 2-D array type for the RAM
subtype word_t is std_logic_vector((DATA_WIDTH-1) downto 0);
type memory_t is array(2**ADDR_WIDTH-1 downto 0) of word_t;

-- Declare the RAM signal.
signal ram : memory_t;

begin

process(wclk)
begin
if(falling_edge(wclk)) then
ram(conv_integer(waddr)) <= data;
end if;
end process;

process(rclk)
begin
if(rising_edge(rclk)) then
if(we = '0') then
q <= ram(conv_integer(raddr));
else
q <= (others => 'Z');
end if;
end if;
end process;

end behavioural;

Вот Waveform
Прикрепленное изображение

Далее ступор.
Не понимаю как теперь построить логику переноса данных из этой же RAM на шину Avalon
имея набор только этих сигналов
Прикрепленное изображение

Очевидно нужен промежуточный регистр между выходом RAM и Avalon.
Кому приходилось с этим сталкиваться подскажите please как примерно это должно выглядеть в коде (Avalon slave register read logic).
Если не в коде, то словах тоже думаю пойму.

Сообщение отредактировал Acvarif - Aug 17 2012, 06:49
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Aug 17 2012, 08:00
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Я не силён в VHDL, пишу на Verilog, но
1) Выходной шине данных для шины Авалон не нужно 3 (Z) состояние.
Авалон - шина мультиплексор.
Промежуточный регистр ставить не нужно.
2) Порт памяти подключеный к Nios должен тактироваться частотой Nios, в противном случае пользовать Clock Crossing Bridge.
В чём затруднение пользования сигналов Авалон?
Советую найти документ mnl_avalon_spec.pdf.
Это подробная спецификация шины Авалон, с диаграммами.
Можно/нужно взять полный набор документации здесь: http://www.altera.com/literature/lit-nio2.jsp для своей версии.
Там же будет и спецификация.

Вот мой пример чтения регистров компонента, сигнал чтения не использую:
CODE
//-------------------------------------------------------------------
// Read all internal registers management
// Avalon MM slave read signal used only for FIFO access
//
//
always @ (posedge clk)
begin
case( avs_s0_address[7:0] )
DATA_REGISTER: avs_s0_readdata[31:0] <= { 24'b0, fifo_rx_data }; // DATA FIFO RAM
CONTROL_REGISTER: avs_s0_readdata[31:0] <= { 16'b0, control[15:0] }; // All bits of control register
STATUS_REGISTER: avs_s0_readdata[31:0] <= { 16'b0, status }; // All bits of status register
INDEX_REGISTER: avs_s0_readdata[31:0] <= { 24'b0, 2'b0, respond[45:40] }; // Respond index
RESPOND_REGISTER: avs_s0_readdata[31:0] <= respond[39:8]; // card status (R1), OCR(R3), RCA(R6)
(RESPOND_REGISTER+1): avs_s0_readdata[31:0] <= respond[71:40]; // CID CSD access
(RESPOND_REGISTER+2): avs_s0_readdata[31:0] <= respond[103:72]; // CID CSD access
(RESPOND_REGISTER+3): avs_s0_readdata[31:0] <= respond[135:104]; // CID CSD access
default: avs_s0_readdata[31:0] <= { 24'b0, status[7:0] }; // default bus state
endcase
end
//-------------------------------------------------------------------------


Описание доступа:
CODE

/************************************************************************
* DYNAMIC address mode
* BYTE address of register must be used
************************************************************************/

//-------------------------------------------------------------------------------------------------
// Data buffer read / write have separate FIFO buffers 512 bytes depth
#define IOADDR_ALTERA_AVALON_SD_HOST_DATA(base) __IO_CALC_ADDRESS_DYNAMIC(base, 0)
#define IORD_ALTERA_AVALON_SD_HOST_DATA(base) IORD_32DIRECT(base, 0)
#define IOWR_ALTERA_AVALON_SD_HOST_DATA(base, data) IOWR_32DIRECT(base, 0, data)


//-------------------------------------------------------------------------------------------------
// Control register may be read/write
#define IOADDR_ALTERA_AVALON_SD_HOST_CONTROL(base) __IO_CALC_ADDRESS_DYNAMIC(base, 4)
#define IORD_ALTERA_AVALON_SD_HOST_CONTROL(base) IORD_32DIRECT(base, 4)
#define IOWR_ALTERA_AVALON_SD_HOST_CONTROL(base, data) IOWR_32DIRECT(base, 4, data)



Сообщение отредактировал Копейкин - Aug 17 2012, 08:14
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 17 2012, 08:29
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Спасибо. Попробую разобраться.
Если примитивно то получается что-то вроде этого
CODE
process(clk)
begin
if (falling_edge(clk)) then
if(reset_n = '0') then
avs_s0_readdata_reg <= (others => '0');
else if(avs_s0_read_n = '0' and avs_s0_chipselect = '0') then
case (avs_s0_address) is
when "00" => avs_s0_readdata_reg(0) <= s_data_out(0);
when "01" => avs_s0_readdata_reg(1) <= s_data_out(1);
when "10" => avs_s0_readdata_reg(2) <= s_data_out(2);
when "11" => avs_s0_readdata_reg(3) <= s_data_out(3);
end case;
end if;
end if;
end if;
end process;

avs_s0_readdata <= avs_s0_readdata_reg;

Тоесть при появлении со стороны Nios сигналов avs_s0_address, avs_s0_read_n, avs_s0_chipselect
по спаду clk данные с выхода RAM должны появиться на шине Avalon.
Но что теперь делать с сигналами управления RAM?
Тупо подать avs_s0_address - на адрес RAM, avs_s0_chipselect - на выбор кристалла RAM?
Да...в общих чертах понятно.
Используя сигналы Avalon нужно сформировать импульсы которые будут управлять чтением RAM так,
чтобы данные из нее появлялись на шине в нужные моменты (в соответствии с диаграммой чтения созданного компонента).
Думаю, что справлюсь.

По ходу еще вопрос.
Как в общих чертах организовать чтение данных RAM (каждого отдельного байта) по прерываниям идущим от пользовательской логики?

Сообщение отредактировал Acvarif - Aug 17 2012, 11:29
Go to the top of the page
 
+Quote Post
Копейкин
сообщение Aug 20 2012, 09:18
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 190
Регистрация: 7-11-07
Из: С-Петербург
Пользователь №: 32 134



Для чтения/записи отдельного байта следует использовать сигналы (для 32-разрядной шины) byteenable[3:0].
В реализации RAM также следует предусмотреть доступ к единичному байту.
Если это невозможно, то читать 32бита из которых брать требуемый байт - это несложно.
Вот для записи будет последовательность чтение слова - модификация байта - запись слова.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Aug 20 2012, 10:48
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Копейкин @ Aug 20 2012, 12:18) *
Для чтения/записи отдельного байта следует использовать сигналы (для 32-разрядной шины) byteenable[3:0].
В реализации RAM также следует предусмотреть доступ к единичному байту.
Если это невозможно, то читать 32бита из которых брать требуемый байт - это несложно.
Вот для записи будет последовательность чтение слова - модификация байта - запись слова.


Для визуализации работы команды IORD(base, 1) (чтение по базовому адресу + 1 компонента ramtest )
вывел команду avs_s0_read_n через буфер наружу надеясь увидеть импульс чтения. Но ничего нет.
Непонятно какой из сигналов Avalon
Код
    port (
--        Avalon Slave
        clk                  : in  std_logic                     := '0';             -- clock.clk
        reset_n              : in  std_logic                     := '0';             --      .reset_n
        avs_s0_address       : in  std_logic_vector(1 downto 0)  := (others => '0'); --    s0.address
        avs_s0_read_n        : in  std_logic                     := '0';             --      .read_n
        avs_s0_readdata      : out std_logic_vector(15 downto 0);                    --      .readdata
        avs_s0_write_n       : in  std_logic                     := '0';             --      .write_n
        avs_s0_writedata     : in  std_logic_vector(15 downto 0) := (others => '0'); --      .writedata

можно вживую наблюдать при выполнении операции чтения IORD(base, 1) из Nios если в моем компоненте с Avalon MM Slave нет byteenable?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 04:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01548 секунд с 7
ELECTRONIX ©2004-2016