Jump to content

    

Digi

Свой
  • Content Count

    190
  • Joined

  • Last visited

Everything posted by Digi


  1. Пока на inclock_en приходил сигнал с логики, то всё работало (до этого я не анализировал время прихода данных). Я подключил жёстко на inclock_en 1'b1 и после этого данные стали приходить не равномерно. Спасло прописать это: set_input_delay -clock {P1_CLKO} -min 2.7 [get_ports {P1_DO[*]}] set_input_delay -clock {P1_CLKO} -max 3.2 [get_ports {P1_DO[*]}] P1_CLKO и P1_DO это имена сигналов в самом верхнем уровне, соответствующие inclock и datain. Насколько корректно я это сделал, не могу понять. Получается что я указал задержку распостранения сигнала по внешним цепям, а по правильному нужно указывать допустимую задержку от пина до входа триггера. Но set_max(min)_delay у меня не сработали. Тем не менее вопрос для меня актуален, для общего развития (приходится переделывать старые проекты, а там часто встречались такие конструкции). PS: а в целом эта часть проекта заработала... но впереди много ещё чего предстоит )
  2. Сейчас столкнулся с тем, что не могу понять как прописать констрейны в проеке. Например первая сложность в том как прописать запираемое тактирование: (Сдвиговый регистр для приёма данных от 4х битного DDR для линк порта ADSP TS-201) wire inclock_gated = inclock & inclock_en; reg [11:0] datain_pos; reg [11:0] datain_neg; always @(posedge inclock_gated or negedge rst_n) if (~rst_n) datain_pos <= 12'b0; else datain_pos <= {datain, datain_pos[11:4]}; always @(negedge inclock_gated or negedge rst_n) if (~rst_n) datain_neg <= 12'b0; else datain_neg <= {datain, datain_neg[11:4]}; reg [4:0] pos_edges; reg [4:0] neg_edges; reg [15:0] pos_data; reg [15:0] neg_data; always @(posedge inclock_gated) if (freeze_pos) pos_data <= {datain, datain_pos}; always @(negedge inclock_gated) if (freeze_neg) neg_data <= {datain, datain_neg}; wire [31:0] shift_reg; assign shift_reg = {neg_data[15:12], pos_data[15:12], neg_data[11:8], pos_data[11:8], neg_data[7:4], pos_data[7:4], neg_data[3:0], pos_data[3:0]}; Ведь нужно учесть задержку inclock_gated относительно inclock. А потом уже относительно inclock_gated прописать допустимую задержку входных сигналов datain... Как бы вы порекомендовали ? Ещё выяснил, что от внешних пинов, до регистра datain_pos сигналы приходят с разной задержкой. Как их выровнять ?
  3. Я же писал, что этот блок работает с PCIe Gen2 x4, А у меня х1. С таким интерфейсом он не работает
  4. Оно примерно так и есть, это блок памяти подключен к контроллеру PCIe а с другой стороны подключен мой контроллер. Этот блок памяти является буфером обмена между компом и и моей железкой.
  5. Ага. Потом буду голову ломать, как к этому внешний DMA контроллер прикрутить и надыбать драйвер ))) Так как разрядность шины 64бит, а Avalon MM DMA работает только с шиной 128 бит. А так как 128 бит возможно только на Gen2 4х а у меня только 1х Gen1 то Avalon MM DMA не доступен. Поэтому только внешний контроллер....
  6. Не знаю, чем мне поможет Instance контроллера в QSys ведь к нему всё равно от памяти будет идти интерфейс Avalon. Мне то нужно вытащить(экспортировать) сигналы порта памяти. Чтобы получилась Instance в Qsys Двухпортовой памяти, к которой к одному порту подключена шина Avalon а другой порт экспортировался наружу в виде сигналов. К тому же у меня нет опыта в создании своего Instance для QSys. Временно решил проблему так, так как пока что только только чтение контроллером из памяти, я экспортировал Avalon второго порта и подключил соответствующие сигналы к контроллеру. Диаграмма работы шины вроде совпадает с диаграммой голой памяти.
  7. Так как раз и хотел получить прямые сигналы второго порта памяти вывести на контроллер. Так как контроллер уже отлажен с ними. Сейчас вытащил Avalon шину второго порта памяти, пытаюсь её прилепить к контроллеру.
  8. Получается что переходник или с Авалон Master на стандартный интерфейс памяти и память ставить вне Platform Designer или с Avalon Slave . На этой шине уже висят устройства с некоторым диапазоном адресов. Я хотел другой диапазон адресов этой же шины отдавать наружу в виде адрес/данные. Для дальнейшей работой с ними. Это будет доступ к банку регистров контроллера.
  9. С IO и памятью немного разобрался, заработало. Теперь задача стоит сопрячь 2х портовую память с Avalon-MM и самописным , внешним, контроллером. То есть я с одной стороны в Platform builder подключил 2х портовую память к Avalon а вот как получить обычные сигналы второго порта , не Avalon , чтобы прикрутить их к моему контроллеру ? И другой вопрос, что использовать для того чтобы вывести от Avalon MM Master наружу сигналы адрес, данные, чтение, запись , для того чтобы их использовать в своём контроллере ?
  10. Пока проблему решил путём аппаратной доработки железки. Кинул внешние проводники, высверлив старые.
  11. У меня как раз десятка, и там такого не нашел. И этого в логах тоже не нашёл... По идее этот параметр должен был быть применён. Ещё поковыряюсь, как чего наковыряю - сообщу. :)
  12. В каком описании это нашли ? Мне как раз и надо чтобы было NO_DC_GAIN, а Transciever Toolkit показывает значение по умолчанию 4.
  13. Немного накосячили с топологией шины PCIe. При помощи настройки параметров трансивера из Transciever Toolkit удалось добиться нормальной работы устройства, но как прописать теперь эти значения в сам трансивер, что бы после загрузки они были такими ? Попробовал а Assigment editor прописать set_instance_assignment -name XCVR_C10_RX_EQ_DC_GAIN_TRIM NO_DC_GAIN -to PCIE_RX , но изменений не произошло. Плис: Cyclone 10GX, Корка: pcie_a10_hip
  14. Я планировал что команды будут передаваться по одному BAR без DMA, а блок данных, объёмом несколько Мб по другому BAR и через DMA. Алгоритм примерно такой: 1 Установили частоту и режим работы. 2 Отправили СТАРТ 3 4 Дождались готовности новых 5 Считали данные по ДМА 6 Goto 2
  15. Команды команды произвольные, медленные. Типа: установки частоты, режима работы, итд... Сейчас буду пробовать что то изобразить )))
  16. Делаем устройство которое должно работать под управлением ОС LINUX и нужно поблочно передавать данные из/в устройство (используя DMA) и нужно передавать управляющие команды. По сути это плата аналогового ввода вывода данных. По реализации я себе это представляю так: обмен по DMA будет осуществляться с внешней DDR3 памятью подключенной к ПЛИС. Для работы с управляющими командами планировал выделить что то вроде регистровой памяти. Плис: Cyclone 10 GX. Кто нибудь таким занимался ? Посоветуйте как лучше это реализовать. PS: Если есть, кто сможет такое быстро реализовать, а ещё лучше если вы будете из Воронежа, то пишите. Рассмотрим различные варианты сотрудничества в плане разработки прошивок под FPGA.
  17. Срочно нужна PE42551 или PE42553 1 штука. Могу забратт в Москве или Воронеже.
  18. Вопрос снят. Объявил s_GSINIT как внешнюю и всё заработало. Уж не знаю, почему у меня её пришлось объявлять, но во всех других примерах дополнительного объявления не требовалось. .globl s_GSINIT __standard_interrupt_vector:: __reset_vector:: ljmp s_GSINIT
  19. Пытаюсь скомпилировать программу в SDCC для FX2 контроллера (MSC51), но столкнулся с проблемой. При подключении файла vectors.asm ассемблер не может найти функцию s_GSINIT. SDCC 4.0.0 До этого с такой связкой ни разу не работал. Буду рад если поделитесь примером проекта для связки Eclipse и SDCC. Возможно что что то не так настроил. Компилирую из под ECLIPSE , для asm файлов используется sdas8051 Ошибка такая: Building file: ../src/asm/vectors.asm Invoking: SDCC Assembler sdas8051 -l -o "src/asm/vectors.rel" "../src/asm/vectors.asm" removing src/asm/vectors.rel ../src/asm/vectors.asm:43: Error: <u> undefined symbol encountered during assembly make: *** [src/asm/vectors.rel] Error 2 .module vectors ;;; ---------------------------------------------------------------- ;;; standard FX2 interrupt vectors ;;; ---------------------------------------------------------------- .area CSEG (CODE) .area GSINIT (CODE) .area CSEG (CODE) __standard_interrupt_vector:: __reset_vector:: ljmp s_GSINIT ;; 13 8-byte entries. We point them all at __isr_nop ljmp __isr_nop ; 3 bytes .ds 5 ; + 5 = 8 bytes for vector slot ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 ljmp __isr_nop .ds 5 __isr_nop:: reti ;;; ---------------------------------------------------------------- ;;; the FIFO/GPIF autovector. 14 4-byte entries. ;;; must start on a 128 byte boundary. ;;; ---------------------------------------------------------------- . = __reset_vector + 0x0080 __fifo_gpif_autovector:: ljmp __isr_nop nop
  20. Подскажите диагностический и сервисный код на прибор Aeroflex 2948B. Надеюсь в меню диагностики обнаружить ручное управление блоками. Не могу понять, проблема в измерителе или аттенюаторе. Было с ним несколько проблем, явно видно что узел неисправен. Ремонтирую, всё работает, потом через некоторое время опять почти тоже самое. Сейчас проблема такая: При измерении мощности в широкой полосе показания правильные, в узкой - на 10 дб больше. Последний раз уже ради пробы поставил проходной аттенюатор на блок приёмника на 10 дб. Какое-то время всё работало правильно, через несколько дней, опять +10 дб.
  21. Вопрос так был сформулирован потому, что я многого не знал. Сейчас для себя нашёл удобный способ работы. Пишу проги сразу на удалённой машине с использованием VisualStudio code и расширения Remote SSH. VSCode кэширует файлы на локальной машине и при медленном и нестабильном инете работать достаточно комфортно. При необходимости скачиваю оттуда файлы по SCP при помощи SmartTTY. GDB пока не настроил, нет необходимости.
  22. Очередной косяк найден. Оказалось, что переменные объявлялись несколько раз, из-за этого их адреса перекрывались.
  23. Попробую упростить проект и перешлю. Но описание структуры и обращение к ней у меня правильно реализовано ? Или я что то не так понял и делаю недопустимые действия ?
  24. Причину падения нашёл. Её вызывает эта строчка st_stat_data[0].peak_levels[9] = 155; При её вызове перезаписывается переменная volatile uint16_t period_ms_cdg5; Разве я делаю неправильное обращение ? При выполнении записи пишет по адресу 0x8001d7f4 хотя, судя по регистрам, должен по другому адресу записать. Описана структура вот так: volatile typedef struct _station_status { double mean_comp_shift; uint32_t mean_levels[23]; uint32_t peak_levels[23]; uint32_t noise_levels[23]; uint8_t good_comps[23]; uint32_t comp_edges[23*2]; uint8_t n_good; uint8_t status_synhro[3]; //1й бит - цикл найден, 2й - точная подстройка выполнена, 3й - подстройка ои выполнена //float mean_phases[23]; } station_status; station_status st_stat_data[4]; map файл .scommon 0x000000008001d7e8 0x2c ./control.o 0x000000008001d7e8 alive_skip 0x000000008001d7ec portAnsCalibr 0x000000008001d7f0 prev_xtime 0x000000008001d7f4 period_ms_cdg5 0x000000008001d7f6 portAnsAutoFreqOI 0x000000008001d7f8 xtick_cntr 0x000000008001d7fc curr_time_msec 0x000000008001d800 addrDSTAnsAutoFreqOI 0x000000008001d804 xtime .... *(COMMON) COMMON 0x000000008001d940 0x7d0 ./_main.o 0x000000008001d940 st_stat_data 0x000000008001e100 head_stat_data COMMON 0x000000008001e110 0x80000 ./dprint.o 0x000000008001e110 Data COMMON 0x000000008009e110 0x0 ./hardware.o COMMON 0x000000008009e110 0x145478 ./reciever.o 0x000000008009e110 re_bank2 Дизассемблер: 999 st_stat_data[0].peak_levels[9] = 155; 0x8000fd0c: lui v0,0x8002 0x8000fd10: addiu v0,v0,-10600 0x8000fd14: li v1,155 0x8000fd18: sw v1,136(v0) v0 = 0x8001d698 v1 = 155 Вот ещё добавил запись двух переменных, пишет в одно и тоже место. В симуляторе эффект тот же. 366 period_ms_cdg5 =154; 0x800012ac: lui v0,0x8002 0x800012b0: li v1,154 0x800012b4: sh v1,-10440(v0) 367 st_stat_data[0].peak_levels[9] = 155; 0x800012b8: lui v0,0x8002 0x800012bc: addiu v0,v0,-10576 0x800012c0: li v1,155 0x800012c4: sw v1,136(v0)