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

sp1

Участник*
  • Постов

    8
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

754 просмотра профиля
  • Staf

  1. Всем спасибо за полезную информацию!
  2. а запретить системе перемешивать CPLD как-нибудь можно?
  3. Всем, здравствуйте. Делаю систему на FPGA на основе xapp1052 для двусторонней передачи данных FPGA Spartan-6 (кит sp605) - оперативка. Передача данных из оперативки в FPGA осуществляется следующим образом: FPGA отправляет транзакцию MRd с соответствующими адресом, тегом и размером запрашиваемых данных, в ответ приходит транзакция CPLD с данными. Столкнулся со следующей проблемой, нарушается порядок следования транзакций CPLD. Т.е. я отправляю транзакции MRd с адресами данных последовательно, и теги в транзакциях MRd идут последовательно 1, 2, 3, ... 1F, 0, 1 ... а в ответ периодически приходят CPLD с нарушенным порядком. Например, сначала CPLD с тегом 2, потом CPLD с тегом 4, потом CPLD с тегом 5, потом CPLD с тегом 3, потом CPLD с тегом 6. И данные, соответственно, лежащая по адресам, соответствующим тегам. В результате в принимаемом на стороне FPGA файле данные перемешиваются. Пробовал выставлять всем транзакциям MRd одинаковый тег, данные все равно перемешиваются, хоть и CPLD идут с одинаковым тегом. Читал спецификацию PCI-Express, но так и не понял, это такая особенность PCI-Express, что ему разрешено менять порядок транзакций CPLD во избежании Deadlock'ов или дело в чем-то другом? Причем такая фишка у меня только в компах под управлением 64-разрядной операционки (Linux). В 32-разрядных Linux всё ОК. Кто-нибудь сталкивался с подобной проблемой? Что можете посоветовать?
  4. Пробовал ли кто-нибудь работать с двумя Xilinx ml605 на одной матплате (подключение по PCIe)? Были ли проблемы с определением двух ml605 (с различными PCIe Device ID) системой (операционка Linux Fedora)? На что обратить внимание при выборе матплаты?
  5. Описанный Вами вариант с "legacy" и статусным регистром рассматриваем, как запасной. Хотелось бы его избежать. :) Если получится - отпишусь. Написал сюда, т.к. уже кучу всяких настроек перепробовали, форумов перечитали, а толку - ноль.
  6. Здравствуйте. Работаю с китом sp605 (Spartan-6), xapp1052, Fedora 13. Хочу сделать, чтобы мой Endpoint (sp605) отправлял прерывания MSI PCIe. В проекте использую ядро pcie ipcore 1.4 (xilinx). Модуль запроса прерывания написал свой на Verilog (ибо тот, что идет в xapp1052, написан далеко не лучшим образом) в соответствии с документацией ug654 (документация на ipcore pcie 1.4). Мой модуль раз в секунду посылает запрос на генерацию ip-ядром прерывания MSI (все диаграммы по ug654). На каждый свой запрос генерации я получаю ответ от ядра, что прерывание отправлено. Программист написал драйвер, который устанавливает бит MSI_Enable в конфигурационном пространстве. При запуске драйвера идет инициализация Endpoint и программист "подписывается" на прерывание выделенное моему устройству. Однако, программист говорит, что до обработчика не дошло ни одного прерывания MSI. Если делаем с прерываниями legacy, то прерывания идут, но еще периодически проскакивают какие-то "лишние" прерывания видимо не от моего устройства. Полагаем, что "лишние" прерывания возникают из-за того, что при legacy на одном прерывании может сидеть несколько устройств. Поэтому от legacy хотим отказаться. Собственно вопрос: поднимал ли кто-нибудь MSI прерывания PCIe и что для этого нужно со стороны linux? Со стороны sp605 генератор прерываний сделан по документации на ipcore 1.4... С уважением, Игорь.
  7. Спасибо за помощь, все заработало. :)
  8. Здравствуйте. Помогите пожалуйста разобраться в следующей проблеме: Я описал на Verilog конечный автомат always @(posedge clk or negedge Rst) if(~Rst) FSM_st <= IDLE; else FSM_st <= FSM_n; always @(FSM_st or start or byte_cf_sent or byte_cv_sent or sstrb1 or sstrb2 or cnt_Tx_byte_clr or dout_Rx) case(FSM_st) IDLE: begin if(start) FSM_n = TRANSMIT_CONFIGURANION_BYTE; else FSM_n = IDLE; end TRANSMIT_CONFIGURANION_BYTE: begin if(byte_cf_sent) FSM_n = TRANSMIT_CONVERTION_BYTE; else FSM_n = TRANSMIT_CONFIGURANION_BYTE; end TRANSMIT_CONVERTION_BYTE: begin if(byte_cv_sent) FSM_n = WAITING_MAX_WORK; else FSM_n = TRANSMIT_CONVERTION_BYTE; end WAITING_MAX_WORK: begin if(~sstrb1 || ~sstrb2) FSM_n = MAX_WORK; else FSM_n = WAITING_MAX_WORK; end MAX_WORK: begin if(sstrb1 && sstrb2) FSM_n = RECEIVE_DOUT; else FSM_n = MAX_WORK; end RECEIVE_DOUT: begin if(dout_Rx) FSM_n = CHECK; else FSM_n = RECEIVE_DOUT; end CHECK: begin if(cnt_Tx_byte_clr) FSM_n = IDLE; else FSM_n = TRANSMIT_CONVERTION_BYTE; end default: begin FSM_n = IDLE; end endcase закодировал состояния parameter [6:0] IDLE = 7'b0000001, TRANSMIT_CONFIGURANION_BYTE = 7'b0000010, TRANSMIT_CONVERTION_BYTE = 7'b0000100, WAITING_MAX_WORK = 7'b0001000, MAX_WORK = 7'b0010000, RECEIVE_DOUT = 7'b0100000, CHECK = 7'b1000000; Сигнал Rst(асинхронный Reset) всегда в 1, сигналы sstrb1 и sstrb2 асинхронные, остальные синхронные. При прошивке Virtex-4 сначала автомат работает нормально, потом автомат сваливается в состояние FSM_st = 7'b0000000 и не может из него выбраться, несмотря на то, что приходитят положительные фронты clk. Как такое вообще может быть?
×
×
  • Создать...