Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба В 14.05.2024 в 19:13, Alex77 сказал: Мне так видится что ТС темнит - 50MHz идёт куда-то ещё и соответственно есть CDC 50 на 160 (аль на оборот). вот код модуля entity SDRAM_SERIALIZER is port ( rst_n : in std_logic; isdram_clk : in std_logic; isdrc_clk : in std_logic; RAMIsReady: out std_logic; in_write_clk: in std_logic; int_read_clk: in std_logic; cam1_data_ready: in std_logic; cam2_data_ready: in std_logic; cam_index: in std_logic; Buf_WriteData: in std_logic_vector(15 downto 0); Buf_ReadData: out std_logic_vector(31 downto 0); Buf_ReadAddr: in std_logic_vector(15 downto 0); Buf_Read_Valid: out std_logic; RAM_StartAddress: in std_logic_vector(19 downto 0); RAM_DataCount: in std_logic_vector(19 downto 0); SDRAMInitDone: out std_logic; cam_frame_reading: in std_logic; IO_sdram_dq: inout std_logic_vector(31 downto 0); O_sdram_clk: out std_logic; O_sdram_cke: out std_logic; O_sdram_cs_n: out std_logic; O_sdram_cas_n: out std_logic; O_sdram_ras_n: out std_logic; O_sdram_wen_n: out std_logic; O_sdram_dqm: out std_logic_vector(3 downto 0); O_sdram_addr: out std_logic_vector(10 downto 0); O_sdram_ba: out std_logic_vector(1 downto 0) ); end SDRAM_SERIALIZER; вот как он определяется в основном коде SDRAM: SDRAM_SERIALIZER port map( rst_n => sdram_rst_n, isdram_clk => clk_160_d22_mhz, isdrc_clk => clk_160mhz, RAMIsReady => Ram_IsReady, cam1_data_ready => Cam1_Mipi_Ready, cam2_data_ready => Cam2_Mipi_Ready, in_write_clk => Cam1_Mipi_Data_Read_Clk, int_read_clk => USB30_in_clk, cam_index => icam_index, Buf_WriteData => iBuf_WriteData, Buf_ReadData => iBuf_ReadData, Buf_ReadAddr => iBuf_ReadAddr, Buf_Read_Valid => iBuf_Read_Valid, RAM_StartAddress => iRAM_StartAddress, RAM_DataCount => iRAM_DataCount, cam_frame_reading => icam_frame_reading, SDRAMInitDone => iSDRAMInitDone, IO_sdram_dq => IO_sdram_dq, O_sdram_clk => O_sdram_clk, O_sdram_cke => O_sdram_cke, O_sdram_cs_n => O_sdram_cs_n, O_sdram_cas_n => O_sdram_cas_n, O_sdram_ras_n => O_sdram_ras_n, O_sdram_wen_n => O_sdram_wen_n, O_sdram_dqm => O_sdram_dqm, O_sdram_addr => O_sdram_addr, O_sdram_ba => O_sdram_ba ); InClock_50 только pll питает ну и модуль i2c clk160mhz: sdram_pll_clk port map ( clkout => clk_160mhz, lock => pll_lock_160, clkoutp => clk_160_d22_mhz, clkin => InClock_50 ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая · Жалоба icam_index - откуда берётся оный сигнал ? часом не из "модуль i2c " ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба В 15.05.2024 в 11:38, Alex77 сказал: icam_index - откуда берётся оный сигнал ? часом не из "модуль i2c " ? не. i2c работают сами по себе. а это просто индекс камеры. он пока всегда в 1. он присутсвует чтобы в будущем переключать систему на разные камеры. в общем покурлесил еще с разметкой на чипе и добаваил все таки частоты в эксклюзивные и получил все в лучшем виде. наверное можно считать что все работает. )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая · Жалоба ну так и " просто индекс камеры" есть выход триггера, который тактуется чем угодно но только не 160мгц. смотрите в rtl- просмотрщике откуда оно идёт. пс: а когда их будет больше одной - тогда будете опять в ручную мельницы расставлять ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба Камер будет максимум 2. Да и на эту линию то как раз компилятор не ругается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая (изменено) · Жалоба Ну значит я слепой... Первые две красные строчки в отчёте.... вот там и упоминаются icam_index_s0/q ps: в каком тактовом домёне будет формироваться количество камер ? ведь явно ведь не на 160 мгц? а оный сигнал идёт в модуль сдрам где тактовая как раз 160 мгц. и вы будете говорить что здесь нет пересечения по клокам ? Изменено 15 мая пользователем Alex77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба Ну ладно. С одним сигналом понятно. А с isdcaddr что не так? Они в одном домене уже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая · Жалоба В 15.05.2024 в 18:37, Worldmaster сказал: Ну ладно. С одним сигналом понятно. А с isdcaddr что не так? Они в одном домене уже. А что это за сигнал? откуда и куда ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба В 15.05.2024 в 19:02, Alex77 сказал: А что это за сигнал? откуда и куда ? entity SDRAM_SERIALIZER is port ( rst_n : in std_logic; isdram_clk : in std_logic; isdrc_clk : in std_logic; RAMIsReady: out std_logic; in_write_clk: in std_logic; int_read_clk: in std_logic; cam1_data_ready: in std_logic; cam2_data_ready: in std_logic; cam_index: in std_logic; Buf_WriteData: in std_logic_vector(15 downto 0); Buf_ReadData: out std_logic_vector(31 downto 0); Buf_ReadAddr: in std_logic_vector(15 downto 0); Buf_Read_Valid: out std_logic; RAM_StartAddress: in std_logic_vector(19 downto 0); RAM_DataCount: in std_logic_vector(19 downto 0); SDRAMInitDone: out std_logic; cam_frame_reading: in std_logic; IO_sdram_dq: inout std_logic_vector(31 downto 0); O_sdram_clk: out std_logic; O_sdram_cke: out std_logic; O_sdram_cs_n: out std_logic; O_sdram_cas_n: out std_logic; O_sdram_ras_n: out std_logic; O_sdram_wen_n: out std_logic; O_sdram_dqm: out std_logic_vector(3 downto 0); O_sdram_addr: out std_logic_vector(10 downto 0); O_sdram_ba: out std_logic_vector(1 downto 0) ); end SDRAM_SERIALIZER; это управляющий модуль. отвечает за взаимодействие с рамой. блоками пишет и читает. кормиться тольео 160 isdram_clk => clk_160_d22_mhz, isdrc_clk => clk_160mhz, внутри этого модуля определен модуьл сдрам MySDRAM: SDRAM_MODULE port map ( rst_n => rst_n, sdram_clk => isdram_clk, sdrc_clk => isdrc_clk, IO_sdram_dq => IO_sdram_dq, O_sdram_clk => O_sdram_clk, O_sdram_cke => O_sdram_cke, O_sdram_cs_n => O_sdram_cs_n, O_sdram_cas_n => O_sdram_cas_n, O_sdram_ras_n => O_sdram_ras_n, O_sdram_wen_n => O_sdram_wen_n, O_sdram_dqm => O_sdram_dqm, O_sdram_addr => O_sdram_addr, O_sdram_ba => O_sdram_ba, transmit_en => RAM_transmit_en, RW => RAM_RW, Data_count => RAM_Data_count, Bank_addr => RAM_Bank_addr, Row_addr => RAM_Row_addr, Col_addr => RAM_Col_addr, IsDataReady => RAM_IsDataReady, IsReady => RAM_IsReady, ReadData => RAM_ReadData, WriteData => RAM_WriteData, InitDone => SDRAMInitDone, Ack => RAM_Ack ); вот эти сигналы Bank_addr => RAM_Bank_addr, Row_addr => RAM_Row_addr, Col_addr => RAM_Col_addr, один процесс на 160 формирует адрес и длину а вот этот процесс сразу меняет состояние. -- отдельный процесс для переключения состояния параметров process(mode, RAM_ROW_ADDR_req, RAM_COL_ADDR_BIT_req, RAM_32BIT_WORD_COUNT_BIT_req, RAM_RW_BIT_req) begin if mode = '0' then RAM_Bank_addr <= (others=>'0'); RAM_Row_addr <= (others=>'0'); RAM_Col_addr <= (others=>'0'); RAM_Data_count <= (others=>'0'); RAM_RW <= '0'; else RAM_Bank_addr <= (others=>'0'); RAM_Row_addr <= RAM_ROW_ADDR_req; RAM_Col_addr <= RAM_COL_ADDR_BIT_req; RAM_Data_count <= RAM_32BIT_WORD_COUNT_BIT_req; RAM_RW <= RAM_RW_BIT_req; end if; end process; а в мсодуле рамы уже инициируется обработка по этим параметрам cmd_io: process(sdrc_clk, rst_n ) type fsm_state is(init, idle, init_command, send_command, finalize,nop ); variable state: fsm_state:= init; variable nextstate: fsm_state:= nop; variable mode_value: std_logic := '0'; variable waiter: std_logic_vector(2 downto 0):= (others => '0'); variable valid_req: std_logic := '0'; begin if rst_n = '0' then state := init; bytes_counter <= (others => '0'); I_sdrc_cmd_en <= '0'; I_sdrc_addr <= (others => '0'); I_sdrc_cmd <= (others => '0'); I_sdrc_data_len <= (others => '0'); data_valid <= '0'; IsReady <= '1'; elsif rising_edge(sdrc_clk) then case state is when init => if O_sdrc_init_done = '1' then state := idle; end if; when idle => I_sdrc_precharge_ctrl <= '0'; if transmit_en = '1' then bytes_counter <= Data_count - 1; state := init_command; IsReady <= '0'; mode_value := '0'; ack_state <= '0'; I_sdrc_addr_buffer <= bank_addr & row_addr & col_addr; else I_sdrc_addr_buffer <= (others => '0'); IsReady <= '1'; state := idle; ack_state <= '1'; end if; when init_command => I_sdrc_cmd_en <='1'; --I_sdrc_addr <= bank_addr & row_addr & col_addr; I_sdrc_addr <= I_sdrc_addr_buffer; state := send_command; if mode_value = '0' then waiter := std_logic_vector(to_unsigned(5, waiter'length)); I_sdrc_cmd <= ACTIVATE_CMD; mode_value := '1'; nextstate := init_command; else waiter := (others => '0'); nextstate := finalize; state := send_command; I_sdrc_data_len <= bytes_counter; -- длина 1 байт (LEN-1) I_sdrc_precharge_ctrl <= '1'; if RW = WRITE then I_sdrc_cmd <= WRITE_CMD; else I_sdrc_cmd <= READ_CMD; waiter := std_logic_vector(to_unsigned(4, waiter'length)) ; end if; end if; when send_command => I_sdrc_cmd_en <= '0'; I_sdrc_cmd <= (others => '0'); I_sdrc_addr <= (others => '0'); I_sdrc_data_len <= (others => '0'); if waiter = 0 then state := nextstate; data_valid <= not RW; else waiter := waiter - 1; end if; when finalize => if bytes_counter > 0 then data_valid <= '1'; bytes_counter <= bytes_counter - 1; else data_valid <= '0'; nextstate := idle; state := nop; waiter := std_logic_vector(to_unsigned(2, waiter'length)) ; -- задержка на чтение и precharge end if; when nop => if transmit_en = '0' then state := nextstate; end if; if waiter = 0 then ack_state <= '1'; else waiter := waiter - 1; end if; end case; end if; end process cmd_io; и только тут и задается I_sdrc_addr_buffer <= bank_addr & row_addr & col_addr; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая · Жалоба если вопрос про I_sdrc_addr_buffer (это тоже самое что и isdcaddr ???) - то ищем место где формируется сигнал device_state (в этих листингах отсутствует).... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 15 мая Опубликовано 15 мая · Жалоба На телефоне пишу. Да, это одно и те же сигналы. И device state тут нет. Потому как он не участвует тут вообще. О том и речь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 15 мая Опубликовано 15 мая · Жалоба ну даа.. " не участвует тут вообще". смотрим красные строчки под номером 3 5 6 итд.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 16 мая Опубликовано 16 мая (изменено) · Жалоба вот весь проект. а то чего я кусками .. src.7z актуальный скрин ошибок Изменено 16 мая пользователем Worldmaster Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 16 мая Опубликовано 16 мая · Жалоба Смотрим на оранжевый. На синий пунктир тактовой. На сплошной синий, который управляет мультиплексированием данных (собственно которые идут в модуль MySDRAM) и видим РАЗНЫЕ тактовые inclock_50 и 160 мгц для модуля MySDRAM. Ну и ? Разве не CDC здесь на лицо ? всё согласно актуальному скрину ошибок. О чём опытные собаководы изначально и говорили о пересечении клоков. schematic1.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 мая Опубликовано 17 мая · Жалоба Никто и не спорит что тут cdc. ) очевидно что опытным собаководам все понятно. Но вот вы единственный смогли ткнуть носом прям конкретно а диаграмму. И теперь мне уже становится очевиднее хотя бы как эту линию проверять и вообще понять каким путем сигнал идёт. А есть пример гарантированно рабочего кода для cdc? А то я тут нашел какой то простейший, в соседней теме пример, но он как то странно работает. А в чем вы эту диаграмму делали ? У меня в gowin такая каша получается что хрен поймёшь что куда идёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться