Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Unsorted (http://zx-pk.ru/forumdisplay.php?f=13)
-   -   ПЛИС и всё что с ними связано (http://zx-pk.ru/showthread.php?t=9342)

palsw 8th April 2013 00:00

WingLion, Если выпалю первый Cyclone то паялкой его вывалю и новый впаяю без проблем паялником.

А на той борде уже BGA монтаж и уже не каждый в случае чего отремонтирует,еще пайка на без свинцовом олове не внушает доверия и цена выше 2 раза :)

---------- Post added at 22:00 ---------- Previous post was at 21:49 ----------

вот намного функциональный боард

http://www.aliexpress.com/item/100-N...705109654.html
http://www.aliexpress.com/item/free-...572868376.html

ZEK 8th April 2013 01:12

Quote:

Originally Posted by WingLion (Post 590250)
вот такая штучка намного вкуснее

+ доставка $70

WingLion 8th April 2013 20:05

А это ответ от питерского дистрибьютера Альтеры на запрос о возможности приобретения DE-0:
Quote:

Иван, добрый день!

Можем предложить Вам следующие условия поставки:

Артикул DE0-Nano
Производитель Terasic
Кол-во 1
Цена за шт. в USD (с НДС) 106,95
Срок поставки 4-5 н.

Условия поставки: самовывоз из одного из наших офисов,

С.-Петербург, Москва, Казань, Екатеринбург, Ростов-на-Дону, Пермь, Нижний

Новгород (адреса см. наш сайт www.efo.ru),

или мы можем организовать курьерскую экспресс-доставку в пределах РФ.

Можем оформить счет:

1) на частное лицо, оплата в любом отд. Сбербанка (эл. копию бланка для оплаты вышлем),

2) на организацию, в этом случае нам нужны реквизиты Вашей организации:



palsw 8th April 2013 20:08

WingLion, Для начала имхо достаточно и этого девайса http://www.aliexpress.com/item/100-N...705109654.html за 35$ с доставкой.
А 107$ и 35$ как говорят "Две большие разници"

palsw 8th April 2013 20:42

vlad, Поподробнее :)
где посмотреть нужно?

palsw 8th April 2013 21:06

vlad, цель - по изучать Плис,глянуть на языки программирования и поморгать светодиодами - всё как обычно.

Нужно что то простое -если не попрёт то будет просто валяться и нет смысла брать от 100$ и выше.

Вот думаю заказать платку у MICK http://zx.pk.ru/showthread.php?t=204...t=%CF%EB%E8%F1 но пугает CPLD - там идея жестко прошить 1 раз плис и баловаться с внешними картами на ZX-BUS.Зато Z80 есть и можно ножками подрыгать

fifan 8th April 2013 21:24

Quote:

Originally Posted by vlad (Post 590592)
Если из самого простого, то можно попробовать это:
Плата Марсоход
µGalaksija

Из ссылки первого сайта я повторил Улучшенный частотомер на EPM7128SLC84, из второго сайта - готовлю реплику Галаксии на u10.

shurik-ua 28th April 2013 15:23

Недавно только начал осваивать плисы и vhdl и как первый проект сделал видеоадаптер с выводом на телевизор.

есть такой код:
Code:

                                if vcount = 312 then
                                        vcount <= "000000000";
                                else
                                        vcount <= vcount + 1;
                                end if;

Возник такой вопрос - как на vhdl написать чтобы по чётным кадрам счётчик считал до 312, а по нечётным до 313.

Думал сделать вот так:

Code:

                                if vcount = 312 + vdiv then
                                        vcount <= "000000000";
                                        vdiv <= not(vdiv);
                                else
                                        vcount <= vcount + 1;
                                end if;

выдает ошибку.

vlad 28th April 2013 16:51

if (vdiv = '0' and vcount = 312) or
(vdiv = '1' and vcount = 313) then
...

PS. vdiv='1' можно опустить...

shurik-ua 28th April 2013 18:21

2 Attachment(s)
Quote:

Originally Posted by zebest (Post 596814)
Ps? а зачем так сложно, ну и пусть и четный и нечетный будут одинаковы. Не?

