Worldmaster 0 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба Здравствуйте. При использовании IP Core для SDRAM GOWIN получаю вот такое предупреждение: Цитата WARN (CV0023) : Sweep user defined iobuf instance "IO_sdram_dq_0_iobuf" with dangling iopin("C:\Delme\FPGA\SimpleTest\src\sdram_controller_hs\sdram_controller_hs.vhd":1566) Что это может значить? Модель же встроенный и конфигурируется при генерации IP. Да и согласно даташита он используется самим модулем при взаимодействии с SDRAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zversky 18 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба Что у вас с темами творится? Это что?: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lotos 4 16 августа, 2023 Опубликовано 16 августа, 2023 · Жалоба Пожалуйста, приведите кусок кода sdram_controller_hs.vhd для строки 1566 и плюс-минус 20-30 строк, чтобы сориентироваться в причине ошибки или задать дополнительные вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба А у вас пин то назначен для этого сигнала? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 августа, 2023 Опубликовано 17 августа, 2023 (изменено) · Жалоба В 16.08.2023 в 21:37, Lotos сказал: приведите кусок кода sdram_controller_hs.vhd для строки 1566 и плюс-минус 20-30 строк, чтобы сориентироваться в причине ошибки или задать дополнительные вопросы. Это код который генерирует IP Core для SDRAM. Половина зашифрована. Вот кусок который более менее понятен. begin IO_sdram_dq_0_iobuf: IOBUF port map ( O => IO_sdram_dq_in(0), IO => IO_sdram_dq(0), I => Ctrl_fsm_data(0), OEN => IO_sdram_dq_0); IO_sdram_dq_1_iobuf: IOBUF port map ( O => IO_sdram_dq_in(1), IO => IO_sdram_dq(1), I => Ctrl_fsm_data(1), OEN => IO_sdram_dq_0); IO_sdram_dq_2_iobuf: IOBUF port map ( O => IO_sdram_dq_in(2), IO => IO_sdram_dq(2), I => Ctrl_fsm_data(2), OEN => IO_sdram_dq_0); IO_sdram_dq_3_iobuf: IOBUF port map ( O => IO_sdram_dq_in(3), IO => IO_sdram_dq(3), I => Ctrl_fsm_data(3), OEN => IO_sdram_dq_0); IO_sdram_dq_4_iobuf: IOBUF В 17.08.2023 в 07:37, Strob сказал: А у вас пин то назначен для этого сигнала? Зачем? В 16.08.2023 в 16:59, Worldmaster сказал: Модель же встроенный и конфигурируется при генерации IP. В даташите сказано что: Цитата When you instantiate an embedded SDRAM controller in your design, the I/O ports connected with the SDRAM controller in the top design module should have the same name as that of the embedded SDRAM controller. Gowin YunYuan software will perform place and route automatically according to the designed I/O port name, which facilitates smooth communication between the SDRAM controller and the SDRAM. Цитата Когда вы создаете экземпляр встроенного контроллера SDRAM в своем проекте, порты ввода/вывода, связанные с контроллером SDRAM в топовом исполнении модуль должен иметь то же имя, что и встроенная SDRAM контроллер. Программное обеспечение Gowin YunYuan выполнит размещение и маршрут автоматически в соответствии с разработанным именем порта ввода-вывода, что облегчает плавная связь между контроллером SDRAM и SDRAM. Корка дала мне код такой: component SDRAM_Controller_HS_Top port ( 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); IO_sdram_dq: inout std_logic_vector(31 downto 0); I_sdrc_rst_n: in std_logic; I_sdrc_clk: in std_logic; I_sdram_clk: in std_logic; I_sdrc_cmd_en: in std_logic; I_sdrc_cmd: in std_logic_vector(2 downto 0); I_sdrc_precharge_ctrl: in std_logic; I_sdram_power_down: in std_logic; I_sdram_selfrefresh: in std_logic; I_sdrc_addr: in std_logic_vector(20 downto 0); I_sdrc_dqm: in std_logic_vector(3 downto 0); I_sdrc_data: in std_logic_vector(31 downto 0); I_sdrc_data_len: in std_logic_vector(7 downto 0); O_sdrc_data: out std_logic_vector(31 downto 0); O_sdrc_init_done: out std_logic; O_sdrc_cmd_ack: out std_logic ); end component; Я не меняя наименований линий добавил к себе: MySDRAM: SDRAM_Controller_HS_Top port map ( O_sdram_clk => O_sdram_clk_o, O_sdram_cke => O_sdram_cke_o, O_sdram_cs_n => O_sdram_cs_n_o, O_sdram_cas_n => O_sdram_cas_n_o, O_sdram_ras_n => O_sdram_ras_n_o, O_sdram_wen_n => O_sdram_wen_n_o, O_sdram_dqm => O_sdram_dqm_o, O_sdram_addr => O_sdram_addr_o, O_sdram_ba => O_sdram_ba_o, IO_sdram_dq => IO_sdram_dq_io, I_sdrc_rst_n => I_sdrc_rst_n_i, I_sdrc_clk => I_sdrc_clk_i, I_sdram_clk => I_sdram_clk_i, I_sdrc_cmd_en => I_sdrc_cmd_en_i, I_sdrc_cmd => I_sdrc_cmd_i, I_sdrc_precharge_ctrl => I_sdrc_precharge_ctrl_i, I_sdram_power_down => I_sdram_power_down_i, I_sdram_selfrefresh => I_sdram_selfrefresh_i, I_sdrc_addr => I_sdrc_addr_i, I_sdrc_dqm => I_sdrc_dqm_i, I_sdrc_data => I_sdrc_data_i, I_sdrc_data_len => I_sdrc_data_len_i, O_sdrc_data => O_sdrc_data_o, O_sdrc_init_done => O_sdrc_init_done_o, O_sdrc_cmd_ack => O_sdrc_cmd_ack_o ); Также создал сигналы: signal O_sdram_clk_o: std_logic; signal O_sdram_cke_o: std_logic; signal O_sdram_cs_n_o: std_logic; signal O_sdram_cas_n_o: std_logic; signal O_sdram_ras_n_o: std_logic; signal O_sdram_wen_n_o: std_logic; signal O_sdram_dqm_o: std_logic_vector(3 downto 0); signal O_sdram_addr_o: std_logic_vector(10 downto 0); signal O_sdram_ba_o: std_logic_vector(1 downto 0); signal IO_sdram_dq_io: std_logic_vector(31 downto 0):= (others => 'Z'); signal I_sdrc_rst_n_i: std_logic := '0'; signal I_sdram_selfrefresh_i: std_logic := '1'; signal I_sdram_power_down_i: std_logic := '0'; signal I_sdrc_cmd_en_i: std_logic := '0'; signal I_sdrc_cmd_i: std_logic_vector(2 downto 0):= (others => '0'); signal I_sdrc_precharge_ctrl_i: std_logic := '0'; signal O_sdrc_cmd_ack_o: std_logic; signal I_sdrc_clk_i: std_logic; signal I_sdram_clk_i : std_logic; signal I_sdrc_addr_i: std_logic_vector(20 downto 0) := (others => '0'); signal I_sdrc_data_len_i: std_logic_vector(7 downto 0) := (others => '0'); signal I_sdrc_dqm_i: std_logic_vector(3 downto 0) := (others => '0'); signal I_sdrc_data_i: std_logic_vector(31 downto 0) := (others => '0'); signal O_sdrc_data_o: std_logic_vector(31 downto 0); signal O_sdrc_init_done_o: std_logic; Код собирается отлично но вот этот варнинг немного настораживает. Изменено 17 августа, 2023 пользователем Worldmaster Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба Quote the I/O ports connected with the SDRAM controller in the top design module should have the same name as that of the embedded SDRAM controller вот эту фразу, я бы все же расценил как сохранение имени пина на топе, тогда как у вас на топе другие имена портов/сигналов в модуле верхнего уровня, вы добавили суффиксы _i и _o, а изначальный варининг " Sweep user defined iobuf instance" и говорит о каком то сдвиге портов данных, может быть потому что все зацепленно на другие пины. 1 hour ago, Worldmaster said: Код собирается отлично но вот этот варнинг немного настораживает. а память работает, тесты памяти проходят? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба В 17.08.2023 в 09:32, des00 сказал: от эту фразу, я бы все же расценил как сохранение имени пина на топе, тогда как у вас на топе другие имена портов, вы добавили суффиксы _i и _o Я не добавлял ничего в код который мне предоставил генератор корки. --Copyright (C)2014-2022 Gowin Semiconductor Corporation. --All rights reserved. --File Title: Template file for instantiation --GOWIN Version: GowinSynthesis V1.9.8.07 --Part Number: GW2AR-LV18EQ144C8/I7 --Device: GW2AR-18 --Created Time: Thu Aug 17 09:38:29 2023 --Change the instance name and port connections to the signal names ----------Copy here to design-------- component SDRAM_Controller_HS_Top port ( 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); IO_sdram_dq: inout std_logic_vector(31 downto 0); I_sdrc_rst_n: in std_logic; I_sdrc_clk: in std_logic; I_sdram_clk: in std_logic; I_sdrc_cmd_en: in std_logic; I_sdrc_cmd: in std_logic_vector(2 downto 0); I_sdrc_precharge_ctrl: in std_logic; I_sdram_power_down: in std_logic; I_sdram_selfrefresh: in std_logic; I_sdrc_addr: in std_logic_vector(20 downto 0); I_sdrc_dqm: in std_logic_vector(3 downto 0); I_sdrc_data: in std_logic_vector(31 downto 0); I_sdrc_data_len: in std_logic_vector(7 downto 0); O_sdrc_data: out std_logic_vector(31 downto 0); O_sdrc_init_done: out std_logic; O_sdrc_cmd_ack: out std_logic ); end component; your_instance_name: SDRAM_Controller_HS_Top port map ( O_sdram_clk => O_sdram_clk_o, O_sdram_cke => O_sdram_cke_o, O_sdram_cs_n => O_sdram_cs_n_o, O_sdram_cas_n => O_sdram_cas_n_o, O_sdram_ras_n => O_sdram_ras_n_o, O_sdram_wen_n => O_sdram_wen_n_o, O_sdram_dqm => O_sdram_dqm_o, O_sdram_addr => O_sdram_addr_o, O_sdram_ba => O_sdram_ba_o, IO_sdram_dq => IO_sdram_dq_io, I_sdrc_rst_n => I_sdrc_rst_n_i, I_sdrc_clk => I_sdrc_clk_i, I_sdram_clk => I_sdram_clk_i, I_sdrc_cmd_en => I_sdrc_cmd_en_i, I_sdrc_cmd => I_sdrc_cmd_i, I_sdrc_precharge_ctrl => I_sdrc_precharge_ctrl_i, I_sdram_power_down => I_sdram_power_down_i, I_sdram_selfrefresh => I_sdram_selfrefresh_i, I_sdrc_addr => I_sdrc_addr_i, I_sdrc_dqm => I_sdrc_dqm_i, I_sdrc_data => I_sdrc_data_i, I_sdrc_data_len => I_sdrc_data_len_i, O_sdrc_data => O_sdrc_data_o, O_sdrc_init_done => O_sdrc_init_done_o, O_sdrc_cmd_ack => O_sdrc_cmd_ack_o ); ----------Copy end------------------- Разве что имя поменял. Или все нужно сделать что слева то и справа? В 17.08.2023 в 09:32, des00 сказал: а память работает, тесты памяти проходят? Какие тесты должны быть? Вообще модуль стабильно меняет состояние линии O_sdrc_init_done_o после ресета. Также после завершения команд READ WRITE он также стабильно выдает O_sdrc_cmd_ack_o = '1' Остальные тесты я только в modelsim делал но там ничего выдающегося. Могу конечно привести диаграммы всех команд. Там я дотошно вроде бы линии выставил. В 17.08.2023 в 09:32, des00 сказал: бы все же расценил как сохранение имени пина на топе Ну вот сделал так: MySDRAM: SDRAM_Controller_HS_Top port map ( 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, IO_sdram_dq => IO_sdram_dq, I_sdrc_rst_n => I_sdrc_rst_n, I_sdrc_clk => I_sdrc_clk, I_sdram_clk => I_sdram_clk, I_sdrc_cmd_en => I_sdrc_cmd_en, I_sdrc_cmd => I_sdrc_cmd, I_sdrc_precharge_ctrl => I_sdrc_precharge_ctrl, I_sdram_power_down => I_sdram_power_down, I_sdram_selfrefresh => I_sdram_selfrefresh, I_sdrc_addr => I_sdrc_addr, I_sdrc_dqm => I_sdrc_dqm, I_sdrc_data => I_sdrc_data, I_sdrc_data_len => I_sdrc_data_len, O_sdrc_data => O_sdrc_data, O_sdrc_init_done => O_sdrc_init_done, O_sdrc_cmd_ack => O_sdrc_cmd_ack ); Ничего особо не изменилось. Цитата Sweep user defined iobuf instance "IO_sdram_dq_0_iobuf" with dangling iopin("C:\Delme\FPGA\SimpleTest\src\sdram_controller_hs\sdram_controller_hs.vhd":1566) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба 2 hours ago, Worldmaster said: Зачем? Не совсем правильно выразился. Не пин, а порт в топ модуле подключен к этому сигналу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба 32 minutes ago, Worldmaster said: Разве что имя поменял. Или все нужно сделать что слева то и справа? да кто их этих китайцев поймет. 32 minutes ago, Worldmaster said: Какие тесты должны быть? классические запись-чтение: 0x55, 0xAA, счетчик, инверсный счетчик, псп, по всем обьему памяти. Речь про запуск аппаратного теста на железке: топ, в нем контроллер и модуль проверки памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба В 17.08.2023 в 10:12, des00 сказал: классические запись-чтение: Так не работает ни запись ни чтение. Хотя хз что не работает. При чтении всегда нули. пишу счетчик ему. Не пугайтесь. Код большой. process (GCLK ) variable delay_read: integer :=0; variable delay_write: integer :=0; variable counter : integer:=0; constant READ_CMD:std_logic_vector(2 downto 0):= "101"; constant ACTIVATE_CMD:std_logic_vector(2 downto 0):= "011"; constant WRITE_CMD:std_logic_vector(2 downto 0):= "100"; constant INTERRUPT_CMD:std_logic_vector(2 downto 0):= "110"; constant REFRESH_CMD:std_logic_vector(2 downto 0):= "001"; constant PRECHARGE_CMD:std_logic_vector(2 downto 0):= "010"; constant LOAD_MODE_CMD:std_logic_vector(2 downto 0):= "000"; constant NOP_CMD:std_logic_vector(2 downto 0):= "111"; constant SELECT_CMD:std_logic_vector(2 downto 0):= "011"; variable ptr_idx: integer :=0; variable md_idx: integer :=0; variable loadmode: integer :=0; begin if rising_edge(GCLK) then case mstate is when RESET=> I_sdrc_rst_n <= '0'; SDRAM_BUSY <= '0'; I_sdram_selfrefresh <= '0'; I_sdrc_dqm <= (others => '1'); -- аналогично маске для 4 байтов в данных I_sdrc_data <= (others => 'Z'); I_sdrc_precharge_ctrl <= '0'; rd_len <= 0; rd_idx <= 0; wr_len <=0; wr_idx <=0; col_addr <= std_logic_vector(to_unsigned(0, col_addr'length)); row_addr <= std_logic_vector(to_unsigned(0, row_addr'length)); bank_addr <= std_logic_vector(to_unsigned(0, bank_addr'length)); I_sdrc_addr <= (others => 'Z'); I_sdrc_cmd <= (others => 'Z'); I_sdrc_cmd_en <='0'; I_sdrc_data_len <= (others => 'Z'); -- wait > 100 us if delay_counter >= 1_000_000 then delay_counter <= 0; mode_count <= mode_count + 1; sdram_addr_request <= (others => 'Z'); sdram_request_data <= (others => 'Z'); wait_ack_request <= '0'; case mode_count is when 0=> md_idx := 0; loadmode := loadmode + 1; ------------------------------------------------------------- -- Initialization when 1 => sdram_request_cmd <= NOP_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= 5; when 2 => sdram_request_cmd <= PRECHARGE_CMD; sdram_addr_request <= (others => '1'); -- all banks mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRP; wait_ack_request <='1'; when 3 => sdram_request_cmd <= NOP_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= 5; when 4 => sdram_request_cmd <= REFRESH_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRFC; when 5 => sdram_request_cmd <= NOP_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= 5; when 6 => sdram_request_cmd <= REFRESH_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRFC; when 7 => sdram_request_cmd <= NOP_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= 5; when 8 => sdram_request_cmd <= LOAD_MODE_CMD; sdram_addr_request <= "000000000000000110000"; -- config mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tMRD; when 9 => sdram_request_cmd <= NOP_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= 5; ------------------------------------------------------------- when 10 => sdram_request_cmd <= PRECHARGE_CMD; sdram_addr_request <= (others => '1'); -- all banks mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRP; when 11 => sdram_request_cmd <= ACTIVATE_CMD; mstate <= SDRAM_CMD_PROCESS; sdram_addr_request <= "00000000" & bank_addr & row_addr ; after_cmd_request_delay <= tRCD; when 12 => mstate <= SDRAM_WRITE; after_cmd_request_delay <= tWR; when 13 => sdram_request_cmd <= REFRESH_CMD; mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRFC; when 14 => sdram_request_cmd <= PRECHARGE_CMD; sdram_addr_request <= (others => '1'); -- all banks mstate <= SDRAM_CMD_PROCESS; after_cmd_request_delay <= tRP; when 15 => sdram_request_cmd <= ACTIVATE_CMD; mstate <= SDRAM_CMD_PROCESS; sdram_addr_request <= "00000000" & bank_addr & row_addr ; after_cmd_request_delay <= tRCD; when 16 => mstate <= SDRAM_READ; after_cmd_request_delay <= CL; when 17 => sdram_request_cmd <= REFRESH_CMD; mstate <= SDRAM_CMD_PROCESS; when others=> mode_count <= 12; end case; else delay_counter <= delay_counter + 1; end if; --------------------------------------------------------------------- -- ЧТЕНИЕ БЕЗ ПРЕДВАРИТЕЛЬНОЙ ЗАРЯДКИ --------------------------------------------------------------------- when SDRAM_READ => SDRAM_BUSY <= '1'; rd_len <= 16; -- считаем словами rd_idx <= 0; -- адрес нуля --I_sdrc_precharge_ctrl_i <= '1'; I_sdrc_rst_n <= '1'; I_sdram_selfrefresh <= '0'; I_sdram_power_down <= '0'; I_sdrc_cmd_en <='0'; I_sdrc_cmd <= (others => 'Z'); I_sdrc_addr <= (others => 'Z'); I_sdrc_dqm <= (others => '0'); I_sdrc_data_len <= (others => 'Z'); I_sdrc_data <= (others => 'Z'); if O_sdrc_init_done = '1' then mstate <= SDRAM_READ_BEGIN; end if; when SDRAM_READ_BEGIN => I_sdrc_cmd_en <='1'; I_sdrc_cmd <= READ_CMD; I_sdrc_addr <= "00000000000" & bank_addr & col_addr; I_sdrc_data_len <= std_logic_vector(to_unsigned(rd_len-1, I_sdrc_data_len'length)) ; -- длина 1 байт (LEN-1) mstate <= SDRAM_READ_ACK; request_delay <=0; ptr_idx := 0; mem_buffer(0) <=x"00"; when SDRAM_READ_ACK=> I_sdrc_cmd_en <='0'; I_sdrc_cmd <= NOP_CMD; I_sdrc_addr <= (others => 'Z'); I_sdrc_data_len <= (others => 'Z'); -- ACK выдается в самом конце чтения всего пакета данных. Показывает что чтение завершено if O_sdrc_cmd_ack = '0' then mem_buffer(0) <= mem_buffer(0) + 1; end if; if request_delay < after_cmd_request_delay-1 then request_delay <= request_delay + 1; else if rd_len > 0 then rd_len <= rd_len - 1; -- принимаем нужное количество данных mem_buffer(ptr_idx) <= O_sdrc_data(31 downto 24); mem_buffer(ptr_idx + 1) <= O_sdrc_data(23 downto 16); mem_buffer(ptr_idx + 2) <= O_sdrc_data(15 downto 8); mem_buffer(15) <= O_sdrc_data(7 downto 0); rd_idx <= rd_idx + 1; ptr_idx := 4; else -- после последнего чтения надо еще подождать mstate <= SDRAM_WAIT_TIME; request_delay <= 1; end if; end if; --------------------------------------------------------------------- -- ЗАПИСЬ БЕЗ ПРЕДВАРИТЕЛЬНОЙ ЗАРЯДКИ --------------------------------------------------------------------- when SDRAM_WRITE => SDRAM_BUSY <= '1'; wr_len <= 8; -- запишем 8 байт wr_idx <= 0; -- адрес записи с нуля --I_sdrc_precharge_ctrl_i <= '1'; I_sdrc_rst_n <= '1'; I_sdram_selfrefresh <= '0'; I_sdram_power_down <= '0'; I_sdrc_cmd_en <='0'; I_sdrc_cmd <= (others => 'Z'); I_sdrc_addr <= (others => 'Z'); I_sdrc_dqm <= (others => '0'); I_sdrc_data_len <= (others => 'Z'); if O_sdrc_init_done = '1' then mstate <= SDRAM_WRITE_BEGIN; end if; I_sdrc_data <= "11100011100011100010101000111000"; when SDRAM_WRITE_BEGIN => I_sdrc_cmd_en <='1'; I_sdrc_cmd <= WRITE_CMD; I_sdrc_addr <= bank_addr & row_addr& col_addr; I_sdrc_data_len <= std_logic_vector(to_unsigned(wr_len-1, I_sdrc_data_len'length)) ; -- длина 1 байт (LEN-1) I_sdrc_data(31 downto 24) <= std_logic_vector(to_unsigned(counter, 8)); I_sdrc_data(23 downto 16) <= std_logic_vector(to_unsigned(counter+1, 8)); I_sdrc_data(15 downto 8) <= std_logic_vector(to_unsigned(counter+2, 8)); I_sdrc_data(7 downto 0) <= std_logic_vector(to_unsigned(counter+3, 8)); counter:=counter+4; mstate <= SDRAM_WRITE_WAIT_DATA; when SDRAM_WRITE_WAIT_DATA=> I_sdrc_cmd <= NOP_CMD; I_sdrc_addr <= (others => 'Z'); I_sdrc_data_len <= (others => 'Z'); I_sdrc_cmd_en <='0'; if O_sdrc_cmd_ack = '0' then mem_buffer(1) <= mem_buffer(1) + 1; end if; if wr_len - 1 > 0 then wr_len <= wr_len - 1; wr_idx <= wr_idx + 1; --I_sdrc_data_i(31 downto 24) <= std_logic_vector(to_unsigned(counter, 8)); --I_sdrc_data_i(23 downto 16) <= std_logic_vector(to_unsigned(counter+1, 8)); --I_sdrc_data_i(15 downto 8) <= std_logic_vector(to_unsigned(counter+2, 8)); --I_sdrc_data_i(7 downto 0) <= std_logic_vector(to_unsigned(counter+3, 8)); I_sdrc_data <= "11100011100011100010101000111000"; counter:=counter+4; else I_sdrc_data <= (others => 'Z'); mstate <= SDRAM_WAIT_TIME; request_delay <= 1; end if; --------------------------------------------------------------------- --------------------------------------------------------------------- when SDRAM_CMD_PROCESS=> I_sdrc_rst_n <= '1'; I_sdram_selfrefresh <= '0'; I_sdram_power_down <= '0'; I_sdrc_cmd_en <='0'; I_sdrc_addr<=(others => 'Z'); if O_sdrc_init_done = '1' then mstate <= SDRAM_CMD_PROCESS_1; end if; when SDRAM_CMD_PROCESS_1 => I_sdrc_cmd_en <='1'; I_sdrc_data <= sdram_request_data; I_sdrc_addr <= sdram_addr_request; I_sdrc_cmd <= sdram_request_cmd; mstate <= SDRAM_CMD_PROCESS_2; when SDRAM_CMD_PROCESS_2 => request_delay <= 1; I_sdrc_cmd_en <= '0'; I_sdrc_data <= (others => 'Z'); I_sdrc_addr <= (others => 'Z'); I_sdrc_cmd <= (others => 'Z'); mstate <= SDRAM_WAIT_TIME; --------------------------------------------------------------------- --------------------------------------------------------------------- when SDRAM_WAIT_TIME => if request_delay >= after_cmd_request_delay then mstate <= RESET; else request_delay <= request_delay + 1; end if; --------------------------------------------------------------------- --------------------------------------------------------------------- when others => mstate <= RESET; end case; end if; end process; В 17.08.2023 в 10:12, des00 сказал: да кто их этих китайцев поймет. Отправил запрос этим людям, но они игнорируют напрочь. (( Хотя очевидно что у самих СДК где то есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба 18 minutes ago, Worldmaster said: Так не работает ни запись ни чтение. Хотя хз что не работает. При чтении всегда нули. значит варнинг не зря появился. По логике вещей, чип сдрам разварен у них рядом, он не является составной частью плис. Скорее всего на него идут определенные порты ввода/вывода, которые в системе идентифицируются по символьному имени и скрыты от пользователя. Вы связали их в топе сигналами, которые никуда не подключены. То что выдается ack, так он внутри формируется и выдаваться должен, наличие памяти на это не влияет. Вы пробовали сделать IO пины памяти на топе, с теми же именами, не связывая их физически с пинами плис в файле констрейнов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба В 17.08.2023 в 10:12, des00 сказал: Речь про запуск аппаратного теста на железке: топ, в нем контроллер и модуль проверки памяти. Так да. на железке и запускаю. Считываю в буфер и буфер считываю на комп через USB FIFO В 17.08.2023 в 10:21, des00 сказал: Вы пробовали сделать IO пины в памяти на топе, с теми же именами, не связывая их физически с пинами плис? Не поянл. Я физически ни с чем не связывал. В топе ничего также не выводил и с физическими линиями никакими не связывал. Или я не про то. Вот мой топ: entity top is port ( TB_GCLK: in std_logic:='0'; InClock_50: in std_logic; --генератор входного клока на 50мгц DebugLed: out std_logic; -- выход отладочного светодиода LaserOut: out std_logic:='0'; -- выход на лазер -- линии взаимодействия с FT601 USB30_gpio_0: in std_logic ; USB30_gpio_1: in std_logic ; USB30_wakeup_n: inout std_logic:= '0'; USB30_rd_n: out std_logic:= '1'; USB30_oe_n: out std_logic:= '1'; USB30_wr_n: out std_logic:= '1'; USB30_siwu_n: out std_logic := '1'; USB30_in_clk : in std_logic:= '1'; USB30_txe_n : in std_logic ; USB30_rxf_n: in std_logic ; USB30_BE : inout std_logic_vector(3 downto 0):=(others=>'Z'); USB30_DATA_1 : inout std_logic_vector(7 downto 0):=(others=>'Z'); USB30_DATA_2 : inout std_logic_vector(7 downto 0):=(others=>'Z'); USB30_DATA_3 : inout std_logic_vector(7 downto 0):=(others=>'Z'); USB30_DATA_4 : inout std_logic_vector(7 downto 0):=(others=>'Z'); ------------------------------------------------------------------- sys_reset_i : in std_logic:='0'; -- интерфейс взаимодействия с камерами CAM1_I2C_SDA: inout std_logic; CAM1_I2C_SCL: out std_logic; CAM1_GPIO_0: in std_logic; CAM1_GPIO_1: in std_logic; CAM1_GPIO_2: in std_logic; CAM1_GPIO_3: in std_logic; CAM1_RESET: in std_logic; CAM1_DATA_P: in std_logic; CAM1_DATA_N: in std_logic; CAM1_DATA_2_P: in std_logic; CAM1_DATA_2_N: in std_logic; CAM1_CLK_P: out std_logic; CAM1_CLK_N: out std_logic; CAM1_EXT_CLK: in std_logic; CAM2_I2C_SDA: inout std_logic; CAM2_I2C_SCL: out std_logic; CAM2_GPIO_0: in std_logic; CAM2_GPIO_1: in std_logic; CAM2_GPIO_2: in std_logic; CAM2_GPIO_3: in std_logic; CAM2_RESET: in std_logic; CAM2_DATA_P: in std_logic; CAM2_DATA_N: in std_logic; CAM2_DATA_2_P: in std_logic; CAM2_DATA_2_N: in std_logic; CAM2_CLK_P: out std_logic; CAM2_CLK_N: out std_logic; CAM2_EXT_CLK: in std_logic; ------------------------------------------------------------------- -- интерфейс взаимодействия с гироскопом GYRO_INT1: in std_logic; GYRO_INT2: in std_logic; GYRO_I2C_SDA: inout std_logic; GYRO_I2C_SCL: inout std_logic ); end top; У меня просто сигналы в архитектуре определены. Или это тоже не надо? signal O_sdram_clk: std_logic; signal O_sdram_cke: std_logic; signal O_sdram_cs_n: std_logic; signal O_sdram_cas_n: std_logic; signal O_sdram_ras_n: std_logic; signal O_sdram_wen_n: std_logic; signal O_sdram_dqm: std_logic_vector(3 downto 0); signal O_sdram_addr: std_logic_vector(10 downto 0); signal O_sdram_ba: std_logic_vector(1 downto 0); signal IO_sdram_dq_io: std_logic_vector(31 downto 0):= (others => 'Z'); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба 11 minutes ago, Worldmaster said: Не поянл. Я физически ни с чем не связывал. В топе ничего также не выводил и с физическими линиями никакими не связывал. Или я не про то. Ну вот и добавьте пины сдрам(не сигналы, а в секцию описания портов), в тех же режимах что и должны были быть. В файле констрейнов, где прописано связывание пинов USB*, CAM* и т.д. прописывать эти пины сдрам не надо, скорее всего софт должен их знать. Вдруг именно так и задумал тайный китайский разработчик Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Worldmaster 0 17 августа, 2023 Опубликовано 17 августа, 2023 (изменено) · Жалоба В 17.08.2023 в 10:21, des00 сказал: в файле констрейнов? В этом файле для них связи нет. Это я понял. В 17.08.2023 в 10:31, des00 сказал: В файле констрейнов, где прописано связывание пинов USB*, CAM* и т.д. прописывать эти пины сдрам не надо, Так я этого и не делал. Убрал определения из архитектуры так тоже ругается: Цитата 'io_sdram_dq_io' is not declared("C:\Delme\FPGA\SimpleTest\src\usage.vhd":428) В 17.08.2023 в 10:31, des00 сказал: Ну вот и добавьте пины сдрам, в тех же режимах что и должно было быть. Куда добавить то?SimpleTest_17082023.7z Изменено 17 августа, 2023 пользователем Worldmaster Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 17 августа, 2023 Опубликовано 17 августа, 2023 · Жалоба В модуле верхнего уровня, в порты. 8 minutes ago, Worldmaster said: Куда добавить то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться