Перейти к содержанию
    

Двунаправленная 32-х битная шина данных

Всем привет.

Народ помогите решить одну проблему.

Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (Spartan-3). По шине данных всегда сбоит 7-бит. Весь проект состоит из больших четырех модулей. Каждый модуль синтезируется отдельно (через командную строку), чтобы получить 4-ре ngc файла. А весь проект также собирается через командную строку. Соответственно шина данных получается очень "ветвистой", также присутствуют длинные цепи. Как уже выше говорил на процессор приходят данные по шине с ошибкой в 7-бите. Я только, что не делал:

1.большие мультиплексоры разбил на более маленькие

2.из длинных цепей сделал короткие (путем ввода дополнительных регистров)

3.в водил временные ограничения на цепи

4.даже пробовал во FloorPlaner в ручную развести не получилось.

Народ, что еще можно сделать, просто больше не могу ничего придумать.

Ниже в файле приведен текст описания шины. Подскажите, что не так??

 

Всем привет.

Народ помогите решить одну проблему.

Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (Spartan-3). По шине данных всегда сбоит 7-бит. Весь проект состоит из больших четырех модулей. Каждый модуль синтезируется отдельно (через командную строку), чтобы получить 4-ре ngc файла. А весь проект также собирается через командную строку. Соответственно шина данных получается очень "ветвистой", также присутствуют длинные цепи. Как уже выше говорил на процессор приходят данные по шине с ошибкой в 7-бите. Я только, что не делал:

1.большие мультиплексоры разбил на более маленькие

2.из длинных цепей сделал короткие (путем ввода дополнительных регистров)

3.в водил временные ограничения на цепи

4.даже пробовал во FloorPlaner в ручную развести не получилось.

Народ, что еще можно сделать, просто больше не могу ничего придумать.

Ниже в файле приведен текст описания шины. Подскажите, что не так??

entity ARMINTERFACE is
    Port ( AD : in std_logic_vector(22 downto 0);         --Address bus
           DA : inout std_logic_vector(31 downto 0);    --Data bus
           CS : in std_logic;
           WR : in std_logic;
           RD : in std_logic;
           HCLK : in std_logic;                                --100 MHz
           x50 : in std_logic;                                --50 MHz
           DATA_OUT0 : in std_logic_vector(31 downto 0);--output data FROM devices
           DATA_OUT1 : in std_logic_vector(31 downto 0);--output data FROM devices
              INTR0,INTR1:IN STD_LOGIC;

              WR_EN0,WR_EN1:OUT STD_LOGIC;
             RD_EN0,RD_EN1:OUT STD_LOGIC;
              WR_EN050,WR_EN150:OUT STD_LOGIC;
              INTR_0:OUT STD_LOGIC;
              INTR_1:OUT STD_LOGIC;
           DATA_IN : out std_logic_vector(31 downto 0); --input data for devoces from ARM
           A : out std_logic_vector(22 downto 0)--Adresses: AR is used when ARM is reading from device, AW - when writing
              );
end ARMINTERFACE;

architecture Behavioral of ARMINTERFACE is

SIGNAL CSx,CSTx,CS2Tx:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL CSTx50,CS2Tx50:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL DATA_OUT:STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL RD_ENx:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL WR_ENx:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL WR_ENx50:STD_LOGIC_VECTOR(1 DOWNTO 0);

signal T,TRANS:STD_LOGIC;

begin

A(22 DOWNTO 18)<=(OTHERS=>'0');
--A(17 DOWNTO 0)<=AD(17 DOWNTO 0);

----********************* my izmenen ************************
xDA:FOR B IN 31 DOWNTO 0 GENERATE
    xIBUF: IBUF PORT MAP (I=>DA(B),O=>DATA_IN(B));
END GENERATE;

xBUFA:FOR B IN 17 DOWNTO 0 GENERATE
    xBUF: BUF PORT MAP (I=>AD(B),O=>A(B));
END GENERATE;

WR_EN0<=WR_ENx(0);
WR_EN1<=WR_ENx(1);
WR_EN050<=WR_ENx50(0);
WR_EN150<=WR_ENx50(1);
RD_EN0<=RD_ENx(0);
RD_EN1<=RD_ENx(1);
TRANS<='0' WHEN CS='0' AND (RD='0' OR WR='0') ELSE '1';
CSx(0)<='0' WHEN TRANS='0' AND AD(19 DOWNTO 18)="00" ELSE '1';
CSx(1)<='0' WHEN TRANS='0' AND AD(19 DOWNTO 18)="01" ELSE '1';

x:FOR i IN 1 DOWNTO 0 GENERATE
  xFD1: FD PORT MAP (D=>CSx(i),C=>HCLK,Q=>CSTx(i));
  xFD2: FD PORT MAP (D=>CSTx(i),C=>HCLK,Q=>CS2Tx(i)); 
  xFD150: FD PORT MAP (D=>CSx(i),C=>x50,Q=>CSTx50(i));
  xFD250: FD PORT MAP (D=>CSTx50(i),C=>x50,Q=>CS2Tx50(i));  

--  WR_ENx(i)<='1' WHEN WR='0' AND CSTx(i)='0' AND CS2Tx(i)='1' ELSE '0';
--  WR_ENx50(i)<='1' WHEN WR='0' AND CSTx50(i)='0' AND CS2Tx50(i)='1' ELSE '0';
  RD_ENx(i)<='1' WHEN RD='0' AND CSx(i)='0' ELSE '0';
END GENERATE;