хотелось придерживаться стандарта )

Quote:

Originally Posted by zebest (Post 596814)
Кидай проект, посмотрим...

да пожалуйста ):
Code:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity video1 is
port(
clock: in std_logic; -- 40 Mhz clock
ram_data: inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
ram_addr: out std_logic_vector(15 downto 0);
ram_wr: out std_logic;
cpu_data: in std_logic_vector(7 downto 0);
cpu_addr: in std_logic_vector(15 downto 0);
cpu_wr: in std_logic;
cpu_mreq: in std_logic;
clk_out: out std_logic;
int: out std_logic;
sync: out std_logic;
video: out std_logic
);
end video1;

architecture rtl of video1 is

signal cnt: std_logic_vector(1 downto 0):="00";
signal hcount: std_logic_vector(9 downto 0);
signal vcount: std_logic_vector(8 downto 0);
signal hsync: std_logic;
signal vsync: std_logic;
signal hblanc: std_logic; 
signal vblanc: std_logic;
signal blanc: std_logic;
signal vid: std_logic;
signal wr_video_ram: std_logic;
signal temp_data: std_logic_vector(7 downto 0);
signal temp_addr: std_logic_vector(13 downto 0);
signal temp_video: std_logic_vector(7 downto 0);
signal vdiv: std_logic;

begin
------------------------------------------------------------
process(clock) --40 MHz
begin
        if rising_edge(clock) then
                if wr_video_ram = '0' then
                        temp_data <= cpu_data;
                        temp_addr <= cpu_addr(13 downto 0);       
                end if;
                cnt <= cnt + 1;
                if cnt(0) = '1' then
                        temp_video <= ram_data;
                end if;                       
                if cnt = "00" then
                        if hcount = 640 then
                                hcount <= "0000000000";
                                if (vdiv='0' and vcount = 312) or vcount = 313 then
                                        vcount <= "000000000";
                                        vdiv <= not(vdiv);
                                else
                                        vcount <= vcount + 1;
                                end if;
                        else
                                hcount <= hcount + 1;
                                case hcount (2 downto 0) is
                                        when "000" => vid <= temp_video(7);
                                        when "001" => vid <= temp_video(6);
                                        when "010" => vid <= temp_video(5);
                                        when "011" => vid <= temp_video(4);                               
                                        when "100" => vid <= temp_video(3);
                                        when "101" => vid <= temp_video(2);
                                        when "110" => vid <= temp_video(1);
                                        when "111" => vid <= temp_video(0);
                                end case;                               
                        end if;
                end if;               
        end if;       
end process;
------------------------------------------------------------
hsync <= '0' when (hcount >= 532 and hcount < 572) else '1';
vsync <= '0' when (vcount >= 276 and vcount < 284) else '1';
hblanc <= '0' when hcount >= 512 else '1';
vblanc <= '0' when vcount >= 256 else '1';
blanc <= hblanc and vblanc;
sync <= hsync and vsync;
video <= vid and blanc;

--wr_video_ram <= cpu_mreq or cpu_wr or (cpu_addr(15) nand cpu_addr(14));--video ram starts at 0xC000
wr_video_ram <= cpu_mreq or cpu_wr or not(cpu_addr(14)) or cpu_addr(15);--video ram starts at 0x4000
ram_wr <= cnt(0);
ram_data <= temp_data when cnt(0) = '0' else "ZZZZZZZZ";
ram_addr(7 downto 0) <= vcount(7 downto 0) when cnt(0) = '1' else temp_addr(7 downto 0);
ram_addr(13 downto 8) <= hcount(8 downto 3) when cnt(0) = '1' else temp_addr(13 downto 8);
ram_addr(15 downto 14) <= "00";

int <= vsync;
clk_out <= cnt(0);
------------------------------------------------------------
end rtl;

реализован режим 512 х 256 монохром, но код позволяет реализовать байт на точку - причём абсолютно прозрачно для проца (и любого устройства на шине)

всё опробовано в железе и прекрасно работает )
скрины:
1. скриншот с тюнера.
2. исходная картинка.

P.S. критика и замечания всячески приветствуются )))

lisica 28th April 2013 23:07

Quote:

blanc <= hblanc and vblanc;
Здесь, по моему or надо.

shurik-ua 29th April 2013 01:31

2 Attachment(s)
логически их действительно нужно объединить по OR, но так как используется отрицательная логика то OR превратился в AND. )

приведённый код немного глючный - на скринах видно:


Нашёл в чём было дело :)
эту строку:
Code:

hblanc <= '0' when hcount >= 512 else '1';
нужно заменить на:
Code:

hblanc <= '1' when (hcount >= 1 and hcount < 513) else '0';
и всего делов, а то я с перепугу жменю статики перепроверил :v2_cool:

да и вот тут чуточку подправил:
Code:

hsync <= '0' when (hcount >= 533 and hcount < 573) else '1';

fifan 29th April 2013 19:07

Немного не в тему. Но может кто-нибудь сталкивался с кодером компонентного видео сигнала в VGA. Интересуюсь по поводу встраивания данного кодера в проект на ПЛИС ПК "Галаксия".

shurik-ua 30th April 2013 02:32

Quote:

Originally Posted by vlad (Post 597310)
shurik-ua, почему не сделать 512х384? Мне было легче переделать его на VGA 1024x768x8bpp@60Hz. Можно было-бы масштабировать х1 256х192, x2 512x384 x3 1024x768 :)

этот формат выбран из-за удобства программирования именно на 8-мибитных процессорах.

все эти форматы с соотношением сторон 4:3 потихоньку устаревают, мониторы и телевизоры сейчас выпускаются в основном широкоформатные 16:9 или 16:10.

на тюнере я выставил пропорции экрана 16:9 и картинка выглядит абсолютно симметричной - просто тюнер сохраняет только с такими пропорциями.

кстати пока писал этот ответ придумал, что если тактировать схему 32 MHz кварцем и изменить несколько констант в коде то получим режим 384х256 - что можно использовать как компромисс для любителей "квадратных" пропорций. ))

Да и вот ещё - в будущем планирую подключить Циклон какой нибудь и 3128 использовать как преобразователь уровней - в проекте Reverse есть что-то похожее, но исходников не нашёл. Так как я ещё начинающий - могу ошибиться , вот взгляните на код - покритикуйте:

Code:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity extender is
port (
        dir: in std_logic;
        cpu_adr: inout std_logic_vector(15 downto 0);
        adr: inout std_logic_vector(15 downto 0);
        cpu_data: inout std_logic_vector(7 downto 0);
        data: inout std_logic_vector(7 downto 0);                                               
        wr,rd,mreq,iorq,m1: inout std_logic;                                                       
        busrq,cpu_busak: in std_logic;                                                               
        int,nmi,clock,reset,wait0: in std_logic;                                               
        cpu_int,cpu_nmi,cpu_clock: out std_logic;
        cpu_busrq,busak: out std_logic;                                                               
        cpu_reset,cpu_wait0: out std_logic;
        cpu_wr,cpu_rd,cpu_mreq,cpu_iorq,cpu_m1: inout std_logic);
end extender;

architecture ext of extender is

begin
        cpu_clock <= clock;
        cpu_int <= int;
        cpu_nmi <= nmi;
        cpu_reset <= reset;
        cpu_wait0 <= wait0;
       
        cpu_busrq <= busrq;
        busak <= cpu_busak;
       
        mreq <= cpu_mreq when cpu_busak = '1' else 'Z';
        cpu_mreq <= mreq when cpu_busak = '0' else 'Z';
        iorq <= cpu_iorq when cpu_busak = '1' else 'Z';
        cpu_iorq <= iorq when cpu_busak = '0' else 'Z';
        wr <= cpu_wr when cpu_busak = '1' else 'Z';
        cpu_wr <= wr when cpu_busak = '0' else 'Z';
        rd <= cpu_rd when cpu_busak = '1' else 'Z';
        cpu_rd <= rd when cpu_busak = '0' else 'Z';
        m1 <= cpu_m1 when cpu_busak = '1' else 'Z';
        cpu_m1 <= m1 when cpu_busak = '0' else 'Z';

        data <= cpu_data when dir = '1' else "ZZZZZZZZ";
        cpu_data <= data when dir = '0' else "ZZZZZZZZ";
        adr <= cpu_adr when cpu_busak = '1' else "ZZZZZZZZZZZZZZZZ";
        cpu_adr <= adr when cpu_busak = '0' else "ZZZZZZZZZZZZZZZZ";

