Jump to content
    

ModelSim не генерирует Wave.

Есть такой тестбенч

Spoiler

LIBRARY ieee;
USE ieee.std_logic_1164.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;

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 := 10 ns;

signal clk_ena : std_logic;
signal clk_count : std_logic_vector(7 downto 0);

begin

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
    --if (qspi_cs = '0') then
	 qspi_clk <= '0';
	 wait for spi_clk_period/2;
	 qspi_clk <= '1';
	 wait for spi_clk_period/2;
    --end if;	  
end process;


stim_proc: process
variable clk_count : integer range 0 to 255 := 0; 
begin	
	
    qspi_cs <= '0';

    if (rising_edge(clock)) then
	
        if (rising_edge(qspi_clk)) 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 if;

    wait;
	
end process stim_proc;

end behavior;

 

Открываю проект в ModelSim загружаю файлы, компилирую, всё хорошо ошибок нет. загружаю сигналы в Wave. clock определяю как системный clock . Нажимаю Run, симуляция бежит но clock  и сигналы не генерируются.

В чем может быть проблема?

Edited by jenya7

Share this post


Link to post
Share on other sites

так у вас же процесс формирования сигнала clock закомментирован

 

Quote

--clk_process :process
--begin
    --clock <= '0';
    --wait for clk_period/2;
    --clock <= '1';
    --wait for clk_period/2;
--end process;
 

 

Share this post


Link to post
Share on other sites

15 minutes ago, FakeDevice said:

так у вас же процесс формирования сигнала clock закомментирован

я пробовал генерировать из тестбенча но он не генерировался в Wave. Так я в Wave его определяю Right click -> Clock... так тоже не генерируется.

Share this post


Link to post
Share on other sites

Форсировать clock из "wave" -- точно неправильно. Разбирайтесь, добивайтесь того, чтобы из тест-бенча генерировался.

Share this post


Link to post
Share on other sites

я немного изменил тестбенч

Spoiler

LIBRARY ieee;
USE ieee.std_logic_1164.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;

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 clk_count : std_logic_vector(7 downto 0);

begin

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;


stim_proc: process
variable clk_count : integer range 0 to 255 := 0; 
begin	
	
    qspi_cs <= '1';
    wait for 80 ns;
    qspi_cs <= '0';

    if (rising_edge(clock)) then
	
        if (rising_edge(qspi_clk)) 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 if;

    wait;
	
end process stim_proc;

end behavior;

 

клоки генерируются.

 

modsim.thumb.png.890e4c2f1a54a720788ad7d4d807d057.png

Но не ивента qspi_cs хотя я вначале генерирую его

qspi_cs <= '1';
wait for 80 ns;
qspi_cs <= '0';

я что то упускаю?

Edited by jenya7

Share this post


Link to post
Share on other sites

3 minutes ago, jenya7 said:

Но не ивента qspi_cs хотя я врачале генерирую его

я что то упускаю?

Начать можно с того, что на картинке шкалы времени не видно. Возможно, в начале симуляции что-то и было.

Share this post


Link to post
Share on other sites

14 minutes ago, FakeDevice said:

Начать можно с того, что на картинке шкалы времени не видно. Возможно, в начале симуляции что-то и было.

таки да. в начале есть qspi_cs и клоки генерируются. а компонент не работает.

modsim.thumb.png.d595d89bcc4aa7bf0a66423ecb20091a.png

значит что то не так с моим QUADSPI или я что то упускаю в таймингах.

Edited by jenya7

Share this post


Link to post
Share on other sites

4 minutes ago, jenya7 said:

или я что то упускаю в таймингах.

 

Есть немного. Во-первых, непонятно, что с сигналом RST. на waveform его не видно, в тест-бенче он после инициализации тоже нигде не формируется. Ну и то, что прям по старту симуляции у вас на модуль идет управляющий сигнал SPI_CS -- тоже, как правило, неверно. Подождите хотя бы с 10-20 тактов, потом подавайте. Возможно, какая-то завязка есть. Затем, из картинки видно, что и на SPI_DATA постоянно подается "UUUU". Как должна реагировать в данном случае схема? Я тоже не знаю. В общем, проверяйте сигнал за сигналом, чтобы полностью соответствовало временным диаграммам из документации, для начала. А потом, если ВСЕ условия окажутся соблюденными, но так и не заработает -- будет иметь смысл разбираться дальше. Вы не торопитесь, тут больше зависит от внимательности и тщательности. Методом перебора здесь вы ничего хорошего не добьетесь.

