Jump to content

    

Darky777

Участник
  • Content Count

    52
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Darky777

  • Rank
    Участник
  • Birthday 07/07/1994

Информация

  • Город
    СПб

Recent Profile Visitors

802 profile views
  1. Для комбинационной логике при присваивании в always используется блокирующее присваивание (=). Для последовательной логики используется неблокирующее присваивание (<=). Задержку вы можете сделать какую захотите. Главное сообщить об этом при создании кастомной корки, чтобы PlatformDesigner реализовал контролер с этой задержкой
  2. always @(*) begin if (reset_n == 0) readdata <= 0; else if (chipselect && clk_en && (address[2:0] == 3'd2)) readdata <= {24'd0 | SPI_TO_NIOS[7:0]}; else if (chipselect && clk_en && (address[2:0] == 3'd3)) readdata <= {31'd0 | SPI_FINISH}; else readdata <= 0; end у вас и * в списке чувствительности у always и неблокирующее присваивание! Так какую логику работу вы закладывали, на последовательную или комбинационную? Судя по диаграмме которую вы представили синтезатор сделал комбинационную. Что это значит в вашем случае? Означает что данные на readdata выставится в тот же такт, что и chipselect, то есть с задержкой равной 0 тактов. кстати говоря, почему вы утверждаете что на чтение он не реагирует, вот же, я его отчетливо вижу, прямо перед записью). Есть такой параметр в шине авалон-мм называемый readLatency. почитайте про него. При создании кастомной корки вы его сами задаете. Задавать его следует в соответствии в вашими характеристиками модуля, тогда PlatformDesigner учтет ваши пожелания. Успехов!
  3. Забыл отписаться. Еще раз благодарю за помощь! Решил этот момент следующим образом. //... assign tmp_s = {buffer[8:4],tmp} >> (shift_size - 1); //... data_o <= tmp_s[5:0]; //...
  4. Спасибо за ответ! Я попробую.. Мне когда-то сказали, что оператор логического сдвига не всегда корректно интерпретируется синтезатором, поэтому если необходимо польоваться сдвигом, я использую конструкцию data <= {data[$bits(data) - 2:0],1'b0}; что думаете об этом?
  5. Приветствую! Многие кто пишет на SystemVerilog/Verilog знаком с оператором для динамического выбора нужных кусков вектора/переменной/массива_регистров. +: -: Больше часа ломал голову, как применить его в моем случае, может под вечер устал и не соображаю. Вот то, что мне нужен сделать (если бы стандарт верилога поддерживал такую запись для варьируемого индекса) data_o <= {buffer[4+shift_size-1:4],tmp[4:shift_size-1]}; Подскажите, пожалуйста, как описать такую конструкцию? ведь в ней варьируемая ширина вектора, а не фиксированная часть. Поддерживает ли верилог подобные штуки? Вот весь код. Сразу отвечаю, что пока не симулил, т.к. смысла нет (синтаксическая ошибка range must be bounded by constant expressions), и обычно планирую это делать следующим этапом, пока что я уперся в это. Если есть желающие, то прошу оставить обратную связь касательно кода. Буду рад любой аргументированной критике. Под Vivado 2018.2 module frame_aligner ( input clk_i , // Clock input arst_n , // Asynchronous reset active low input sync_i , input [3:0] data_i , output logic [5:0] data_o , output logic valid_o , // duty cycle = 2/3 output logic synced_o ); localparam SYNC_PATT = 12'b111111_000000; localparam SYNC_PATT_MR = ~SYNC_PATT; /*------------------------------------------------------------------------------ -- Functions ------------------------------------------------------------------------------*/ function automatic int unsigned clogb2_pure_f( input [31:0] value ); int unsigned i ; int unsigned temp ; begin temp = 32; for (i=31; i>0; i=i-1) begin if (2**i >= value) begin temp = i; end end return temp ; end endfunction function automatic logic [11:0] dynamic_shift_f ( input [11:0] data_i, input [clogb2_pure_f(12) - 1:0] ss); dynamic_shift_f = data_i; for (int i = 0; i < ss; i++) begin dynamic_shift_f = {dynamic_shift_f[0],dynamic_shift_f[11:1]}; end return dynamic_shift_f; endfunction /*------------------------------------------------------------------------------ -- Signals declaration ------------------------------------------------------------------------------*/ logic sync_ff,sync_fr,sync_cdc; typedef enum logic [1:0] { INIT, FIND_PATTERN, SYNC_MODE_SHIFT,SYNC_MODE_ZERO } fsm_t; fsm_t state, state_next; logic [ 1:0] cnt ; logic [11:0] buffer ; logic strb ; logic [11:0] shifted_data; logic [ 4:0] tmp ; logic match; logic [2:0] shift_size,shift_size_event; /*------------------------------------------------------------------------------ -- Clock Domain crossing ------------------------------------------------------------------------------*/ synchronize_ff #(.FF_CNT(3)) i_synchronize_ff (.clk_i(clk_i), .rstn_i(arst_n), .data_i(sync_i), .data_o(sync_cdc)); always_ff @(posedge clk_i or negedge arst_n) begin : proc_sync_ff if(~arst_n) begin sync_ff <= 0; end else begin sync_ff <= sync_cdc; end end assign sync_fr = !sync_ff && sync_cdc; /*------------------------------------------------------------------------------ -- Functional ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_cnt if(~arst_n) begin cnt <= 0; end else begin cnt <= cnt < 2 ? cnt + 1'b1 : '0; end end assign strb = cnt == 2; always_ff @(posedge clk_i or negedge arst_n) begin : proc_buffer if(~arst_n) begin buffer <= 0; end else begin buffer <= {data_i,buffer[7:4]}; end end always_ff @(posedge clk_i or negedge arst_n) begin : proc_shift_size if(~arst_n) begin shift_size <= 0; end else if ( strb ) begin if( state == FIND_PATTERN ) begin if( !match ) begin shift_size <= shift_size < 5 ? shift_size + 1'b1 : '0 ; end else begin shift_size <= shift_size < 5 ? shift_size + 1'b1 : '0 ; end end end end assign shift_size_event = ( shift_size != 0 ) ? ( 5 ) : ( shift_size - 1 ); always_ff @(posedge clk_i or negedge arst_n) begin : proc_shifted_data if(~arst_n) begin shifted_data <= 0; end else if (strb) begin shifted_data <= dynamic_shift_f(buffer,shift_size); end end assign match = ( shifted_data == SYNC_PATT ) || ( shifted_data == SYNC_PATT ); /*------------------------------------------------------------------------------ -- FSM ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_state if(~arst_n) begin state <= INIT; end else begin state <= state_next; end end always_comb begin : proc_state_next state_next = state; case (state) INIT : state_next = ( sync_fr ) ? ( FIND_PATTERN ): ( state ); FIND_PATTERN : state_next = ( match ) ? ((shift_size_event != 0 ) ? (SYNC_MODE_SHIFT) : (SYNC_MODE_ZERO)): ( state ) ; SYNC_MODE_SHIFT : state_next = state; SYNC_MODE_ZERO : state_next = state; default : state_next = INIT ; endcase end /*------------------------------------------------------------------------------ -- data to output ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_data_o if(~arst_n) begin data_o <= '0; valid_o <= 1'b0; tmp <= '0; end else begin case (state) SYNC_MODE_SHIFT : begin case (cnt) 1 : begin data_o <= {buffer[4+shift_size-1:4],tmp[4:shift_size-1]}; // ВОТ ТУТ! valid_o <= 1'b1; end 2 : begin data_o <= buffer[shift_size +:6]; tmp <= buffer[11:7]; valid_o <= 1'b1; end default : begin data_o <= data_o; valid_o <= 1'b0; end endcase end SYNC_MODE_ZERO : begin case (cnt) 1 : begin data_o <= buffer[7:2]; end 2 : begin data_o <= buffer[5:0]; end default : begin data_o <= data_o; valid_o <= 1'b0; end endcase end default : data_o <= data_o; endcase end end always_ff @(posedge clk_i or negedge arst_n) begin : proc_synced_o if(~arst_n) begin synced_o <= 1'b0; end else if ( match ) begin synced_o <= 1'b1; end end endmodule
  6. Я бы с радостью скинул будь еслиб он у меня был... Никогда не приходилось писать тестбенч целостного проекта с работающим на нем nios, да и нужно ли это делать? Мастером может быть кто угодно, в тестбенче это Avalon-MM BFM (bus functional model) cсылку я давал. С помощью него вы можете составить сценарий работы с вашим модулем вместе с остальными. Пример проекта там, кстати, есть. К тому же интуиция мне подсказывает, что запуск симуляции с ниосом будет проблематичнее, и сама процесс симуляции будет долгим.
  7. Я пишу ручками.. А такими инструментами не пользовался. Речь идет об использвании этого документа? Как-то раз я воспользовался им ради интереса, собрал тестовый проект. Оказался довольно полезным, однако приходилось ручками некоторые исходники подправлять, что было крайне неприятно.. https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_avalon_verification_ip.pdf Когда-то давно один умный и матерый программист сказал мне, что для чтения и записи у ниоса рекомендуется использовать ТОЛЬКО IOWR и IORD. На чем это основано - без понятия..
  8. С точки зрения ниоса эти сигналы не управлются вами, этим сигналом как и read, write, byteenable управляет шинный арбитр/контроллер шины (он генерируется Qsys, Sopcbuilder,Platform designer ) , в зависимости от того, в какое окно адреса вы попадете, например, если модуль gpio располжен на шине с адреса 0xF000 и заканчивает 0xF00F то если вы обращаетесь например по адресу 0xF004 , шинный арбитр за вас отправит ему все контрольные сигналы. если обратитесь по другому адресу, то арбитр отправит чипселекты и прочие другим модулям.
  9. IORD_32DIRECT(base, offset) IOWR_32DIRECT(base, offset, data) offset задаете побайтно.
  10. Благодарю за это пояснение. по какой-то причине казалось, что все ограничивается всего лишь 15мА
  11. Как я понимаю, сжечь ногу можно в таком случае: Представить ситуацию для примера. Ставим: 3 выхода row = zz1'b. 3 выxода col. = zz0'b Получаем большой ток, обе ноги выходят из строя. А что если 3 выхода row = zz1'b. 2 выxода col. = zzb и третий пин изменить на input?
  12. Был бы рад каким-либо пояснениям, ссылкам на мануалы, чтобы разобраться - почему.
  13. Приветствую, уважаемые форумчане! Занимаюсь домашними поделками. Возник вопрос с возможностью подключения. FPGA Cyclone IV соеденена к header разъему. Этому разъему я намерен подключить Светодиодную матрицу. 1057BS. Схема примерно такая: Резисторы конечно будут, чтобы не сжечь светодиоды. Собственно, дилетанский вопрос заключается в следующем: Можно ли в FPGA так сделать? если да, то каким образом следует конфигурировать пины, или может необходимо добавлять еще какой-либо элемент?
  14. Киньте, пожалуйста. Хотелось бы посмотреть.
  15. Благодарю! это именно то, что нужно. Это помогло мне найти вот этот док, который подробнее обо всем рассказывает. Ранее никогда на него не натыкался.