end ext;


DDp 30th June 2013 13:03

«Теннис» на FPGA - реализации для «Altera DE1 Starter Board», «Speccy2010», «ZX Evolution», «Pentagon-1024SL v2.2»

---
ZX-Evo_compatible-версия с мая 2013 идёт в конфигурации TS-Labs как "пасхальное яйцо".

krotan 12th January 2014 00:47

Победитель конкурса на звание "самый простой ByteBlaster" :)
Там же есть прекрасный учебник для начинающих по Verilog HDL и по Altera Quartus II
Большое спасибо Николаю и Юрию из Таганрога, авторам марсохода!

fifan 12th January 2014 09:18

Я понимаю, что лень столько постов этой темы читать. Но данная ссылка уже приводилась.

solegstar 5th March 2014 16:19

Приветствую! заметил недавно такой глюк на верхней плате Profi 5.06: когда вставлен usbblaster в jtag разъем епм570, то сдкарта работает стабильно, если только его вытащить, то всё, сдкарта не работает или работает, но со страшными глюками из разряда неправильные каталоги показывает или при копировании образа зависает комп. но больше не работает конечно. причем это как с включеным, так и с выключеным бластером. возможно глюк епмки, но т.к. платы еще не ушли в производство, думаю, может че с платой надо сделать. подтяжка всех 4х линий jtag у меня есть к +3.3В через 10к.

проследил, что происходит, когда включаю разъем - практически все линии показывают 0В. в бластере стоит ап5 на выходе. попробовал 1кОм повесить на 4 линии, ниче не поменялось, как на +5В, так и на GND.

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

SD-CARD подключена к выводам 129-132 ЕПМки, выводы для программирования вообще находятся на другой стороне плисины 33-36, каким образом они могут влиять на работу карты я не представляю, т.к. напряжение 3.3В не меняется и "не шумит".

у кого какие предположения? заранее спасибо. :)

vlad 5th March 2014 16:35

Quote:

Originally Posted by solegstar (Post 683990)
подтяжка всех 4х линий jtag у меня есть к +3.3В через 10к.

Не уверен, что это из-за JTAG. У меня TCK подтянут к GND через 1К.

solegstar 5th March 2014 18:30

vlad, глюк очень стабильный. разъем jtag бластера (вкл./выкл. всё равно) соединен с платой - работает карта, отсоединен - глючит. попробую перепаять заново епмку, скорее всего это флюс.

TSL 5th March 2014 19:48

zek через меня вангует, что проблема в асинхронщине в дизайне.

---------- Post added at 16:44 ---------- Previous post was at 16:42 ----------

Со своей стороны добавляю, что есть такие страшные звери, как метастабы.

---------- Post added at 16:48 ---------- Previous post was at 16:44 ----------

Ну и да, сырец чтоль покажи хоть, а то телепатор перегревается :v2_dizzy_tea:

solegstar 5th March 2014 23:01

Quote:

Originally Posted by TSL (Post 684102)
zek через меня вангует, что проблема в асинхронщине в дизайне. Ну и да, сырец чтоль покажи хоть, а то телепатор перегревается :v2_dizzy_tea:

клок для синхронизации с клоком проца в дизайн заведен. сорец и черновик текущей принципиалки верхушки тут - http://zx-pk.ru/showthread.php?p=558382#post558382

зыж просьба не пинать ногами и помидорами не забрасывать - это мой первый дизайн для плисины! :)

TSL 5th March 2014 23:20

port77_wr <= '1' when adress(7 downto 0)=X"77" and iorq='0' and m1='1' and wr='0' and cpm='1' else '0';

