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

Worldmaster

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Местный
    Местный
  • День рождения 11.08.1985

Старые поля

  • skype
    Array

Контакты

  • Skype
    Array

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Я не понял. Можно более внятно разъяснить в чём я не прав?
  2. поэтому я и прошу подсказать как решить конкретную задачку причем на самых простых процессах которые не завязаны нигде в коде. И имеют всего 2 разных тактирования. Как и где? Если вы про констрейны то там эти клоки описаны. Как уже писалось выше это простой счетчик. Код в приложении потому что там очень уж много всего. Код может и дикий но он отлажен и работает. и это i2c и огромных скоростей там не требуется. I2C.vhd
  3. А можете подсказать на конкретном примере? Вот есть кусок кода: Ко команде с компа я включаю светодиод и выключаю. Что можно сделать чтобы устранить ошибку именно тут? Именно счетчик и есть. И что нужно сделать в коде чтобы поправить холд?
  4. Это частота байт. Камера имеет разрешение 560*560 и частоту кадров 360 fps. в формате 10бит на пиксель. 560 * 560 * 10 = 3 136 000 бит на кадр. 3 136 000 * 360 = 1 128 960 000 бит в секунду. Есть 2 line: 1 128 960 000 / 2 = 564 480 000 бит в секунду на line. До есть приходить на вход IP MIPI будут последовательные данные с частотой 564 480 000 бит в секунду. После десериализации получаем 70 560 000 байт в секунду. Но это немного не по теме. Это в темах по мипи обсуждалось. Тут то сейчас вопрос как линии поправить чтобы не было варнингов в ИДЕ. Пока сделал по такому совету. Вроде бы проблемы ушли но осталась проблемка с HOLD Что это значит также не очень понятно.
  5. В других темах обсуждали. Если верить даташиту то до 1200 можно.
  6. Да смотрел конечно. Но тут даже не в МИПИ дело. Вот пример выше там просто буфер в одном процессе заполняется в другом обрабатывается. Добавил синхронизирующий процесс. process (InClock_50) begin if rising_edge(InClock_50) then i2c_command_buffer_sync <= i2c_command_buffer; end if; end process; -- в конце цикла приемки проверим что там пришло cmd_chk_proc: process (InClock_50, FFT_OE_N, FFT_OE_D, i2c_dev_IsEnable, i2c_IsComplete, i2c_command_buffer_sync) type cmd_states is (idle, send_data); variable cmd_state: cmd_states := idle; variable cnt: integer := 0; variable ptr: integer := 0; begin if rising_edge(InClock_50) then case cmd_state is when idle => if i2c_dev_IsEnable = '1' and i2c_IsComplete = '1' then i2c_dev_IsEnable <= '0'; end if; if FFT_OE_N = '1' and FFT_OE_D = '0' then case i2c_command_buffer_sync(0) is when x"a1" => device_state <= command_mode; -- в каждом устрйостве i2c разместить фифо двухклоковый -- при получении данных фиксируем количество и переливаем их в модуль i2c -- затем запускаем обработку -- таким образом мы можм мередать для обработки любое количество байт подряд -- второй байт определяет номер шины i2c для отправки команды. -- гироскоп i2c_mode <= i2c_command_buffer_sync(1)(1 downto 0); i2c_dev_Device_addr <= i2c_command_buffer_sync(I2C_DEV_ADDR_BIT)(6 downto 0); i2c_dev_Reg_addr_HI <= i2c_command_buffer_sync(I2C_REG_ADDR_HI); i2c_dev_Reg_addr_LOW <= i2c_command_buffer_sync(I2C_REG_ADDR_LOW); i2c_dev_Reg_addr_16 <= i2c_command_buffer_sync(I2C_REG_ADDR16_BIT)(0); i2c_dev_DataCount <= i2c_command_buffer_sync(I2C_BYTES_COUNT_BIT); i2c_dev_Reg_RW <= i2c_command_buffer_sync(I2C_RW_BIT)(0); i2c_dev_WriteEn <= '0'; i2c_dev_ReadEn <= '0'; i2c_dev_IsEnable <= '0'; i2c_dev_ResetBuffers <= '1'; cnt := to_integer(unsigned(i2c_command_buffer_sync(I2C_BYTES_COUNT_BIT))); cmd_state := send_data; ptr := 0; when x"a2" => device_state <= command_mode; -- команда включения или отключения отладочного светодиода -- включим когда будет нормальная версия debug_led_drive <= i2c_command_buffer_sync(1)(0); when x"a3" => device_state <= camera_mode; icam_index <= i2c_command_buffer_sync(1)(0); -- команда переводит устройство в режим передачи кадров при каждом запросе на чтение when x"a4" => LaserOut_o <= i2c_command_buffer_sync(1)(0); when others => end case; end if; when send_data => if cnt > 0 then i2c_dev_ResetBuffers <= '0'; if i2c_dev_Reg_RW = WRITE then i2c_dev_WriteEn <= '1'; i2c_dev_WriteData <= i2c_command_buffer_sync(I2C_DATA_PTR_BIT + ptr); end if; ptr := ptr + 1; cnt := cnt - 1; else i2c_dev_ResetBuffers <= '1'; i2c_dev_IsEnable <= '1'; i2c_dev_WriteEn <= '0'; cmd_state := idle; end if; end case; end if; end process cmd_chk_proc; Но он все равно ругается на задержку.
  7. У меня не такой богатый опыт в этой штуке. Можете показать как это будет выглядеть на моем примере?? По какому принципу надо выставлять set_max_delay и как определить нужные линии? Вот допустим линия: Добавляю задержку. Но какое ставить число? В итоге чего бы не ставил то все равно ничего не меняется.
  8. А какие последствия? Ну а по сути мне бы кто нибудь простыми словами на примере показал в чем беда и я бы поправил. Вот например: Видим ошибку Вот два процесса где используется командный буфер. -- в конце цикла приемки проверим что там пришло cmd_chk_proc: process (InClock_50, FFT_OE_N) type cmd_states is (idle, send_data); variable cmd_state: cmd_states := idle; variable cnt: integer := 0; variable ptr: integer := 0; begin if rising_edge(InClock_50) then case cmd_state is when idle => if i2c_dev_IsEnable = '1' and i2c_IsComplete = '1' then i2c_dev_IsEnable <= '0'; end if; if FFT_OE_N = '1' and FFT_OE_D = '0' then case i2c_command_buffer(0) is when x"a1" => device_state <= command_mode; -- в каждом устрйостве i2c разместить фифо двухклоковый -- при получении данных фиксируем количество и переливаем их в модуль i2c -- затем запускаем обработку -- таким образом мы можм мередать для обработки любое количество байт подряд -- второй байт определяет номер шины i2c для отправки команды. -- гироскоп i2c_mode <= i2c_command_buffer(1)(1 downto 0); i2c_dev_Device_addr <= i2c_command_buffer(I2C_DEV_ADDR_BIT)(6 downto 0); i2c_dev_Reg_addr_HI <= i2c_command_buffer(I2C_REG_ADDR_HI); i2c_dev_Reg_addr_LOW <= i2c_command_buffer(I2C_REG_ADDR_LOW); i2c_dev_Reg_addr_16 <= i2c_command_buffer(I2C_REG_ADDR16_BIT)(0); i2c_dev_DataCount <= i2c_command_buffer(I2C_BYTES_COUNT_BIT); i2c_dev_Reg_RW <= i2c_command_buffer(I2C_RW_BIT)(0); i2c_dev_WriteEn <= '0'; i2c_dev_ReadEn <= '0'; i2c_dev_IsEnable <= '0'; i2c_dev_ResetBuffers <= '1'; cnt := to_integer(unsigned(i2c_command_buffer(I2C_BYTES_COUNT_BIT))); cmd_state := send_data; ptr := 0; when x"a2" => device_state <= command_mode; -- команда включения или отключения отладочного светодиода -- включим когда будет нормальная версия debug_led_drive <= i2c_command_buffer(1)(0); when x"a3" => device_state <= camera_mode; icam_index <= i2c_command_buffer(1)(0); -- команда переводит устройство в режим передачи кадров при каждом запросе на чтение when x"a4" => LaserOut_o <= i2c_command_buffer(1)(0); when others => end case; end if; when send_data => if cnt > 0 then i2c_dev_ResetBuffers <= '0'; if i2c_dev_Reg_RW = WRITE then i2c_dev_WriteEn <= '1'; i2c_dev_WriteData <= i2c_command_buffer(I2C_DATA_PTR_BIT + ptr); end if; ptr := ptr + 1; cnt := cnt - 1; else i2c_dev_ResetBuffers <= '1'; i2c_dev_IsEnable <= '1'; i2c_dev_WriteEn <= '0'; cmd_state := idle; end if; end case; end if; end process cmd_chk_proc; read_fft_proc: process (USB30_in_clk, FFT_rx_flag) variable read_ptr: integer :=0; variable counter: integer :=0; variable state: fft_io_states := idle; begin if rising_edge(USB30_in_clk) then if FFT_rx_flag = '0' then case state is when idle => i2c_command_buffer <= (others => (others => '0')); if counter >= 4 then state := oe_state; else counter := counter + 1; end if; when oe_state => FFT_OE_N <= '0'; state := rd_state; when rd_state => state := work_state; FFT_RD_N <= '0'; when work_state => if read_ptr < MAX_I2C_BUF_CNT then -- принимаем данные в командный буфер i2c_command_buffer(read_ptr) <= FFT_DATA_IN(7 downto 0); i2c_command_buffer(read_ptr+1) <= FFT_DATA_IN(15 downto 8); i2c_command_buffer(read_ptr+2) <= FFT_DATA_IN(23 downto 16); i2c_command_buffer(read_ptr+3) <= FFT_DATA_IN(31 downto 24); read_ptr := read_ptr + 4; else state := nop_state; end if; when others => FFT_RD_N <= '1'; FFT_OE_N <= '1'; end case; else counter := 0; state := idle; read_ptr := 0; FFT_RD_N <= '1'; FFT_OE_N <= '1'; end if; end if; end process read_fft_proc; Вот как конкретно тут исправить проблему?
  9. Так я и прошу чтобы показали где и что надо записать то? по мануалу вообще указано до 1200 на MIPI Lane. Мне надо 600. Я так понимаю что при сборке компилятор будет оптимизировать так чтобы добрать до этой частоты?
  10. Так у меня так и есть. Данные пишутся в FIFO с одним клоком а считываются с другим. И ничего само не прописывается. А можно предметно показать что сделать? Что то мне не совсем понятно. Как вот конкретно вот это утсранить? 2 -5.351 device_state_s0/Q SDRAM/RAM_ROW_ADDR_req_10_s0/CE InClock_50_net:[R] clk_160_clockout:[R] 1.250 2.316 4.216 где device_state это применяется в основом блоке от частоты InClock_50_net и вообще никак не связан с SDRAM. Тем более с линией RAM_ROW_ADDR_req. Это тактируется от clk_160_clockout = 160 мегагерц. Что конкретно изменить в коде то надо?
  11. ну тут скорее косяк в корке либо проблема что линии не азведены на GCLK. Весь код что можно было я переделал и частоты достигли до нужного уровня. Код мипи примитивен до нельзя. Из одной корки идет в другую корку в FIFO. iBuf_WriteData <= Cam1_Mipi_Data_Out1 & Cam1_Mipi_Data_Out0; -- выходы из корки MIPI объединяются и подаются на вход корки FIFO Тут просто нечего оптимизировать.
  12. Здравствуйте. Подскажите пожалуйста алгоритм правкеи вот этих проблем? Я так понял что нужно добавить констрейнт. Только мне не понятно какую линию надо брать из какого столбца?. Тут в некоторых строках указаны вообще внутренние сигналы. Подскажите пожалуйста как правильно это разрулить?
  13. Эти линии физически в другом банке. Перезавел и ошибка ушла. Только ничего визуально не изменилось от этого. Частоты также остались на низком уровне.
×
×
  • Создать...