Jump to content

    

GAYVER

Свой
  • Content Count

    175
  • Joined

  • Last visited

Community Reputation

0 Обычный

About GAYVER

  • Rank
    Частый гость

Старые поля

  • skype
    Array

Контакты

  • Сайт
    Array
  • ICQ
    Array

Recent Profile Visitors

1750 profile views
  1. это понятно что mcs это не mb 11.0. но хотя бы направление поиска задано. может быть в очередном ПГ наткнусь и на требования к чистому МБ. ну или в даташите на него дочитаюсь до нужной строчки. а пока метод научного тыка показывает что и в чистом МБ есть аналог ИО_модуля, в котором что-то жестко прописано
  2. вы оказались правы. в ПГ116 (MicroBlaze MCS v3.0) был такой пунктик: I/O ModuleThe I/O Module core is a light-weight implementation of a set of standard I/O functions commonly used in a MicroBlaze processor sub-system. Detailed information about the I/O Module core can be found in the I/O Module Product Guide (PG111) [Ref 5]. The I/O Module core registers are mapped at address 0x80000000, and the I/O Bus is mapped at address 0xC0000000-0xFFFFFFFF in the MicroBlaze memory space. The fixed I/O Module parameter values can be found in Table 4-3. Получил запрос на аксёвой шине, сейчас буду подгонять адреса. Спасибо за заданное направление поиска :)
  3. поставил адрес 0xA000_0000, результат тот же - запрос идет на LMB. а где можно посмотреть за выделяемые диапазоны? насколько я помню оговаривалось только что есть кэшируемая и не кэшируемая области. причем без конкретики - что с какого адреса начинается
  4. Микроблейз из тестового примера был добавлен в бОльший проект. Для связи с нашими местными акси устройствами наружу с интерконнекта был вытащен один мастер инфтерфейс, который замаплен на адрес 0x20000000. Задача - достучаться до внешней памяти через этот интерфейс. В сишную тестовую программу вставил команду чтения с этого адреса (адрес взят как дефайн базового адреса этого мастер интерфеса из "xparameters.h"). Результат - на выходе микроблейза появляется чтение по этому адресу ("внешнее" акси) но не на порту акси-данных, а на порту внутренней памяти, висящей на LMB шине. При этом, несмотря на несовпадение адресов, стоящий внутри блока памяти декодера-"маскировщика" и в целом вылета адреса за доступный диапазон памяти данных микроблейза, ответ оттуда приходит #include "xparameters.h" //Библиотека с параметрами IP-блоков #include "xgpio.h" //Библиотека с функциями GPIO #include "xil_io.h" #include "xil_testio.h" XGpio gpio; //Создаем "программную" модель GPIO int main(){ u32 i = 0; //используем для задержки u32 led = 0; //состояние светодиода u32 pr=XPAR_M02_AXI_0_BASEADDR; //+0x10000000 u32 pr2; u32 cons=6; int err=3; XGpio_Initialize(&gpio, XPAR_GPIO_0_DEVICE_ID);//Находим и инициализируем GPIO xil_printf("Hello, world!!!");//Автоматически цепляется Uartlite и выводит сообщение err=Xil_TestIO32(XPAR_M02_AXI_0_BASEADDR, 4, cons, 0, 0); while(1==1){ //Бесконечный цикл мигания i++; //увеличиваем счётчик if(i == 1000){//Если достигнуто значение 1_000_000 led = !led;//Инвертируем состояние светодиода i = 0;//Сбрасываем сётчик XGpio_DiscreteWrite(&gpio, 1, led);//Записываем состояние светодиода в GPIO pr2=Xil_In32(pr); pr=pr+4; //xil_printf(pr2); } } return 0; } Плюс еще запользовал команду тестирования ввода-вывода. Результат тот же - вместо внешнего акси запросы уходят на внутреннюю память данных. Вопрос - где я не прав?
  5. вопросы вроде задал - как отдебажить С-код без платы, почему не идет моделирование. цели - научиться работать с МБ. статья шикарна - более подробных и четких описаний я еще не видел. косяк в том, что HW часть и так не проблема, а SW часть не вполне соответствует исходным задачам
  6. делаю пример по описанию. ввиду полного отсутствия понимания принципов работы сдк, софт часть выполнялась в режиме обезьяны. платы для отладки нет. после всех манипуляций надо запустить моделирование. собственно вопрос - как правильно портировать назад в виваду все для этого необходимое? как я понимаю это должен быть элф-файл, в котором будет лежать все что нужно, включая содержимое внутренней памяти (подключенной по ЛМВ). сейчас при запуске моделирования из вивады, в памяти микроблейза лежит одна константа по нулевому адресу. сам микроблейз шарашит по кругу чтение инструкций по адресам 0-4-8. поиском по папке проекта находится несколкьо элф-файлов . из папки .sdk: Section Data: .vectors.reset [00000000] 00 00 00 b0 50 00 08 b8 .vectors.sw_exception [00000000] 00 00 00 b0 00 0e 08 b8 .vectors.interrupt [00000000] 00 00 00 b0 ac 11 08 b8 .vectors.hw_exception [00000000] 00 00 00 b0 7c 03 08 b8 .text [00000000] 00 00 00 b0 60 23 a0 31 00 00 00 b0 b8 20 40 30 [00000010] 00 00 00 b0 78 2f 20 30 00 00 00 b0 60 02 f4 b9 [00000020] 00 00 00 80 00 00 00 b0 6c 04 f4 b9 00 00 a3 30 [00000030] 00 00 00 b8 00 00 00 b0 60 23 a0 30 00 00 00 b0 .init [00000000] f0 ff 21 30 00 08 e0 d9 ff ff 60 31 02 c8 0b 94 [00000010] 00 00 60 31 00 c8 0b 94 ff ff 00 b0 50 e6 f4 b9 [00000020] 00 00 00 80 ff ff 00 b0 d0 f1 f4 b9 00 00 00 80 [00000030] 00 08 e0 c9 08 00 0f b6 10 00 21 30 .fini [00000000] f0 ff 21 30 00 08 e0 d9 ff ff 00 b0 44 e5 f4 b9 [00000010] 00 00 00 80 00 08 e0 c9 08 00 0f b6 10 00 21 30 .ctors [00000000] ff ff ff ff 00 00 00 00 .dtors [00000000] ff ff ff ff 00 00 00 00 .rodata [00000000] 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 21 21 0a [00000010] 0d 00 00 00 78 67 70 69 6f 2e 63 00 78 67 70 69 [00000020] 6f 5f 73 69 6e 69 74 2e 63 00 00 00 30 31 32 33 [00000030] 34 35 36 37 38 39 41 42 43 44 45 46 00 00 00 00 .data [00000000] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000010] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000020] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .sdata .sbss .debug_frame [00000000] 0c 00 00 00 ff ff ff ff 03 00 01 7f 0f 0c 01 00 [00000010] 24 00 00 00 00 00 00 00 5c 0e 00 00 24 01 00 00 [00000020] 04 04 00 00 00 0e 28 04 08 00 00 00 8f 28 93 04 [00000030] 04 04 00 00 00 0d 13 00 .debug_info [00000000] 48 0a 00 00 04 00 00 00 00 00 04 01 54 aa 00 00 [00000010] 0c 58 8e 00 00 79 76 00 00 00 00 00 00 00 00 00 [00000020] 00 00 00 00 00 00 00 00 00 02 01 06 ce c0 00 00 [00000030] 02 01 08 87 1d 00 00 02 02 05 76 53 00 00 02 02 .debug_abbrev [00000000] 01 11 01 25 0e 13 0b 03 0e 1b 0e 55 17 11 01 10 [00000010] 17 99 42 17 00 00 02 24 00 0b 0b 3e 0b 03 0e 00 [00000020] 00 03 16 00 03 0e 3a 0b 3b 0b 39 0b 49 13 00 00 [00000030] 04 24 00 0b 0b 3e 0b 03 08 00 00 05 16 00 03 08 .debug_aranges [00000000] 1c 00 00 00 02 00 00 00 00 00 04 00 00 00 00 00 [00000010] 5c 0e 00 00 24 01 00 00 00 00 00 00 00 00 00 00 [00000020] 1c 00 00 00 02 00 4c 0a 00 00 04 00 00 00 00 00 [00000030] 80 03 00 00 a8 00 00 00 00 00 00 00 00 00 00 00 .debug_ranges [00000000] 5c 0e 00 00 80 0f 00 00 00 00 00 00 00 00 00 00 .debug_macro [00000000] 04 00 02 00 00 00 00 07 c5 01 00 00 03 00 01 03 [00000010] 01 0c 07 4d 08 00 00 04 03 02 0b 05 7a 5c 2c 00 [00000020] 00 03 82 01 04 05 36 66 81 00 00 03 3c 0d 03 09 [00000030] 0e 05 0a 0f 62 00 00 03 0c 02 05 06 2e ad 00 00 .debug_line [00000000] 5b 04 00 00 04 00 d3 03 00 00 01 01 01 f6 f2 0d [00000010] 00 01 01 01 01 00 00 00 01 00 00 01 2e 2e 2f 2e [00000020] 2e 2f 6d 69 63 72 6f 62 6c 61 7a 65 5f 6c 65 73 [00000030] 73 6f 6e 5f 31 5f 62 73 70 2f 6d 69 63 72 6f 62 .debug_str [00000000] 5f 6f 6e 5f 65 78 69 74 5f 61 72 67 73 5f 70 74 [00000010] 72 00 58 50 41 52 5f 4d 49 43 52 4f 42 4c 41 5a [00000020] 45 5f 4d 5f 41 58 49 5f 44 43 5f 45 58 43 4c 55 [00000030] 53 49 56 45 5f 41 43 43 45 53 53 20 30 00 49 6e .symtab [00000000] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000010] 00 00 00 00 00 00 00 00 00 00 00 00 03 00 01 00 [00000020] 00 00 00 00 08 00 00 00 00 00 00 00 03 00 02 00 [00000030] 00 00 00 00 10 00 00 00 00 00 00 00 03 00 03 00 .strtab [00000000] 00 64 3a 2f 77 6f 72 6b 2f 73 6f 66 74 2f 76 69 [00000010] 76 61 64 6f 2f 32 30 31 39 2e 31 2f 73 64 6b 2f [00000020] 32 30 31 39 2e 31 2f 67 6e 75 2f 6d 69 63 72 6f [00000030] 62 6c 61 7a 65 2f 6e 74 2f 62 69 6e 2f 2e 2e 2f .shstrtab [00000000] 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 [00000010] 00 2e 73 68 73 74 72 74 61 62 00 2e 76 65 63 74 [00000020] 6f 72 73 2e 72 65 73 65 74 00 2e 76 65 63 74 6f [00000030] 72 73 2e 73 77 5f 65 78 63 65 70 74 69 6f 6e 00 Segment Data: Segment # 0 [00000000] 00 00 00 b0 50 00 08 b8 00 00 00 b0 00 0e 08 b8 [00000010] 00 00 00 b0 ac 11 08 b8 00 00 00 00 00 00 00 00 [00000020] 00 00 00 b0 7c 03 08 b8 Segment # 1 [00000000] 00 00 00 b0 60 23 a0 31 00 00 00 b0 b8 20 40 30 [00000010] 00 00 00 b0 78 2f 20 30 00 00 00 b0 60 02 f4 b9 [00000020] 00 00 00 80 00 00 00 b0 6c 04 f4 b9 00 00 a3 30 [00000030] 00 00 00 b8 00 00 00 b0 60 23 a0 30 00 00 00 b0 Segment # 2 [00000000] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000010] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000020] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000030] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 из папки .src: Section Data: .boot [00000000] 00 00 00 b8 .text .data .shstrtab [00000000] 00 2e 73 79 6d 74 61 62 00 2e 73 74 72 74 61 62 [00000010] 00 2e 73 68 73 74 72 74 61 62 00 2e 62 6f 6f 74 [00000020] 00 2e 74 65 78 74 00 2e 64 61 74 61 00 2e 62 73 [00000030] 73 00 .symtab [00000000] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [00000010] 00 00 00 00 00 00 00 00 00 00 00 00 03 00 01 00 [00000020] 00 00 00 00 00 00 00 00 00 00 00 00 03 00 02 00 [00000030] 00 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 .strtab [00000000] 00 5f 62 6f 6f 74 00 Segment Data: Segment # 0 Segment # 1 Segment # 2 [00000000] 00 00 00 b8 собственно при моделировании по нулевому адресу в памяти лежит только значение "b8000000", остальное нули и как я понимаю - подсосался не тот файл... зы есть ли в природе русскоязычные обучалки по СДК? сейчас стоит вопрос по последовательности действий при дебаге без платы, и интересно посмотреть на сишный код, сконвертированный в команды микроблейза
  7. 1 - в каком конкретно разделе обозначена связь RLAST-RVALID-RREADY? конкретно по тактам - "этот сигнал может выставляться раньше/позже этого сигнала" или "должны выставляться одновременно", итд. я не нашел. 2 - оба модуля - ИП ядра хилинха, что исключает какую-либо МОЮ вольную трактовку
  8. Поэтому при соединении интерконнекта и мастеров-слэйвов, соответствующие входы/выходы этого канала были заземлены. Неопределенку рожает сам интерконнект. От транзакции к транзакции в пределах одного слэйва, при этом, он переходит. Влиять на арбитраж, повторюсь, BRESP не должен был. И пока меня эта неопределенка не касалась, и все функционировало как и должно было - я в нее не влазил :). Сейчас буду ковырять - кто ее там делает... зы таки да, тупанул - надо было сразу делать все как надо, а не постепенно наращивая функционал, по мере отладки предыдущего ззы еще было замечено интересное в связке интерконнект/конвертер протокола акси лайт (хилинховые корки). В качестве слэйва для интерконнекта выступает конвертер, за которым стоит конЕчный слэйв. В последней передаче по чтению, конвертер выставляет сначала RLAST, и на следующем такте данные и RVALID. А интерконнект заканчивает передачу увидев RLAST. И то ли интерконнект не ловит связку RLAST=1 && RVALID=1, то ли конвертер не одновременно их выставляет... Кто некорректно работает - не понятно. В спецификации не вспомню явных требований на этот счет
  9. Какая разница отвечает или нет слэйв, если ни в мастере ни в слэйве не предусмотрена эта логика. И при заданных настройках интерконнект должен только ретранслировать его, никак не обрабатывая - арбитраж происходит по каналу адреса, и канал ответа в нем участия принимать не должен Спецификация разделяет мастер/слэйв интерфейсы. Хилинх дает определения мастер/слэйв интрфейсам интерконнекта, мастер/слэйв слотам, итд
  10. Слэйвы не отвечают по BRESP. его дергает только интерконнект при ошибке адресации. Система действительно не полный round-robin. Второй мастер с приоритетом 1, первый с нулевым (участвующем в round-robin). Но обращение везде идет от первого мастера. Второй никак не задействован. Транзакции, по идее, завершаются корректно - несколько подряд к одному слэйву вполне себе проходят. Причем чтение-запись - что записали, то и проверочно вычитали надо будет действительно попробовать убрать готовность на мастере во время чтения
  11. не знаю как понятней объяснить :). 1 - РРЭДИ на выходе корки не реагирует на изменение РРЭДИ на ее входе. И на скрине это видно - на мастере он вздергивается в 1 только на момент чтения, слэйву же выходит все время единица. За исключением непонятного перепада в ноль при первом обращении... 2 - залипает, скорее всего, арбитр адресов. Потому как не происходит переключения канала на другого слэйва. Карта, кусок ТБ и результат ниже //========================================================= //0号主机写任务 task task_m0_w(input [31:0] addr_start); begin addr_start_0 = addr_start; en_w_0 = '1; #PERIOD; en_w_0 = '0; #400; end endtask //========================================================= //0еЏ·дё»жњєиЇ»д»»еЉЎ task task_m0_r(input [31:0] addr_start); begin addr_start_0 = addr_start; en_r_0 = '1; #PERIOD; en_r_0 = '0; #400; end endtask ........................................... initial begin //е¤ЌдЅЌ&初始化 task_init; #200; task_m0_w(32'h0800_0011); task_m0_r(32'h0800_0011); #200; task_m0_w(32'h0800_0011); task_m0_r(32'h0800_0011); #200; task_m0_w(32'h1000_0011); task_m0_r(32'h1000_0011); #400; $stop; end механизм отлова ошибок генерится автоматом, если в системе более одного мастер интерфейса (слэйва) и явно не указано обратное ( C_RANGE_CHECK принудительно не установлен в 0). к тому же где то в глубинах корки: assign mi_awvalid = aa_mi_awtarget_hot & {C_NUM_MASTER_SLOTS+1{mi_awvalid_en}}; assign mi_awready_mux = |(aa_mi_awtarget_hot & mi_awready); assign M_AXI_AWVALID = mi_awvalid[0+:C_NUM_MASTER_SLOTS]; // Slot C_NUM_MASTER_SLOTS+1 is the error handler assign mi_awready[0+:C_NUM_MASTER_SLOTS] = M_AXI_AWREADY; assign sa_wm_awvalid = aa_mi_awtarget_hot & {C_NUM_MASTER_SLOTS+1{sa_wm_awvalid_en}}; assign sa_wm_awready_mux = |(aa_mi_awtarget_hot & sa_wm_awready); ------------------------------------------------------------------------------------------------------------ за наводку на хилинховые мастера-слэфвы спасибо. сначала хотел по-хорошему взять уже имеющиеся наши модули, но потом плюнул на их подгонку и взял рыбу с гитхаба :)
  12. Моделирую данную айпишку. Настройки по минимуму - в режиме SAMD, без буферов, фифошек, регистров, разных регионов, итд итп. В конфигурации 2 мастера/4 слэйва. Один из слэйвов с переходом на акси лайт. Пока столкнулся с 2 моментами: 1. После начального сброса RREADY внутри кроссбара на мастер интерфейсе (к слэйвам) устанавливается в единицу. При этом на слэйв интерфейсах (со стороны мастеров) этот сигнал стоит в нуле, как и задается в модели. В процессе работы рэдик к слэйву все время стоит в единице, хотя мастер держит его в нуле и поднимает только на момент чтения 2. Зависает запись при обращении к следующему слэйву. В тестбенче последовательно идут циклы записи/чтения от каждого мастера к каждому слэйву. При этом последовательное обращение к одному и тому же слэйву проходит без сбоев. Как только меняется адрес - в интерконнект приходит адрес с валидом, из интреконнекта валид к слэйвам не выходит. При этом все адреса верные и ошибок декодирования нет собственно - кто виноват и что делать? ковырять на модели ксайлинксовскую корку XBARa с его функциями и генерациями - желания нет от слова совсем... может кто уже сталкивался с подобными ситуациями? зы В первом случае ситуация, в принципе, соответствует протоколу (транзакция может начинаться с рэди-валидом на мастере/слэйве в любых комбинациях) и все выруливается при написании слэйва. Хоть и не хотелось бы подстраиваться под эту "вещь в себе" (интерконнект), а иметь возможность задавать все настрйоки самому. И чтобы ее поведение соответствовало задаваемым воздействиям... на скринах в общем случае должна быть видна ситуация с рэдиком со стороны мастера со стороны слэйва
  13. Помню что несколько лет назад натыкался на подобное обсуждение (может даже и сам его создавал :)), но через поиск его не нашел. Собственно задача - как при описании портов устройства автоматически сгенерить несколько экземпляров одного и того же интерфйеса, используя дженерик-параметр? Насколько помню старое обсуждение - на ВХДЛе этого нельзя было сделать. Ну кроме как объединить одноименные порты в одну шину и разделить потом на нижележащие устройства. Но такой вариант мне не подходит. А вот на верилоге что то подобное можно было провернуть... Но с верилогом пока знаком очень плохо и на скорую руку гугл ничего не подсказал. Поэтому буду благодарен за примеры :) зы если использовать интрефейсы в системверилоге, то как параметризировать объявление портов модуля на топ-лвл?
  14. не стыдно не знать. стыдно не знать и не спросить. гугл на скорую руку не ответил, старший товарищ дистанционно тоже не подсказал, а коллективное бессознательное помогло )) зы иногда натыкаюсь и на свои старые темы и на старые посты. иногда смешно, иногда вспоминаю - какие интересные штуки я когда то делал )))
  15. пипец, вчера 2 раза по всем настройкам прошелся... вот прям сверху вниз по всем вкладкам... удалить тему или пусть весит?