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

    

okela

Свой
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о okela

  • Звание
    Частый гость
  • День рождения 16.08.1963

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Украина, г. Одесса
  1. Разобрался с проблемой. Засада действительно была в коде проекта, имело место неявное ограничение количества модулей. Всем спасибо за обсужднение и советы.
  2. Цитата(jojo @ Nov 8 2017, 01:03) Пробовали свежую Vivado 2017.3? Ещё есть предположение - может быть ошибка в прокте. Искомые инстансы минимизировались САПРом за ненадобностью. Нет, свежак Vivado 2017.3 пока не пробовал. Буду смотреть код проекта под лупой ... Пока непонятно как так может работать оптимизация - по типу ограничителя.
  3. Всем доброго времени суток. Столкнулся с непонятной ситуацией при сбоке проекта в среде проектирования Vivado 2015.4. Собираю проект, включающий много инстансов модуля, использующего встроенные блоки памяти. Запускаю пока только синтез, все синтезируется без ошибок до определенного количества инстансов модуля. Как только превышаю это количество, то синтез по-прежнему собирается без ошибок, но инстансов модуля не добавляется, хотя всех ресурсов остается еще более 50%, блоков памяти остается неиспользованых - более 60%. Теряюсь в догадках ...
  4. Цитата(Сергей Борщ @ Sep 30 2016, 21:43) Пролейте и вы свет но то, какой у вас отладчик и какая среда разработки. Юзаю IAR+ST-LINK v2
  5. Цитата(Forger @ Sep 30 2016, 18:46) Попробуйте такую штуку: https://www.segger.com/systemview.html Для этого дела нужен J-LINK вроде бы, у меня его нет под руками.
  6. Цитата(Сергей Борщ @ Sep 30 2016, 09:39) Нужно искать причину сбоя, а не костыли городить. Для этого можно загнать процессор в состояние сбоя, подключить отладчик на всем скаку и посмотреть, куда его занесло. Может у вас BOOT0 в программе на ввод настроен и в воздухе болтается, набирает за счет наводок лог. единицу, при провале питания держит эту единицу за счет внутренней емкости вывода и при сбросе уносит вас во встроенный загрузчик. BOOT0 притянут к земле через резюк 10К. Пролейте, плиз, свет на то как подключить отладчик на всем скаку и посмотреть куда МК занесло. У меня никак не получается - отладчик не ругается, но все переменные недоступны.
  7. Цитата(Forger @ Sep 30 2016, 01:26) Странное там у вас распределение обязанностей - программист ищет косяки схемотехника, обращаясь на соотв. форуме, а что же делает схемотехник? На форумах программистов ищет косяки (если есть) в вашем софте? В простых устройствах обычно достаточно на вывод NRST повесить лишь один конденсатор 0.01мк (к GND разумеется), внешний резистор там не нужен (он есть внутри МК). Это увеличивает время импульса сброса МК, пока питание не стабилизируется. А в ответственных девайсах, как тут уже заметили, нужен внешний супервизор, особенно, если питание Vdd нарастает слишком медленно. Так что зовите сюда вашего схемотехника, пусть он решает эту проблему 8) Да я и сам вобщем-то и схемотехник и программист и паяльником пользоваться умею, но данное конкретное устройство попало ко мне уже готовым. Почитал все ответы, но прояснения пока так и не наступило... Дополнительно к описанной ситуации есть еще такое наблюдение: если на вход питания устройства повесить большую емкость (2000 мкФ) и не вешать кондер на сброс, то в этом случае тоже все работает нормально.
  8. Цитата(shreck @ May 5 2015, 05:01) Упомяну такую вещь как скорость нарастания напряжения питания. Для некоторых контроллеров (stm32f103 например) - по барабану, запустится всегда. А для других контроллеров (stm32f207) этот параметр требуется выдерживать более жестко. Была у меня платка от терраэлектроники на этом проце, которая, из-за неудачного стабилизатора, запускалась через раз. При этом использовался старый линейный лабораторный источник питания. А вот если использовал хороший импульсный, то плата стартовала всегда. Цитата(adnega @ May 5 2015, 09:41) Зависающая программа ваша? Исходники есть? В исходниках функции SWD не заблокированы? Если SWD не заблокирован, то можно на лету подключиться к зависшей программе (без передергивания по RESET). Так можно узнать адрес цикла, где все висит для дальнейшего анализа. Предварительно неплохо бы получить листинг программы. День добрый всем ! Попробую освежить эту тему... У меня с кристаллом STM32F042 наблюдается весьма странная картина при запуске устройства: супервизора сброса на схеме нет, вход сброса только подтянут к VCC и есть кнопка сброса, между входом питания и МК есть LDO-стабилизатор 3.3В. Схему не я разрабатывал, я пишу только программу устройства, поэтому прошу ногами не пинать за схемотехнику.... При запуске с отладчика SWD или после нажатия на сброс - все работает как надо, при подключенном к блоку питания устройстве и включении БП штатным тумблером - тоже все запускается и нормально функционирует... Но, если я выдергиваю штекер включенного блока питания и снова вставляю, то устройство вроде бы и запускается, но не все работает нормально при этом - возникает затык программы при приеме данных с UART (через прерывание). Отследить этот момент в отладчике не могу, т.к. отладчик на лету не подхватывается (не совсем понял про блокировку SWD из предыдущего поста...), а при запусе не стартует вместе с устройством. Понимаю, что засада где-то кроется в формировании сброса внутри кристалла узлом POR и вероятно имеет место короткое время нарастания напряжения питания, поэтому повесив на вход сброса электролит 47мкФ (22мкФ оказалось мало), добился вобщем положительного результата, но неясности и ощущение костыля без гипса при поломанной ноге все равно остались ...
  9. Вроде все встало на свои места. Во-первых, увеличил интервал сброса до 200 нс, во-вторых, сделал смещение адреса чтения относительно адреса записи. Всем спасибо за подсказки !
  10. iosifk, спасибо за информацию. Я, признаться, даже не подумал в этом направлении копнуть...
  11. Всем доброго дня. Начал осваивать ПЛИСины от Хилых, конкретно - Artix7. Пока идет процесс набивания шишек ... Делаю модуль для приема видео-данных, который должен принимать построчно кадр информации. Входной интерфейс для модуля - AXI-Stream (8-bit), выходной интерфейс - AXI-Stream (32-bit) объединяет данные для четырех строк. Внутри использую инстанс BRAM36K в двухпортовом режиме, т.к. новая строка данных будет приниматься модулем, а ранее полученные должны при этом обрабатываться. Не возьму пока в толк что происходит в памяти: вроде бы и записываются данные, но со чтением какая-то лажа выходит... На вход модуля в симуляторе подаю тестовый повторяющийся набор данных. С момента времени 117,6 нс симулятор начинает сыпать сообщения о коллизиях обращения к памяти. CODE`timescale 1ns / 1ps /**************************************************** * AXI4-Stream <=> BRAM 1024*32 ***************************************************/ module read_line # ( parameter LINE_SIZE = 1024, parameter ADDR_WIDTH = 10, parameter OUT_DATA_WIDTH = 32, parameter IN_DATA_WIDTH = 8 ) ( input wire clk, input wire rst, // AXI input-side input wire[IN_DATA_WIDTH-1:0] in_axis_tdata, input wire in_axis_tvalid, output wire in_axis_tready, input wire in_axis_tlast, input wire in_axis_tuser, // AXI output-side output wire[OUT_DATA_WIDTH-1:0] out_axis_tdata, output wire out_axis_tvalid, input wire out_axis_tready, output wire out_axis_tlast, output wire out_axis_tuser, // test wires output reg[OUT_DATA_WIDTH-1:0] tst_wrData, output reg[IN_DATA_WIDTH-1:0] tst_rdData, output wire[3:0] tst_weA, output wire tst_writeRg, output wire tst_readRg ); //*************************************************************************** // Wire declarations //*************************************************************************** reg [ADDR_WIDTH:0] wr_ptr_reg = {ADDR_WIDTH+1{1'b0}}, wr_ptr_next; reg [ADDR_WIDTH:0] rd_ptr_reg = {ADDR_WIDTH+1{1'b0}}, rd_ptr_next; reg [31:0] in_mem_data = 32'h00000000; wire [31:0] out_mem_data, DOA; reg [1:0] numLine = 2'b00; reg [OUT_DATA_WIDTH-1:0] out_axis_tdata_reg = {OUT_DATA_WIDTH{1'b0}}; reg out_axis_tvalid_reg = 1'b0, out_axis_tvalid_next; reg in_axis_tlast_reg = 1'b0; reg in_axis_tuser_reg = 1'b0; reg out_axis_tlast_reg = 1'b0; reg out_axis_tuser_reg = 1'b0; // full = 1 when first MSB different but rest same wire full = ((wr_ptr_reg[ADDR_WIDTH] != rd_ptr_reg[ADDR_WIDTH]) && (wr_ptr_reg[ADDR_WIDTH-1:0] == rd_ptr_reg[ADDR_WIDTH-1:0])); // empty = 1 when pointers match exactly wire empty = wr_ptr_reg == rd_ptr_reg; // control signals reg write; reg read; wire [3:0] weA = write << numLine; //*************************************************************************** // Code //*************************************************************************** // ========================= other modules instances ====================== // BRAM_TDP_MACRO: True Dual Port RAM // Artix-7 // Xilinx HDL Language Template, version 2015.4 ////////////////////////////////////////////////////////////////////////// // DATA_WIDTH_A/B | BRAM_SIZE | RAM Depth | ADDRA/B Width | WEA/B Width // // ===============|===========|===========|===============|=============// // 19-36 | "36Kb" | 1024 | 10-bit | 4-bit // // 10-18 | "36Kb" | 2048 | 11-bit | 2-bit // // 10-18 | "18Kb" | 1024 | 10-bit | 2-bit // // 5-9 | "36Kb" | 4096 | 12-bit | 1-bit // // 5-9 | "18Kb" | 2048 | 11-bit | 1-bit // // 3-4 | "36Kb" | 8192 | 13-bit | 1-bit // // 3-4 | "18Kb" | 4096 | 12-bit | 1-bit // // 2 | "36Kb" | 16384 | 14-bit | 1-bit // // 2 | "18Kb" | 8192 | 13-bit | 1-bit // // 1 | "36Kb" | 32768 | 15-bit | 1-bit // // 1 | "18Kb" | 16384 | 14-bit | 1-bit // ////////////////////////////////////////////////////////////////////////// BRAM_TDP_MACRO #( .BRAM_SIZE("36Kb"), // Target BRAM: "18Kb" or "36Kb" .DEVICE("7SERIES"), // Target device: "7SERIES" .DOA_REG(0), // Optional port A output register (0 or 1) .DOB_REG(0), // Optional port B output register (0 or 1) .INIT_A(36'h00000000), // Initial values on port A output port .INIT_B(36'h00000000), // Initial values on port B output port .INIT_FILE ("bram_init.vh"), .READ_WIDTH_A (32), // Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb") .READ_WIDTH_B (32), // Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb") .SIM_COLLISION_CHECK ("ALL"), // Collision check enable "ALL", "WARNING_ONLY", // "GENERATE_X_ONLY" or "NONE" .SRVAL_A(36'h00000000), // Set/Reset value for port A output .SRVAL_B(36'h00000000), // Set/Reset value for port B output .WRITE_MODE_A("WRITE_FIRST"), // "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" .WRITE_MODE_B("WRITE_FIRST"), // "WRITE_FIRST", "READ_FIRST", or "NO_CHANGE" .WRITE_WIDTH_A(32), // Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb") .WRITE_WIDTH_B(32) // Valid values are 1-36 (19-36 only valid when BRAM_SIZE="36Kb") //`include "bram_init.vh" ) BRAM_TDP_inst0 ( .DOA(DOA), // Output port-A data, width defined by READ_WIDTH_A parameter .DOB(out_mem_data), // Output port-B data, width defined by READ_WIDTH_B parameter .ADDRA(wr_ptr_reg[ADDR_WIDTH-1:0]), // Input port-A address, width defined by Port A depth .ADDRB(rd_ptr_reg[ADDR_WIDTH-1:0]), // Input port-B address, width defined by Port B depth .CLKA(clk), // 1-bit input port-A clock .CLKB(!clk), // 1-bit input port-B clock .DIA(in_mem_data), // Input port-A data, width defined by WRITE_WIDTH_A parameter .DIB(8'b00000000), // Input port-B data, width defined by WRITE_WIDTH_B parameter .ENA(1'b1), // 1-bit input port-A enable .ENB(1'b1), // 1-bit input port-B enable .REGCEA(1'b0), // 1-bit input port-A output register enable .REGCEB(1'b0), // 1-bit input port-B output register enable .RSTA(rst), // 1-bit input port-A reset .RSTB(rst), // 1-bit input port-B reset .WEA(weA), // Input port-A write enable, width defined by Port A depth .WEB(1'b0) // Input port-B write enable, width defined by Port B depth ); // End of BRAM_TDP_MACRO_inst instantiation assign in_axis_tready = ~full; assign out_axis_tdata = out_axis_tdata_reg; assign out_axis_tvalid = out_axis_tvalid_reg; assign out_axis_tlast = out_axis_tlast_reg; assign out_axis_tuser = out_axis_tuser_reg; assign tst_weA = weA; assign tst_readRg = read; assign tst_writeRg = write; // ============== Write logic ================ always @* begin write = 1'b0; wr_ptr_next = wr_ptr_reg; case (numLine) 2'b00 : begin in_mem_data = {in_mem_data[31:24], in_mem_data[23:16], in_mem_data[15:8], in_axis_tdata}; end 2'b01 : begin in_mem_data = {in_mem_data[31:24], in_mem_data[23:16], in_axis_tdata, in_mem_data[7:0]}; end 2'b10 : begin in_mem_data = {in_mem_data[31:24], in_axis_tdata, in_mem_data[15:8], in_mem_data[7:0]}; end 2'b11 : begin in_mem_data = {in_axis_tdata, in_mem_data[23:16], in_mem_data[15:8], in_mem_data[7:0]}; end default: begin in_mem_data = 32'h00000000; end endcase if (in_axis_tvalid) begin // input data valid if (~full) begin // not full, perform write write = 1'b1; wr_ptr_next = wr_ptr_reg + 1; end else numLine = numLine + 1; // line full --> next line number (0..3) end end always @(posedge clk) begin if (rst) begin wr_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; // reset wr_ptr_reg end else begin wr_ptr_reg <= wr_ptr_next; // update value wr_ptr_reg end if (write) begin in_axis_tlast_reg <= in_axis_tlast; in_axis_tuser_reg <= in_axis_tuser; tst_wrData <= in_mem_data; end end // ============== Read logic ================ always @* begin read = 1'b0; rd_ptr_next = rd_ptr_reg; out_axis_tvalid_next = out_axis_tvalid_reg; if (out_axis_tready | ~out_axis_tvalid) begin // output data not valid OR currently being transferred if (~empty) begin // not empty, perform read read = 1'b1; out_axis_tvalid_next = 1'b1; rd_ptr_next = rd_ptr_reg + 1; end else out_axis_tvalid_next = 1'b0; end end always @(posedge clk) begin if (rst) begin rd_ptr_reg <= {ADDR_WIDTH+1{1'b0}}; out_axis_tvalid_reg <= 1'b0; end else begin rd_ptr_reg <= rd_ptr_next; // update value rd_ptr_reg out_axis_tvalid_reg <= out_axis_tvalid_next; end if (read) begin out_axis_tlast_reg <= in_axis_tlast_reg; out_axis_tuser_reg <= in_axis_tuser_reg; tst_rdData <= out_mem_data; end end endmodule Знатоки, плиз хелп ме !!! Третий день бьюсь башкой об стену...
  12. Попробовал оставить в цепочки только МАХ и один Циклон. Выбрал 20 клоков и подал на вход команду 0х00001, получил на выходе цепочки 0х55555 и по-прежнему никаких изменений на выходе nSTATUS. Сигналы nSTATUS и CONF_DONE имеют общие подтяжки на все чипы, т.к. основная схема конфигурации предполагалась FPP. Теперь вижу, что нужно было предусмотреть какие-то перемычки с индивидуальными подтяжками для этих сигналов...
  13. Вот результат выполнения команды PULSE_NCONFIG: Сигнал nSTATUS никак не реагирует.
  14. jks, спасибо за наводку. Попробую этим воспользоваться. Только пока не понял как квартусовскому (речь ведь о нем ?) отладчику JTAG скормить команду PULSE_NCONFIG = 10'b00_0000_0001. Там какбэ определенный набор команд используется и других никак не вставишь ...
  15. Цитата(doom13 @ Jul 4 2014, 01:18) Согласно схеме FPP он ещё и на MAX II идёт, или у Вас как-то по-другому? Нет - MAX II у меня для других целей используется, а схема загрузки в режиме FPP будет через дополнительный контроллер.