Share this post


Link to post
Share on other sites

Вот теперь я понимаю почему я люблю SignalTap.

В диаграме

modsim.thumb.png.9a39776c3bb59ddc4250c16813a2a970.png

мы видим - clk3 исправно генерируется. а s_counter = 0. хотя я добавил в условие

if (clk3 = '1') then
    s_counter <= s_counter + '1';
    clk_count := clk_count + 1;
end if;

 

 

ну хорошо - мой косяк :)).

вот сгенерировался вполне логичный случай

modsim.thumb.png.7c4d351106f8113a34dc23c59b070b76.png

 

видим в ST_INSTR - два clk3. и s_counter инкрементируется.

when ST_INSTR =>
	if (clk3 = '1') then
	     clk_count := clk_count + 1;
	end if;
					 
	case clk_count is
        when 1 => 
             s_instruction(7 downto 4) <= SPI_DATA;
        when 2 =>
            s_instruction(3 downto 0) <= SPI_DATA;
            clk_count := 0;
            QSpiState <= ST_ADDR;
       when others =>
            clk_count := 0;
	        --QSpiState <= ST_ADDR;
    end case; 

SPI_DATA = U. ну съехали тайминги получил другое значение на SPI_DATA. но U?

Edited by jenya7

Share this post


Link to post
Share on other sites

16 minutes ago, jenya7 said:

хотя я добавил в условие


if (clk3 = '1') then
    s_counter <= s_counter + '1';
    clk_count := clk_count + 1;
end if;

 

Это лишь часть правды. Выкладывайте весь модуль ))

Share this post


Link to post
Share on other sites

6 minutes ago, FakeDevice said:

Это лишь часть правды. Выкладывайте весь модуль ))

quadspi.vhdqspi_tb.vhd

это модуль и тест бенч.

Я понял - это та ещё проблема синхронизировать модуль и тест бенч. тест бенчи нужно уметь писать.

Edited by jenya7

Share this post


Link to post
Share on other sites

35 minutes ago, jenya7 said:

SPI_DATA = U. ну съехали тайминги получил другое значение на SPI_DATA. но U?

Не факт. В тестбенче у вас qspi_data зависит от некоторых сигналов. Например, от clk_count. Вы уверены, что clk_count и, соответственно, qspi_data формируются так, как вы ожидаете? Ну и сразу замечу, что конструкции типа

 

Quote

    if (rising_edge(clock)) then
        if (rising_edge(qspi_clk)) then
 

 являются некорректными. Вложенный rising_edge -- это неправильно. Плюс, вопрос на засыпку... Согласно тест-бенчу, как часто должно обновляться значение счетчика clk_count? Судя по коду -- оно вообще не будет обновляться. Процесс доходит до строки "wait;" и всё, до рестарта симуляции в этом процессе больше ничего не произойдет. Т.е. процесс нужно переписать либо так, чтобы он каждый раз срабатывал по очередному клоку, либо нужно будет использовать цикл, в котором последовательно, с учетом ожиданий следующих тактов, менялись бы значения clk_count и qspi_data. Но я бы для начала рекомендовал бы первый вариант, "перезапускаемый" процесс без оператора "wait;" А счётчик clk_count вообще можно вынести в другой процесс.

Share this post


Link to post
Share on other sites

мне кажется тестбенч должен писать тестировщик иначе есть соблазн подогнать тестбенч под правильный ответ :)

Share this post


Link to post
Share on other sites

2 часа назад, jenya7 сказал:

мне кажется тестбенч должен писать тестировщик иначе есть соблазн подогнать тестбенч под правильный ответ :)

Хороший ПЛИСовик должен уметь писать тесты. Иначе никак.

Share this post


Link to post
Share on other sites

По-хорошему, надо начинать с тестбенча.

Сначала вы "рисуете" входные воздействия для вашего модуля, а потом у же пишете сам модуль, который их обрабатывает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...