Перейти к содержанию
    

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 мастер генерирует.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jenya7 said:

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

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

 

5 minutes ago, jenya7 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, FakeDevice said:

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вы можете взять эти два файла и собрать проект в модельсиме за 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;

осталось разобраться почему он не работает в модельсиме.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jenya7 said:

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

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

wait until rising_edge(clock);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не генерируются.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...