evgenz 0 27 мая, 2014 Опубликовано 27 мая, 2014 · Жалоба Всем привет. Народ помогите решить одну проблему. Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 27 мая, 2014 Опубликовано 27 мая, 2014 · Жалоба Смущает фаза "местного производства". Может статься, что Ваша ПЛИС не при чем. Посмотрели бы Вы осцилографом на шину. И ошибка где проявляется - при записи в ПЛИС или чтении в процессор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgenz 0 27 мая, 2014 Опубликовано 27 мая, 2014 · Жалоба Смущает фаза "местного производства". Может статься, что Ваша ПЛИС не при чем. Посмотрели бы Вы осцилографом на шину. И ошибка где проявляется - при записи в ПЛИС или чтении в процессор? Местного производства - это процессор который разрабатывался и соответственно производится на нашей фирме т.е. не для внешнего ранка. В том то и проблема что осциллографом не посмотришь, эта плавающая ошибка. Она возникает не постоянно, и очень сильно завит от трасировки и места расположения шины по кристаллу. Я ставил тестовый регистр на выходе/входе шины писал и читал все нормально. Но когда сигналы "дальше" в проект заводятся возникает ошибка по 7-му биту при чтении Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 27 мая, 2014 Опубликовано 27 мая, 2014 · Жалоба Всем привет. Народ помогите решить одну проблему. Есть шина данных и шина адреса между процессором (местного производства) и ПЛИС (Spartan-3). По шине данных всегда сбоит 7-бит. Весь проект состоит из больших четырех модулей. Каждый модуль синтезируется отдельно (через командную строку), чтобы получить 4-ре ngc файла. А весь проект также собирается через командную строку. Соответственно шина данных получается очень "ветвистой", также присутствуют длинные цепи. Как уже выше говорил на процессор приходят данные по шине с ошибкой в 7-бите. Я только, что не делал: 1.большие мультиплексоры разбил на более маленькие 2.из длинных цепей сделал короткие (путем ввода дополнительных регистров) 3.в водил временные ограничения на цепи 4.даже пробовал во FloorPlaner в ручную развести не получилось. Народ, что еще можно сделать, просто больше не могу ничего придумать. Ниже в файле приведен текст описания шины. Подскажите, что не так?? В тексте разбираться лень, а так по-жизни: Есть данные и есть цепи, по которым они проходят. Если данные не успевают прийти за какое-то время к триггеру, то надо просто задержать строб записи в этот триггер. А если данные не синхронизированы с внутренней частотой, то строб надо обработать по CDC... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgenz 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба В тексте разбираться лень, а так по-жизни: Есть данные и есть цепи, по которым они проходят. Если данные не успевают прийти за какое-то время к триггеру, то надо просто задержать строб записи в этот триггер. А если данные не синхронизированы с внутренней частотой, то строб надо обработать по CDC... Задержать строб, это проводить запись не в один такт а в несколько??? Все работа проекта асинхронна, и соответственно нет синхронизации с внутренней частотой, если не сложно можно по подробней как это строб обрабатывать по CDC ...???? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба Местного производства - это процессор который разрабатывался и соответственно производится на нашей фирме т.е. не для внешнего ранка. В том то и проблема что осциллографом не посмотришь, эта плавающая ошибка. Она возникает не постоянно, и очень сильно завит от трасировки и места расположения шины по кристаллу. Я ставил тестовый регистр на выходе/входе шины писал и читал все нормально. Но когда сигналы "дальше" в проект заводятся возникает ошибка по 7-му биту при чтении Цикл чтения формирует сам процессор, и временные расстановки участвующих в них сигналах должны гарантировать снятие данных. Можно замутить сигнал WR в T<=RD OR CS; Разводка кристалла не должна влиять, ибо по идее процессор считывает данные и только потом снимает CS, RD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба Задержать строб, это проводить запись не в один такт а в несколько??? Все работа проекта асинхронна, и соответственно нет синхронизации с внутренней частотой, если не сложно можно по подробней как это строб обрабатывать по CDC ...???? У меня на сайте "Краткий Курс", глава асинхронные частоты... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgenz 0 28 мая, 2014 Опубликовано 28 мая, 2014 (изменено) · Жалоба Цикл чтения формирует сам процессор, и временные расстановки участвующих в них сигналах должны гарантировать снятие данных. Можно замутить сигнал 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, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав?? Изменено 28 мая, 2014 пользователем evgenz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба я уже писал что проект собирается через командную строку, там я задаю параметр -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'; зачем он в цикле чтения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akorud 0 28 мая, 2014 Опубликовано 28 мая, 2014 · Жалоба там я задаю параметр -t (Placer Cost Table) эта таблица может принимать значения от 0 до 100, и при переборе значений этого параметра очень сильно зависит частота возникновения ошибок. Получается что от расположения шины в кристалле все таки что то зависит или я не прав?? А Timing Constraints: All Constraints Met есть? Что говорит timing report? А то на основании описания и цитаты я б сказал что ошибки есть. Или constraints не заданы и P&R все равно что получится :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evgenz 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Мне кажется, Вы перемудрили с селектором адреса, в особенности в цикле записи. Если я правильно понял, активные уровни 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 ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба щас по пробую за фиксировать данные на шине процессора по вашему совету, я вот только не понял по поводу чтения Сейчас увидел строку 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akorud 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Я просто не доконца понял, что Вы имели ввиду под All Constraints Met ??? Ну просто когда синтезируется в ISE там в итоге такое краткое сообщение появляется. Если его нет - надо копать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Это сообщение отражает в логе ISE если все констраины сошлись, правильнее в отчете о времянке поглядеть. Там должны быть перечислены все ваши констраины, и стоять отметки сошлись (выполнились) они или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akorud 0 29 мая, 2014 Опубликовано 29 мая, 2014 · Жалоба Это сообщение отражает в логе ISE если все констраины сошлись, правильнее в отчете о времянке поглядеть. Там должны быть перечислены все ваши констраины, и стоять отметки сошлись (выполнились) они или нет. Да, это просто логическое "И" всех констраинтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться