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

BSACPLD

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    4

Весь контент BSACPLD


  1. В том же AXI4-Stream нет ничего емкого в плане ресурсов. Вот пример подключения "классического" FIFO на AXI4-Stream: module axi4s_fifo #( parameter SIZE = 512, parameter WIDTH = 8, parameter TID_WIDTH = 0, parameter NUM_SYNC = 3, parameter RST_TYPE = "ASYNC", // "ASYNC", // "SYNC_SLAVE", // "SYNC_MASTER" parameter SIM_INIT = "FALSE" // "TRUE", // "FALSE" ) ( // Reset input axis_aresetn, // AXI4-Stream (video input) input s_axis_aclk, input s_axis_tvalid, output s_axis_tready, input [WIDTH-1:0] s_axis_tdata, input [TID_WIDTH-1:0] s_axis_tid, input s_axis_tuser, // start of frame input s_axis_tlast, // end of line // AXI4-Stream (video output) input m_axis_aclk, output m_axis_tvalid, input m_axis_tready, output [WIDTH-1:0] m_axis_tdata, output [TID_WIDTH-1:0] m_axis_tid, output m_axis_tuser, // start of frame output m_axis_tlast // end of line ) ; reg reset_n ; wire [(WIDTH+TID_WIDTH+1+1)-1:0] s_axis_d ; wire wrfull ; wire [(WIDTH+TID_WIDTH+1+1)-1:0] m_axis_q ; wire rdempty ; initial begin if (SIM_INIT == "TRUE") begin #0.01 ; if (RST_TYPE != "ASYNC") reset_n <= 1'b0 ; end end generate if (RST_TYPE == "ASYNC") begin always @* begin reset_n = axis_aresetn ; end end else if (RST_TYPE == "SYNC_SLAVE") begin always @(posedge s_axis_aclk) begin reset_n <= axis_aresetn ; end end else if (RST_TYPE == "SYNC_MASTER") begin always @(posedge m_axis_aclk) begin reset_n <= axis_aresetn ; end end endgenerate generate if (TID_WIDTH > 0) begin assign s_axis_d = {s_axis_tuser, s_axis_tlast, s_axis_tid, s_axis_tdata} ; end else begin assign s_axis_d = {s_axis_tuser, s_axis_tlast, s_axis_tdata} ; end endgenerate d_c_fifo #( .DATA_WIDTH (WIDTH+TID_WIDTH+1+1), .Q_WIDTH (WIDTH+TID_WIDTH+1+1), .DATA_SIZE (SIZE), .NUM_SYNC (NUM_SYNC), .SIM_INIT (SIM_INIT) ) d_c_fifo_0 ( .reset (~reset_n), .data (s_axis_d), .wrreq (s_axis_tvalid & s_axis_tready), .wrclk (s_axis_aclk), .rdreq (m_axis_tvalid & m_axis_tready), .rdclk (m_axis_aclk), .q (m_axis_q), .wrempty (), .wrfull (wrfull), .rdempty (rdempty), .rdfull () ) ; generate if (TID_WIDTH > 0) begin assign {m_axis_tuser, m_axis_tlast, m_axis_tid, m_axis_tdata} = m_axis_q ; end else begin assign {m_axis_tuser, m_axis_tlast, m_axis_tdata} = m_axis_q ; end endgenerate assign s_axis_tready = ~wrfull ; assign m_axis_tvalid = ~rdempty ; endmodule Как видите, это всего лишь переименование сигналов с небольшим количеством логики.
  2. Было бы хорошо если бы Gowin в своих ядрах перешли на стандартные шины типа AXI4-Stream / AXI4, а не "куча проводов" как сейчас :)
  3. И частоту еще бы раза в 2 поднять :) И GTX хотя бы 8 каналов :)
  4. По частотам не потянет. Для того чтобы кодек успевал сжимать 1080p 30 fps на лету нужно 125+ МГц. 2 банка по 16 строк перед самим кодеком. В один пишем, второй кормим кодеку. 2048*16*2 = 65536 байт - Y. 2048/2*16 = 16384 байт - Cb. 2048/2*16 = 16384 байт - Cr. Итого 98303 байт. И в самом кодеке тоже память расходуется. И еще не забывайте про таблицы гамма-коррекции. Для 12 бит получаем 2^12*3 = 12288 байт. UPD. Щас посмотрел в проекте - кодек с 2 банками буфера занимает 28.5 BRAM. Подсистема ИО - 21 BRAM. Image Signal Processor - 11.5 BRAM. Итого: 61 BRAM.
  5. Из закромов :) AXI Interconnect, процессор и I2C с GitHub. Остальное, включая информационный обмен и Image Signal Processor сам с нуля.
  6. Что имеется ввиду под контроллером? Обработка сырого видео с матрицы и сжатие в MJPEG? В XC7A50T с трудом умещается 1080p 29.97 fps с MJPEG через Ethernet. Главный ресурс это память для того же кодека. И если матрица Rolling Shutter, обязательно наличие внешней памяти для буферизации кадра - чем быстрее считываем матрицу, тем меньше эффект размытия на движущихся объектах. P.S. Разработка такой штуки вещь не простая - проще и дешевле заказать готовую камеру.
  7. Продавец прислал схему. Нарисовано ужасно, но вроде можно понять что к чему подключается...
  8. Продавец вроде как обещает выслать схему по запросу. Попробую сначала схему запросить.
  9. Есть такая плата по очень заманчивой цене: https://m.aliexpress.ru/item/1005001275162791.html?spm=a2g0n.detail.0.0.f8f826ccFLRr7F&gps-id=platformRecommendH5&scm=1007.18499.177237.0&scm_id=1007.18499.177237.0&scm-url=1007.18499.177237.0&pvid=6eaa6369-882a-449d-badb-fa98463e51e5&_t=gps-id%3AplatformRecommendH5%2Cscm-url%3A1007.18499.177237.0%2Cpvid%3A6eaa6369-882a-449d-badb-fa98463e51e5%2Ctpp_buckets%3A8499%230%23177237%230_8499%234696%2321885%233_21387%230%23233228%2310&browser_id=d4a260afa73c491286e9c2394fba593d&aff_trace_key=e1e29339c89b4e26a790df39acb3cc15-1634254267550-06450-_9wFhox&aff_platform=msite&m_page_id=ehf2f3i8piycadvx17d1490f4e97a5e09074b4468a&gclid=&_imgsrc_=ae01.alicdn.com%2Fkf%2FH2cb82df54dd04d18893b0ecc60f2ee7fX.jpg_640x640Q90.jpg_.webp Стоит ли заказывать или 100% за такие деньги будет не рабочий чип? До этого брал отладки от Alinx и QMTECH - проблем не было. А тут Kintex по смешной цене... Это и смущает...
  10. Не уверен. На скриншоте написано failed. Я собственно уже разобрался. Оказалось, что ECO Editor некорректно работает с BRAM с Byte Enable. Поскольку у меня не предполагается байтовая запись для памяти программ, я просто заменил BRAM на вариант без Byte Enable и все стало нормально обновляться. В итоге получилось вот так: pmi_ram_dq #( .pmi_addr_width ($clog2(DATA_SIZE)), .pmi_addr_depth (DATA_SIZE), .pmi_data_width (DATA_WIDTH), .pmi_regmode ("reg"), .pmi_gsr ("disable"), .pmi_resetmode ("async"), .pmi_optimization ("speed"), .pmi_init_file (INIT_FILE), .pmi_init_file_format ("hex"), .pmi_write_mode ("normal"), .pmi_family (DEVICE_FAMILY) ) program_ram ( .Reset (1'b0), .Clock (clock), .ClockEn (1'b1), .Address (address), .Data (data), .WE (wren), .Q (q) ) ; При этом формат *.mem файла представляет из себя обычный набор чисел в HEX формате: F01001B7 63618193 F0102137 C7010113 179060EF 00050463 061060EF 00000513 7B5050EF 16D060EF 0000006F 4ED002EF FD010113 00060413 00068493 00050F13 00058F93 ...
  11. Пробовал создавать в mem-редакторе bin и hex, 32 бит и 36 бит шириной - результат один. "Update memory initialization failed". Можете выложить пример *.mem файла для MICO32 и пример включения BRAM? У меня есть подозрение, что я как-то не так подключаю BRAM. В проекте ширина шины 32 бита, а в ECO Editor отображается 36 бит. pmi_ram_dq_be #( .pmi_addr_width ($clog2(DATA_SIZE)), .pmi_addr_depth (DATA_SIZE), .pmi_data_width (DATA_WIDTH), .pmi_regmode ("reg"), .pmi_gsr ("disable"), .pmi_resetmode ("async"), .pmi_optimization ("speed"), .pmi_init_file (INIT_FILE), .pmi_init_file_format ("hex"), .pmi_write_mode ("normal"), .pmi_family (DEVICE_FAMILY), .pmi_byte_size (8) ) program_ram ( .Reset (1'b0), .Clock (clock), .ClockEn (1'b1), .Address (address), .ByteEn ({(DATA_WIDTH/8){1'b1}}), .Data (data), .WE (wren), .Q (q) ) ;
  12. Попробовал тот же самый файл инициализации, который использовал для изначальной инициализации pmi_ram_dq_be - пишет ошибку "Update memory initialization failed".
  13. Понемногу начал изучать Lattice. Сделал проект на ECP5 в котором блочная память используется для хранения памяти программ RISC-V. Вопрос можно ли как-то обновлять содержимое блочной памяти не пересобирая весь проект целиком? Может быть есть что-то типа утилиты updatemem как в Vivado?
  14. Эта штука сейчас чисто поиграться/отладить прошивку в ПЛИС. Потом все равно будет другая матрица. Так что действительно нет смысла подписывать.
  15. Datasheet и AppNote есть, но там "пишите нам, мы вам не ответим" (Contact OmniVision local FAE). Что касается исходников для Linux и Arduino, там есть только варианты настройки под RGB, YUV и JPEG. Я тоже :(
  16. Коллеги, кто-нибудь пытался запустить OV2640 в RAW (Bayer) режиме? К сожалению, ни в datasheet, ни в application note эта процедура никак не описана, не говоря уже о большей части регистров без инициализации которых эта штура даже клок не выдает :(
  17. Скачал тестовый проект с сайта INTEL - те же симптомы. ltssmstate[4:0] = 5'h02 (00010: Polling.Active) currentspeed[1:0] = 2'h1 (2b’01: Gen1) lane_act[3:0] = 4'h0
  18. Посмотрел схему. Клок для PCIe идёт прямо с разъёма :(
  19. Грузится пока без драйвера. Проверяю наличие через lspci. Материнка MSI Z270. Процессор 7700K. Слаков нет. Кроме того я использую Hard IP. Прошивка грузится из FLASH через FPP. Насчёт своих 100МГц надо посмотреть, можно ли их подцепить к Hard IP на данной плате...
  20. Есть 3 компьютера. На одном плата стабильно определяется, но при установленной плате компьютер очень долго загружается. На двух других компьютерах плата определяется только после перезагрузки (с первого включения не определяется) и только если она установлена в слот x16 предназначенный для видеокарты. Во всех других слотах плата вообще не определяется. Подскажите, пожалуйста, в чем может быть проблема.
  21. 1) А это разве не ожидание? while ((I2C1->SR1 & I2C_SR1_SB) == 0) ; 2) А это не проверка флага ADDR? while (true) { uint16_t SR1 = I2C1->SR1 ; if (SR1 & I2C_SR1_AF) { I2C1->SR1 &= ~I2C_SR1_AF ; stop_I2C () ; return false ; } if (SR1 & I2C_SR1_ADDR) { (void) I2C1->SR2 ; break ; } 3) Либо через флаг BTF. if (SR1 & I2C_SR1_BTF) { break ; } 4) А разве я делаю по другому? while ((I2C1->SR1 & I2C_SR1_RXNE) == 0) ; return I2C1->DR ; Вообще я уже нашел как обойти глюк с лишним байтом. Запись флага STOP в CR1 нужно делать ДО окончания приема последнего байта, а не после.
  22. Коллеги, помогите, пожалуйста, понять в чем проблема. Читаю данные из EEPROM 24XX64. При чтении последнего байта выдаю NACK. После этого STOP. Все читается как надо, только меня смущает наличие лишней транзакции чтения после чтения последнего байта (тоже с NACK). Вот код и скриншот из лог. анализатора. Работа с I2C: // control_i2c.c #include <stm32f10x.h> #include <stm32f10x_i2c.h> #include <stdint.h> #include <stdbool.h> #include "main.h" #include "system.h" #include "control_i2c.h" //--------------------------------------------------------------------------- void I2C_INIT (void) { // Настройка I2C I2C1->CR2 = (CPU_CLOCK_HZ / 2) / 1000000 ; I2C1->CCR = I2C_CCR_FS | I2C_CCR_DUTY | 4 ; I2C1->TRISE = 12 ; // Включение I2C I2C1->CR1 = I2C_CR1_PE ; } //--------------------------------------------------------------------------- void start_I2C (void) { I2C1->CR1 |= I2C_CR1_START ; while ((I2C1->SR1 & I2C_SR1_SB) == 0) ; } //--------------------------------------------------------------------------- void stop_I2C (void) { I2C1->CR1 |= I2C_CR1_STOP ; while ((I2C1->SR2 & I2C_SR2_BUSY) == 0) ; } //--------------------------------------------------------------------------- bool write_byte_I2C (uint8_t data) { I2C1->DR = data ; while (true) { uint16_t SR1 = I2C1->SR1 ; if (SR1 & I2C_SR1_AF) { I2C1->SR1 &= ~I2C_SR1_AF ; stop_I2C () ; return false ; } if (SR1 & I2C_SR1_ADDR) { (void) I2C1->SR2 ; break ; } if (SR1 & I2C_SR1_BTF) { break ; } } return true ; } //--------------------------------------------------------------------------- uint8_t read_byte_I2C (bool ack) { if (ack) I2C1->CR1 |= I2C_CR1_ACK ; else I2C1->CR1 &= ~I2C_CR1_ACK ; while ((I2C1->SR1 & I2C_SR1_RXNE) == 0) ; return I2C1->DR ; } //--------------------------------------------------------------------------- Работа с EEPROM: bool ReadFlashMM (uint8_t n_mm, uint16_t address, uint8_t* data, uint16_t size) { uint8_t chip_a = MM_FLASH_I2C_ADDR + (n_mm << 1) ; // S start_I2C () ; // AD+W if (!write_byte_I2C(chip_a)) return false ; // MA H if (!write_byte_I2C(HIBYTE(address))) return false ; // MA L if (!write_byte_I2C(LOBYTE(address))) return false ; // S start_I2C () ; // AD+R if (!write_byte_I2C(chip_a | 0x01)) return false ; for (uint16_t i=0 ; i<size ; i++) { // DATA if (i == (size-1)) data[i] = read_byte_I2C (false) ; else data[i] = read_byte_I2C (true) ; } // P stop_I2C () ; return true ; } Скриншот из лог. анализатора:
  23. Сколько стоит STM32 и сколько FPGA? https://efind.ru/offer/STM32F103 https://efind.ru/offer/10M25 Разница в десять раз! Любой коммерческий проект требует минимальной себестоимости изделия.
  24. Это Вам нужно уточнить у StewartLittle У меня есть цены только за 1 шт. Лучше запросите у него - не знаю, можно ли в открытую публиковать здесь цены...
  25. SAE - есть возможность инициализации RAM из flash. SCE - нет возможности инициализации RAM, соответственно модуль перекачивающий данные из flash в RAM придется писать самостоятельно, что тоже съест часть ресурсов. А сами чипы в 4-5 раз дешевле аналогичных от Intel. Ничто не мешает сделать плату самостоятельно, а не покупать готовую :) Я как раз заказываю себе несколько штук GW2AR-18 чтобы попробовать перевести на них один из своих проектов. На отладочной плате наигрался, теперь буду пробовать делать свои платы. Так сказать от теории перехожу к практике. У Intel и Xilinx регистрация также обязательна когда дело доходит до скачивания среды разработки. GW2A18, GW1NR9.
×
×
  • Создать...