Jump to content

    
Sign in to follow this  
evgenz

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

Recommended Posts

Всем привет.

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

Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Всем привет.

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

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

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

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

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

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
В тексте разбираться лень, а так по-жизни:

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

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

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

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

Share this post


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

 

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

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

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

Share this post


Link to post
Share on other sites
Задержать строб, это проводить запись не в один такт а в несколько???

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

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

 

Share this post


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

Можно замутить сигнал 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, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав??

Edited by evgenz

Share this post


Link to post
Share on other sites
я уже писал что проект собирается через командную строку, там я задаю параметр -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'; зачем он в цикле чтения

Share this post


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

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

 

 

Share this post


Link to post
Share on other sites
Мне кажется, Вы перемудрили с селектором адреса, в особенности в цикле записи.

Если я правильно понял, активные уровни 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 ???

Share this post


Link to post
Share on other sites
щас по пробую за фиксировать данные на шине процессора по вашему совету, я вот только не понял по поводу чтения

Сейчас увидел строку 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;

Share this post


Link to post
Share on other sites
Я просто не доконца понял, что Вы имели ввиду под All Constraints Met ???

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this