jenya7 0 December 1, 2021 Posted December 1, 2021 (edited) · Report post я этот Модельсим в белых тапках видел чесслово. Вот последний тестбенч Spoiler library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; entity qspi_tb is end qspi_tb; architecture behavior of qspi_tb is component QUADSPI is port ( CLK : in std_logic; RST : in std_logic := '0'; SPI_CS : in std_logic; SPI_CLK : in std_logic; SPI_DATA : inout std_logic_vector(3 downto 0); DATA_OUT : out std_logic_vector(7 downto 0); DATA_IN : in std_logic_vector(7 downto 0); READY_READ : out std_logic; READY_WRITE : out std_logic ); end component; type QSpiStateType is (ST_IDLE, ST_INSTR); signal QSpiState : QSpiStateType := ST_IDLE; signal reset : std_logic := '1'; signal clock : std_logic; signal qspi_cs : std_logic := '1'; signal qspi_clk : std_logic; signal qspi_data : std_logic_vector(3 downto 0); signal s_spi_data_out : std_logic_vector(7 downto 0); signal s_spi_data_in : std_logic_vector(7 downto 0); signal s_ready_read : std_logic; signal s_ready_write : std_logic; constant clk_period : time := 40 ns; constant spi_clk_period : time := 400 ns; signal clk_ena : std_logic; signal s_clk_count : std_logic_vector(31 downto 0); signal clk1 : std_logic; signal clk2 : std_logic; signal clk3 : std_logic; begin clk3 <= not clk2 and clk1; --rising edge U_QSPI : QUADSPI port map ( CLK => clock, RST => reset, SPI_CS => qspi_cs, SPI_CLK => qspi_clk, SPI_DATA => qspi_data, DATA_OUT => s_spi_data_out, DATA_IN => s_spi_data_in, READY_READ => s_ready_read, READY_WRITE => s_ready_write ); clk_process :process begin clock <= '0'; wait for clk_period/2; clock <= '1'; wait for clk_period/2; end process; spi_clk_process : process begin qspi_clk <= '0'; wait for spi_clk_period/2; qspi_clk <= '1'; wait for spi_clk_period/2; end process; process begin if (rising_edge(clock)) then clk1 <= qspi_clk; clk2 <= clk1; end if; end process; stim_proc: process variable clk_count : integer range 0 to 255 := 0; begin if (rising_edge(clock)) then case QSpiState is when ST_IDLE => qspi_cs <= '1'; wait for 80 ns; qspi_cs <= '0'; QSpiState <= ST_INSTR; when ST_INSTR => --if (rising_edge(qspi_clk)) then if (clk3 = '1') then clk_count := clk_count + 1; end if; case clk_count is --instruction when 0 => when 1 => qspi_data <= X"0"; when 2 => qspi_data <= X"7"; --address when 3 => qspi_data <= X"0"; when 4 => qspi_data <= X"0"; when 5 => qspi_data <= X"1"; when 6 => qspi_data <= X"2"; when 7 => qspi_data <= X"3"; when 8 => qspi_data <= X"4"; --alt when 9 => qspi_data <= X"A"; when 10 => qspi_data <= X"B"; --dummy when 11 => qspi_data <= X"5"; when 12 => qspi_data <= X"5"; --data when 13 => qspi_data <= X"8"; when 14 => qspi_data <= X"8"; when 15 => qspi_data <= X"9"; when 16 => qspi_data <= X"9"; when others => clk_count := 0; qspi_cs <= '1'; end case; end case; end if; wait; end process stim_proc; end behavior; добавил process begin if (rising_edge(clock)) then clk1 <= qspi_clk; clk2 <= clk1; end if; end process; всё. ничего не генерируется. убираю - как синхронизироваться с qspi_clk? я уже два дня танцы с бубном устраиваю. то эти сигналы не видит то те. 19 minutes ago, andrew_b said: По-хорошему, надо начинать с тестбенча. Сначала вы "рисуете" входные воздействия для вашего модуля, а потом у же пишете сам модуль, который их обрабатывает. ну да. я очень знаю что QuadSPI мастер генерирует. Edited December 1, 2021 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post 42 minutes ago, jenya7 said: всё. ничего не генерируется. Ну так не бывает, чтобы совсем ничего. Давайте по порядку. clk3 формируется? По коду вижу, что должно, худо-бедно. clk_count не инкрементируется? Логично. При каждом "входе в процесс" переменная clk_count обнуляется (строка объявления переменной) [в данном случае переменной логично предпочесть сигнал, так оно понятней должно быть] Соответственно, максимальное значение, которого может достичь эта переменная будет равно 1. С последующим обнулением к следующему такту. Это во-первых. А во-вторых, сигнал QSpiState в каком состоянии находится? Нужно всё мониторить. Как правильно тут выше подсказали, забудьте пока про QUADSPI, сначала нужно с тестбенчем разобраться. Всё по иерархии. Сначала сигналы, которые явно задаются, затем всё, что от них зависит, после то, что зависит от зависимых и т.д. UPD: да, еще неприятный момент... qspi_cs <= '1'; wait for 80 ns; qspi_cs <= '0'; период такта 40 ns, а вы внутри периода ждете 80 ns. Как-то нелогично. Может, логичней state'ов добавить, чтобы просто такта за 3 всё это сделать, но без мешанины rising_edge+wait? Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 1, 2021 Posted December 1, 2021 · Report post qspi_cs 28 minutes ago, FakeDevice said: Ну так не бывает, чтобы совсем ничего. Давайте по порядку. clk3 формируется? По коду вижу, что должно, худо-бедно. в том то и дело - вообще ничего не генерируется. убираю процесс - вижу сигналв в Wave. 28 minutes ago, FakeDevice said: clk_count не инкрементируется? Логично. При каждом "входе в процесс" переменная clk_count обнуляется (строка объявления переменной) [в данном случае переменной логично предпочесть сигнал, так оно понятней должно быть] это как? это инициализация сигнала. у меня во всех процесах есть инициализация сигналов и всё прекрасно работает. процес начинается после begin. 28 minutes ago, FakeDevice said: UPD: да, еще неприятный момент... qspi_cs <= '1'; wait for 80 ns; qspi_cs <= '0'; период такта 40 ns, а вы внутри периода ждете 80 ns. Как-то нелогично. Может, логичней state'ов добавить, чтобы просто такта за 3 всё это сделать, но без мешанины rising_edge+wait? как раз таки эта конструкция работает. я вижу qspi_cs генерируется правильно. Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post 5 minutes ago, jenya7 said: в том то и дело - вообще ничего не генерируется. убираю процесс - вижу сигналв в Wave. Может, просто переобозвалось как-то в среде? Несите скрин в студию, где у вас присутствует тот процесс, но ничего не генерируется. Ну и побольше накидайте в waveform всего, что найдете в тестбенче. 5 minutes ago, jenya7 said: это как? это инициализация сигнала. у меня во всех процесах есть инициализация сигналов и всё прекрасно работает. процес начинается после begin. Нет, это инициализация переменной (в данном случае clk_count). В VHDL сигналы и переменные немного разные сущности. Я бы настоятельно рекомендовал пока забыть про переменные, а пользоваться исключительно сигналами. Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 1, 2021 Posted December 1, 2021 · Report post 9 minutes ago, FakeDevice said: Нет, это инициализация переменной (в данном случае clk_count). В VHDL сигналы и переменные немного разные сущности. Я бы настоятельно рекомендовал пока забыть про переменные, а пользоваться исключительно сигналами. сигнал обновится на следующем клоке а переменная на этом, в этом её преимущество. Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post 19 minutes ago, jenya7 said: сигнал обновится на следующем клоке а переменная на этом, в этом её преимущество. точно, да, инициализация один раз, если в теле нет обнуления, тупанул. Но всё же, 40 minutes ago, jenya7 said: как раз таки эта конструкция работает. я вижу qspi_cs генерируется правильно. покажите все сигналы/переменные из тестбенча. Что там куда пропадает? 48 minutes ago, jenya7 said: в том то и дело - вообще ничего не генерируется. убираю процесс - вижу сигналв в Wave. а, вижу. Тут проблема с чувствительностью процесса еще есть: 2 hours ago, jenya7 said: process begin if (rising_edge(clock)) then clk1 <= qspi_clk; clk2 <= clk1; end if; end process; wait until rising_edge(clock) бы лучше подошло Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 1, 2021 Posted December 1, 2021 (edited) · Report post да вы можете взять эти два файла и собрать проект в модельсиме за 5 минут. так на скринах всего не покажешь. я исхожу из того что QuadSPI master выдаст мне вот такую картину маслом соответсвенно мой слейв который распарсит это - модуль QUADSPI. я пытаюсь в тестбенче воссоздать этот пакет от мастера. я думаю этот процесс точно описывает посылку мастера if (rising_edge(clock)) then case QSpiState is when ST_IDLE => qspi_cs <= '1'; wait for 80 ns; qspi_cs <= '0'; QSpiState <= ST_INSTR; when ST_INSTR => if (clk3 = '1') then clk_count := clk_count + 1; end if; case clk_count is --instruction when 0 => when 1 => qspi_data <= X"0"; when 2 => qspi_data <= X"7"; --address when 3 => qspi_data <= X"0"; when 4 => qspi_data <= X"0"; when 5 => qspi_data <= X"1"; when 6 => qspi_data <= X"2"; when 7 => qspi_data <= X"3"; when 8 => qspi_data <= X"4"; --alt when 9 => qspi_data <= X"A"; when 10 => qspi_data <= X"B"; --dummy when 11 => qspi_data <= X"5"; when 12 => qspi_data <= X"5"; --data when 13 => qspi_data <= X"8"; when 14 => qspi_data <= X"8"; when 15 => qspi_data <= X"9"; when 16 => qspi_data <= X"9"; when others => clk_count := 0; qspi_cs <= '1'; end case; end case; end if; осталось разобраться почему он не работает в модельсиме. Edited December 1, 2021 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post 1 minute ago, jenya7 said: да вы можете взять эти два файла и собрать проект в модельсиме за 5 минут. так на скринах всего не покажешь. Ды вот, пришлось вспомнить, где у меня тут что установлено )) Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post еще осталась проблема с if (rising_edge(clock)) then в процессе stim_proc Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 9 December 1, 2021 Posted December 1, 2021 · Report post 3 часа назад, jenya7 сказал: я этот Модельсим в белых тапках видел чесслово. А когда молотком по пальцу попадает, то винит молоток. Что там в эпиграфе к "Ревизору" было? Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 1, 2021 Posted December 1, 2021 · Report post 1 hour ago, jenya7 said: . если всё, о чём вспоминали тут, исправлено, но SPI_DATA по-прежнему в "X" или "U", то еще стоит обратить внимание на направление порта SPI_DATA : inout std_logic_vector(3 downto 0); двунаправленная шина. Заменив строки файла quadspi.vhd process(CLK) variable clk_count : integer range 0 to 6 := 0; begin if (rising_edge(CLK)) then case QSpiState is на process(CLK) variable clk_count : integer range 0 to 6 := 0; begin SPI_DATA <= "ZZZZ"; if (rising_edge(CLK)) then case QSpiState is можно увидеть, что на шине появляются значения отличные от "X" или "U". Но это в качестве примера, показать, как с двунаправленными шинами можно поступать. Точнее -- это надо с протоколом выверять. Высокий импенданс ('Z') можно подавать как со стороны тестируемого юнита, так и со стороны тестбенча. Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 2, 2021 Posted December 2, 2021 · Report post 12 hours ago, FakeDevice said: process(CLK) variable clk_count : integer range 0 to 6 := 0; begin SPI_DATA <= "ZZZZ"; if (rising_edge(CLK)) then case QSpiState is можно увидеть, что на шине появляются значения отличные от "X" или "U". Но это в качестве примера, показать, как с двунаправленными шинами можно поступать. Точнее -- это надо с протоколом выверять. Высокий импенданс ('Z') можно подавать как со стороны тестируемого юнита, так и со стороны тестбенча. ну Z я вижу на шине. а другие сигналы не приходят. у меня подозрение что условие clk_count := clk_count + 1; не выполняется. 13 hours ago, FakeDevice said: еще осталась проблема с if (rising_edge(clock)) then в процессе stim_proc а как без этого. без клока никак. Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 2, 2021 Posted December 2, 2021 · Report post 3 minutes ago, jenya7 said: а как без этого. без клока никак. Если клок не указан в списке чувствительности процесса, то просто заменить на wait until rising_edge(clock); Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 December 2, 2021 Posted December 2, 2021 (edited) · Report post 27 minutes ago, FakeDevice said: Если клок не указан в списке чувствительности процесса, то просто заменить на wait until rising_edge(clock); спасибо. помогло. сейчас проблема - не генерируется clk3 (clk3 <= not clk2 and clk1) так не работало. вообще ничего не генерировалось process begin if (rising_edge(clock)) then clk1 <= qspi_clk; clk2 <= clk1; end if; end process; перенес spi_clk_process : process begin qspi_clk <= '0'; wait for spi_clk_period/2; qspi_clk <= '1'; clk1 <= qspi_clk; clk2 <= clk1; wait for spi_clk_period/2; end process; clk1, clk2, clk3 не генерируются. Edited December 2, 2021 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
FakeDevice 0 December 2, 2021 Posted December 2, 2021 · Report post 11 minutes ago, jenya7 said: спасибо. помогло. сейчас проблема - не генерируется clk3 (clk3 <= not clk2 and clk1) так не работало. вообще ничего не генерировалось process begin if (rising_edge(clock)) then clk1 <= qspi_clk; clk2 <= clk1; end if; end process; Здесь же таже самая проблема, заменить if rising_edge на wait until rising_edge Quote Share this post Link to post Share on other sites More sharing options...