elsif (port77_wr'event and port77_wr='0') then

Так низя делать, асинхронщина во все дыры.
Клокать ТОЛЬКО по глобалклоку, с условиями по port77_wr и проч.

vlad 5th March 2014 23:47

TSL, может подскажешь как в данном случае правильно переписать асинхронную защелку? При условии, что rd_sig должен быть сброшен импульсом clr_flag и при ram_rd = 1.

Code:

ram_rd <= '1' when (mreq_n = '0' and rd_n = '0') else '0';

process (ram_rd, clr_flag)
begin
        if (clr_flag = '1') then
                rd_sig <= '0';
        elsif (ram_rd'event and ram_rd = '1') then
                rd_sig <= '1';
        end if;
end process;


TSL 6th March 2014 04:44

Ну я бы делал примерно так:
Code:

process (flck)
begin
    if (fclk'event and fclk = '1')
    begin
        if (clr_flag = '1') then
            rd_sig <= '0';
        elsif (ram_rd = '1') then
            rd_sig <= '1';
        end if;
    end
end process;

flck - некий клок системы, в домене которого находятся все сигналы модуля. Например 14 мгц.
При этом, дабы избежать метастабов, если сигналы clr_flag и ram_rd в другом клоковом домене, их бы нефигово пересинхрить на клок flck.

В общем проблему надо разделить на две:
1. (главная!) НИКОГДА не использовать выход комбинаторики как клок, а только как клок енабле, да и то желательно пересинхренный.
2. Пересинхривать любые сигналы другого клокового домена на текущий.

---------- Post added at 01:43 ---------- Previous post was at 01:41 ----------

Сорри, в вхдл могут быть ошибки, я в нем никогда не писал, езык для мну иностраннише.

---------- Post added at 01:44 ---------- Previous post was at 01:43 ----------

На уютном верилоге так:
Code:

always @(posedge fclk)
    if (clr_flag)
        rd_sig <= 1'b0;
    else if (ram_rd)
        rd_sig <= 1'b1;


vlad 6th March 2014 12:41

Quote:

Originally Posted by TSL (Post 684428)
Ну я бы делал примерно так:
Code:

process (flck)
begin
    if (fclk'event and fclk = '1')
    begin
        if (clr_flag = '1') then
            rd_sig <= '0';
        elsif (ram_rd = '1') then
            rd_sig <= '1';
        end if;
    end
end process;


Вот тут и проблема, что это не сработает, в асинхронном примере сигнал rd_sig устанавливается в 1 только по стробу ram_rd. А у тебя и после clr_flag = 0 при ram_rd = 1. Есть еще варианты?

IanPo 6th March 2014 13:15

always @(posedge fclk)
begin
ram_rd_old <= ram_rd;
if (clr_flag)
rd_sig <= 1'b0;
else if ( ram_rd & ~ram_rd_old )
rd_sig <= 1'b1;
end
за счет детектора фронта получаем запаздывание

solegstar 6th March 2014 14:05

Quote:

Originally Posted by TSL (Post 684231)
port77_wr <= '1' when adress(7 downto 0)=X"77" and iorq='0' and m1='1' and wr='0' and cpm='1' else '0';

elsif (port77_wr'event and port77_wr='0') then

Так низя делать, асинхронщина во все дыры.
Клокать ТОЛЬКО по глобалклоку, с условиями по port77_wr и проч.

кстати, не понятно как оно вообще работало, ведь port77_wr присваивается "1"ца для записи 1 бита шины данных на SDCS, а записывается по спаду port77_wr. пипец вобщем. Эта часть прошивы из модуля расширения для робика, её не трогал. попробую с условием port77_wr='1' и вроде если правильно тебя понял про синхронность, сделал пока так:
Code:

port77_wr <= '1' when adress(7 downto 0)=X"77" and iorq='0' and m1='1' and wr='0' and cpm='1' else '0';
process (port77_wr, res, f14)
        begin
                if res='0' then
                        nSDCS <= '1';
                elsif f14'event and f14='1' then
                        if port77_wr='1' then
                                nSDCS <= Data(1);
                        end if;
                end if;
end process;

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

vlad 6th March 2014 14:17

Quote:

Originally Posted by solegstar (Post 684590)
Code:

port77_wr <= '1' when adress(7 downto 0)=X"77" and iorq='0' and m1='1' and wr='0' and cpm='1' else '0';

Непонятно участие сигнала M1# в конкретном случае. Скорей всего M1# здесь ненужен.

TSL 6th March 2014 16:39

IanPo, да действительно, я не учел фронт.
В общем я так из фронтов стробы и выделяю.
А где задежка кроме периода fclk?

IanPo 6th March 2014 22:15

Задержка от 0 до fclk, другой нет.

TSL 6th March 2014 22:21

А вот такая задачка:

reg [7:0] cnt;
always @(posedge clk)
if (stb)
cnt <= cnt + 8'b1;

stb - сигнал внешнего интерфейса асинхронный по отношению к домену clk.
Что нужно сделать с stb, чтоб избежать тотального глюкалова?

IanPo 6th March 2014 22:47

Не совсем понятно, в чем глюкалово(покажи, что за сигнал), поэтому пока что вот так:
http://www.kit-e.ru/articles/circuit/2009_02_102.php
http://www.fpga4fun.com/CrossClockDomain.html

ЗЫ. Вместо 8'b1 можно написать 1'b1 безо всякого ущерба, компилятор наверняка так и оптимизирует

TSL 6th March 2014 23:03

Ссылки хорошие, собсна в них описана и проблема, и ее решение :)
Quote:

Originally Posted by IanPo (Post 684909)
Вместо 8'b1 можно написать 1'b1 безо всякого ущерба, компилятор наверняка так и оптимизирует

Угу.

---------- Post added at 20:03 ---------- Previous post was at 20:01 ----------

Quote:

Originally Posted by IanPo (Post 684909)
Не совсем понятно, в чем глюкалово

Метастабы.

solegstar 7th March 2014 01:50

:) мой вопрос решился установкой фильтра из катушки 100мкГн (буду подбирать, т.к. поставил то, что нашел) и конденсатора 10мкф по питанию перед ЕПМкой. теперь карта всегда определяется четко. также оставил поправленную прошивку. Спасибо TSL и Alvis за наводки! :)

Mick 26th March 2014 13:46

Господа, кто нибудь компилил когда нибудь VHDL в Max Plus II.
Вопрос в чем, почему компилятор выкидывает внутренние сигналы описанные как std_logic. Причем ошибок в синтаксисе не выдает.

Или может кто скинет рабочий проект VHDL для MAX PLus в качестве примера. А то я как то в недоумении.

lisica 26th March 2014 20:40

Quote:

Originally Posted by Mick (Post 694219)
Вопрос в чем, почему компилятор выкидывает внутренние сигналы описанные как std_logic

В квартусе такое, когда эти сигналы никуда не подключены то он автоматом их игнорирует.

Mick 26th March 2014 21:40

Quote:

Originally Posted by lisica (Post 694426)
В квартусе такое, когда эти сигналы никуда не подключены то он автоматом их игнорирует.

Ну как бы тебе объяснить. Про Кактус я не спрашивал, там все нормально. Мне интересен тот факт, что в Максе творится.
Тем более, я взял и написал такой же кусок только на AHDL - так вот в последнем случае код получился какой нужно. А вот VHDL явно делает не то что то.

Mick 26th March 2014 21:51

Quote:

Originally Posted by vlad (Post 694469)
VHDL Syntax (IEEE Std 1076-1987) небось юзаете?

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

kox 30th March 2014 14:23

Добрый день!
Подскажите как в Quartus прикрутить ядро T80 к проекту, выполненному в графическом редакторе?
Имеется проект, нарисованный схемным вводом, схемный файл установлен как Top-level Entity.
Проц T80, имеет 6 файлов:
T80_ALU.vhd
T80.vhd
T80_MCode.vhd
T80_Pack.vhd
T80_Reg.vhd
T80se.vhd
Вообщем как эти 6 файлов ввернуть в схемный ввод, в виде проца?
Сильно не пинайте- с языками verilog и vhdl не знаком, ковыряю потихоньку схемный ввод на досуге.
Заранее спасибо!


All times are GMT +4. The time now is 06:42.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.