--****************************************************
-- WrEn возводится по отрицательному фронту
    process (HCLK)
    begin
        if (HCLK'event and HCLK = '0') then
                if WR='0' AND CSTx(0)='0'     AND CS2Tx(0)='1' then WR_ENx(0) <='1';
                    else WR_ENx(0) <='0'; end if;
                if WR='0' AND CSTx(1)='0'     AND CS2Tx(1)='1' then WR_ENx(1) <='1';
                    else WR_ENx(1) <='0'; end if;
        end if;
    end process;
    
    process (x50)
    begin
        if (x50'event and x50 = '0') then
                if WR='0' AND CSTx50(0)='0'     AND CS2Tx50(0)='1' then WR_ENx50(0) <='1';
                    else WR_ENx50(0) <='0'; end if;
                if WR='0' AND CSTx50(1)='0'     AND CS2Tx50(1)='1' then WR_ENx50(1) <='1';
                    else WR_ENx50(1) <='0'; end if;
        end if;
    end process;
--****************************************************

--tristate logic for data output
T<=RD OR CS;

--******************** my izmenen *******************
--DATA_OUT<=DATA_OUT0 WHEN AD(19 DOWNTO 18)="00" ELSE
--             DATA_OUT1 WHEN AD(19 DOWNTO 18)="01" ELSE             
--             X"0000000" & "00" & INTR1 & INTR0;

process (X50)
begin
    if rising_edge(X50) then
        if (AD(19 DOWNTO 18) = "00") then DATA_OUT<=DATA_OUT0; end if;
        if (AD(19 DOWNTO 18) = "01") then DATA_OUT<=DATA_OUT1; end if;
        if(AD(19 DOWNTO 18) /= "00" and AD(19 DOWNTO 18)/="01") then DATA_OUT<=X"0000000" & "00" & INTR1 & INTR0; end if;
    end if;
end process;
--*************************************************     
             
xBUFT: FOR B IN 31 DOWNTO 0 GENERATE
    x: OBUFT PORT MAP (I=>DATA_OUT(B),T=>T,O=>DA(B));
END GENERATE;
    
--INTERRUPTS--
INTR_0<=INTR0;
INTR_1<=INTR1;

end Behavioral;

ARMINTERFACE.vhd

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смущает фаза "местного производства". Может статься, что Ваша ПЛИС не при чем. Посмотрели бы Вы осцилографом на шину. И ошибка где проявляется - при записи в ПЛИС или чтении в процессор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смущает фаза "местного производства". Может статься, что Ваша ПЛИС не при чем. Посмотрели бы Вы осцилографом на шину. И ошибка где проявляется - при записи в ПЛИС или чтении в процессор?

Местного производства - это процессор который разрабатывался и соответственно производится на нашей фирме т.е. не для внешнего ранка. В том то и проблема что осциллографом не посмотришь, эта плавающая ошибка. Она возникает не постоянно, и очень сильно завит от трасировки и места расположения шины по кристаллу. Я ставил тестовый регистр на выходе/входе шины писал и читал все нормально. Но когда сигналы "дальше" в проект заводятся возникает ошибка по 7-му биту при чтении

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет.

Народ помогите решить одну проблему.

Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (Spartan-3). По шине данных всегда сбоит 7-бит. Весь проект состоит из больших четырех модулей. Каждый модуль синтезируется отдельно (через командную строку), чтобы получить 4-ре ngc файла. А весь проект также собирается через командную строку. Соответственно шина данных получается очень "ветвистой", также присутствуют длинные цепи. Как уже выше говорил на процессор приходят данные по шине с ошибкой в 7-бите. Я только, что не делал:

1.большие мультиплексоры разбил на более маленькие

2.из длинных цепей сделал короткие (путем ввода дополнительных регистров)

3.в водил временные ограничения на цепи

4.даже пробовал во FloorPlaner в ручную развести не получилось.

Народ, что еще можно сделать, просто больше не могу ничего придумать.

Ниже в файле приведен текст описания шины. Подскажите, что не так??

В тексте разбираться лень, а так по-жизни:

Есть данные и есть цепи, по которым они проходят. Если данные не успевают прийти за какое-то время к триггеру, то надо просто задержать строб записи в этот триггер.

А если данные не синхронизированы с внутренней частотой, то строб надо обработать по CDC...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В тексте разбираться лень, а так по-жизни:

Есть данные и есть цепи, по которым они проходят. Если данные не успевают прийти за какое-то время к триггеру, то надо просто задержать строб записи в этот триггер.

А если данные не синхронизированы с внутренней частотой, то строб надо обработать по CDC...

Задержать строб, это проводить запись не в один такт а в несколько???

Все работа проекта асинхронна, и соответственно нет синхронизации с внутренней частотой, если не сложно можно по подробней как это строб обрабатывать по CDC ...????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Местного производства - это процессор который разрабатывался и соответственно производится на нашей фирме т.е. не для внешнего ранка. В том то и проблема что осциллографом не посмотришь, эта плавающая ошибка. Она возникает не постоянно, и очень сильно завит от трасировки и места расположения шины по кристаллу. Я ставил тестовый регистр на выходе/входе шины писал и читал все нормально. Но когда сигналы "дальше" в проект заводятся возникает ошибка по 7-му биту при чтении

 

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

Можно замутить сигнал WR в T<=RD OR CS;

Разводка кристалла не должна влиять, ибо по идее процессор считывает данные и только потом снимает CS, RD

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задержать строб, это проводить запись не в один такт а в несколько???

Все работа проекта асинхронна, и соответственно нет синхронизации с внутренней частотой, если не сложно можно по подробней как это строб обрабатывать по CDC ...????

У меня на сайте "Краткий Курс", глава асинхронные частоты...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно замутить сигнал WR в T<=RD OR CS;

Разводка кристалла не должна влиять, ибо по идее процессор считывает данные и только потом снимает CS, RD

у меня так и сделано

...

--tristate logic for data output

T<=RD OR CS;

DATA_OUT<=DATA_OUT0 WHEN AD(19 DOWNTO 18)="00" ELSE

DATA_OUT1 WHEN AD(19 DOWNTO 18)="01" ELSE

X"0000000" & "00" & INTR1 & INTR0;

 

xBUFT: FOR i IN 31 DOWNTO 0 GENERATE

x: OBUFT PORT MAP (I=>DATA_OUT(i),T=>T,O=>DA(i));

END GENERATE;

...

я уже писал что проект собирается через командную строку, там я задаю параметр -t (Placer Cost Table) эта таблица может принимать значения от 0 до 100, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав??

Изменено пользователем evgenz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я уже писал что проект собирается через командную строку, там я задаю параметр -t (Placer Cost Table) эта таблица может принимать значения от 0 до 100, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав??

 

Мне кажется, Вы перемудрили с селектором адреса, в особенности в цикле записи.

Если я правильно понял, активные уровни WR,RD - 0

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

По переходу из 0 в 1 сигнала WR Вы привязываетесь к клокам 50, 100, формируя сигналы ENA

Мне кажется тут Вы и теряете данные (по записи, а не по чтению)

Наверно надо в Вашем случае по переходу из 0 в 1 сигнала WR в интервале CS фиксировать в регистрах значения адреса и данных на шине процессора в цикле записи, а не просто транслировать со входа на выход модуля.

Ну а длительность цикла чтения зависит только от Ваших задержек

TRANS<='0' WHEN CS='0' AND (RD='0' OR WR='0') ELSE '1'; зачем он в цикле чтения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

там я задаю параметр -t (Placer Cost Table) эта таблица может принимать значения от 0 до 100, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав??

А Timing Constraints: All Constraints Met есть? Что говорит timing report? А то на основании описания и цитаты я б сказал что ошибки есть. Или constraints не заданы и P&R все равно что получится :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется, Вы перемудрили с селектором адреса, в особенности в цикле записи.

Если я правильно понял, активные уровни WR,RD - 0

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

По переходу из 0 в 1 сигнала WR Вы привязываетесь к клокам 50, 100, формируя сигналы ENA

Мне кажется тут Вы и теряете данные (по записи, а не по чтению)

Наверно надо в Вашем случае по переходу из 0 в 1 сигнала WR в интервале CS фиксировать в регистрах значения адреса и данных на шине процессора в цикле записи, а не просто транслировать со входа на выход модуля.

Ну а длительность цикла чтения зависит только от Ваших задержек

TRANS<='0' WHEN CS='0' AND (RD='0' OR WR='0') ELSE '1'; зачем он в цикле чтения

щас по пробую за фиксировать данные на шине процессора по вашему совету, я вот только не понял по поводу чтения

(Ну а длительность цикла чтения зависит только от Ваших задержек TRANS<='0' WHEN CS='0' AND (RD='0' OR WR='0') ELSE '1'; зачем он в цикле чтения) а как же тогда ??? или я что то не до понимаю??? и можно чутка по подробней где я перемудрил с селектором адреса в цикле записи???

 

 

А Timing Constraints: All Constraints Met есть? Что говорит timing report? А то на основании описания и цитаты я б сказал что ошибки есть. Или constraints не заданы и P&R все равно что получится :)

я в UCF файле ввел Timing Constraints - если Вы это подразумеваете. А когда делаю анализ в TimingAnalyzer то не все Constraints выполняются может конечно с этим связано но не выполняются констрэйны по цепям которые никак не связаны с шиной. На PAR вот какие ограничения наложены (par -t 27 -n 1 -ol high -xe c -w bnadir/all_devices_map_27.ncd bnadir/H_H_27.ncd bnadir/all_devices_27.pcf)

Я просто не доконца понял, что Вы имели ввиду под All Constraints Met ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

щас по пробую за фиксировать данные на шине процессора по вашему совету, я вот только не понял по поводу чтения

Сейчас увидел строку if (HCLK'event and HCLK = '0') then

if WR='0' AND CSTx(0)='0' AND CS2Tx(0)='1' then WR_ENx(0) <='1';

и понял, что ввел Вас в заблуждение. Вы формируете сигнал ena по переходу из 1 в 0 сигнала WRn. Тогда с записью у Вас должно быть все нормально. WR='0' в условии наверно лишнее

 

Что касается чтения, наверно нет надобности его стробировать клоком, чистое мультиплексирование по адресу

process (X50)

begin

if rising_edge(X50) then

if (AD(19 DOWNTO 18) = "00") then DATA_OUT<=DATA_OUT0; end if;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я просто не доконца понял, что Вы имели ввиду под All Constraints Met ???

Ну просто когда синтезируется в ISE там в итоге такое краткое сообщение появляется. Если его нет - надо копать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это сообщение отражает в логе ISE если все констраины сошлись, правильнее в отчете о времянке поглядеть. Там должны быть перечислены все ваши констраины, и стоять отметки сошлись (выполнились) они или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это сообщение отражает в логе ISE если все констраины сошлись, правильнее в отчете о времянке поглядеть. Там должны быть перечислены все ваши констраины, и стоять отметки сошлись (выполнились) они или нет.

Да, это просто логическое "И" всех констраинтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...