Jump to content
    

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

я этот Модельсим в белых тапках видел чесслово.

Вот последний тестбенч

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 by jenya7

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 генерируется правильно.

 

Share this post


Link to post
Share on other sites

5 minutes ago, jenya7 said:

в том то и дело - вообще ничего не генерируется. убираю процесс - вижу сигналв в Wave.

Может, просто переобозвалось как-то в среде? Несите скрин в студию, где у вас присутствует тот процесс, но ничего не генерируется. Ну и побольше накидайте в waveform всего, что найдете в тестбенче.

 

5 minutes ago, jenya7 said:

это как? это инициализация сигнала. у меня во всех процесах есть инициализация сигналов и всё прекрасно работает.  процес начинается после begin.

Нет, это инициализация переменной (в данном случае clk_count). В VHDL сигналы и переменные немного разные сущности. Я бы настоятельно рекомендовал пока забыть про переменные, а пользоваться исключительно сигналами.

Share this post


Link to post
Share on other sites

9 minutes ago, FakeDevice said:

 

Нет, это инициализация переменной (в данном случае clk_count). В VHDL сигналы и переменные немного разные сущности. Я бы настоятельно рекомендовал пока забыть про переменные, а пользоваться исключительно сигналами.

сигнал обновится на следующем клоке а переменная на этом, в этом её преимущество.

Share this post


Link to post
Share on other sites

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) бы лучше подошло

Share this post


Link to post
Share on other sites

да вы можете взять эти два файла и собрать проект в модельсиме за 5 минут. так на скринах всего не покажешь.

я исхожу из того что QuadSPI master выдаст мне вот такую картину маслом

444.thumb.png.6412a810c4ba27077936457dd71c4f5a.png

соответсвенно мой слейв который распарсит это - модуль 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 by jenya7

Share this post


Link to post
Share on other sites

1 minute ago, jenya7 said:

да вы можете взять эти два файла и собрать проект в модельсиме за 5 минут. так на скринах всего не покажешь.

Ды вот, пришлось вспомнить, где у меня тут что установлено ))

Share this post


Link to post
Share on other sites

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

я этот Модельсим в белых тапках видел чесслово.

А когда молотком по пальцу попадает, то винит молоток.

Что там в эпиграфе к "Ревизору" было?

Share this post


Link to post
Share on other sites

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') можно подавать как со стороны тестируемого юнита, так и со стороны тестбенча.

Share this post


Link to post
Share on other sites

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

а как без этого. без клока никак.

Share this post


Link to post
Share on other sites

3 minutes ago, jenya7 said:

а как без этого. без клока никак.

Если клок не указан в списке чувствительности процесса, то просто заменить на

wait until rising_edge(clock);

 

Share this post


Link to post
Share on other sites

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;

modelsim.thumb.png.8e49ca67bffcba57c61b80fe74df4601.pngmodsim.thumb.png.dc5bcea58a3e8e9085eaba035b7f9cc3.png

 

clk1, clk2, clk3 не генерируются.

Edited by jenya7

Share this post


Link to post
Share on other sites

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

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...