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

Неправильная передача сигнала

37 минут назад, Maverick_ сказал:

Vivado: Set VHDL-2019 or VHDL-2008 for all .vhd files
To tell Xilinx Vivado to compile a VHDL file using the newer VHDL-2019 or VHDL-2008 revisions in the GUI, you can go to Project Manager->Sources->Compile Order, right-click the .vhd file, and select Source File Properties. Then, you can click the Type property and change the VHDL revision using the dialog box. You have to right-click every single file to make the change.

But you can easily change the VHDL revision of every single file in your project to 2019 by entering this command in the Vivado GUI’s Tcl Console:

set_property FILE_TYPE {VHDL 2019} [get_files *.vhd]
Or set all .vhd files to 2008 with this Tcl command:

set_property FILE_TYPE {VHDL 2008} [get_files *.vhd]

 

Знаю про этот костыль. Однако есть нюанс. Он ищет все файлы .vhd В том числе и сгенерированные автоматом. Я не моду дать гарантии, что данная команда не сломает что-либо в авто-генерированном мусоре. А учитывая, что в Vivado и так полно всяких "фич", от которых проект может сломатья - то я не рискую так делать. Может и зря.

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


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

Раз речь пошла про tcl может кто то подскажет как написать tcl скрипт для помещения сигналов (из vhdl, verilog, SV описаних модулей) на waveform в ISIM (vivado) - желательно по модульно сгрупировано - лучше как в проекте соблюдая вложеность модулей (идеальное решение)

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

PS поделитесь плиз...

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


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

В 04.12.2023 в 11:39, jenya7 сказал:

есть процесс в другом модуле

а SPI_TX_DATA соединен с DATA_IN

 

 

Наверно имеет смысл опереться на ram core. Например канал МКИО (32 слова х16р, 30 подадресов).

Итого ram 1kx16. Создать spi протокол (инструкция, адрес, данные). И все склеится.

Как то так. И не важно сколько веревок.

spi_flash_emu.zip

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


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

On 12/7/2023 at 11:47 PM, Джеймс said:

@jenya7

3) Вообще пока не используйте больше одной частоты в проекте. CLK и всё! Попробуйте обходиться одной частотой. И всегда проверяйте, что она трассируется на глобальной цепи. Те случаи у вас, когда "то работает, то не работает"  (тема "Не всегда срабатывает условие") - это вообще похоже на не-глобальный Clock.
Таких штук вообще быть не должно:
if (clk3 = '1') then

Удачи! (хотя и не уверен, что примите советы)

интересно а как без if (clk3 = '1') then? не работать по фронту? а как тогда?

 

после многих экспериментов непосредственно прием-передачу я разбил на два процесса.

 

Spoiler
entity 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);
		 
    INSTR       : out std_logic_vector(7 downto 0);
    ADDR        : out std_logic_vector(15 downto 0);
		 
    DATA_OUT    : out std_logic_vector(7 downto 0);
    DATA_IN     : in std_logic_vector(7 downto 0)
);
end QUADSPI;


SPI_DATA <= buf_in when s_rd_nwr = '1' else "ZZZZ";
buf_out <= SPI_DATA when s_rd_nwr = '0' else "0000";

process(CLK)
variable clk_count : integer range 0 to 2 := 0;
begin

    if (SPI_CS = '0') then

        if (s_ready_read = '1') then
					
            if (rising_edge(SPI_CLK)) then
				
                case clk_count is
                    when 0 =>
                        buf_in <= DATA_IN(7 downto 4);
                        clk_count := 1;
                    when 1 =>	 
                        buf_in <= DATA_IN(3 downto 0);
                        clk_count := 0;
                    when others =>
                end case;	
		
            end if;
				
        end if;		
    else
        buf_in <= DATA_IN(7 downto 4);
        clk_count := 0;		  
    end if;
	 
end process;

process(SPI_CLK)
variable clk_count : integer range 0 to 2 := 0;
begin

    if (SPI_CS = '0') then
		  
        if (s_ready_write = '1') then	
		  
            if (rising_edge(SPI_CLK)) then
				
                case clk_count is
                    when 0 =>
                        DATA_OUT(7 downto 4) <= buf_out;
                        clk_count := 1;
                    when 1 =>	 
                        DATA_OUT(3 downto 0) <= buf_out;
                        clk_count := 0;
                    when others =>
                end case;
					 
           end if;
		
        end if;		
    else
       clk_count := 0;		  
    end if;
	 
end process;

 

 

работает чётко, без проблем. проблема возникала в синхронизации - DATA_OUT. мой изначальный вопрос - когда DATA_IN = 0x34 - buf_in = 0x1 0x4 - а должно быть 0x3 0x4 - это было именно из рассинхрона между модулями. почему то это оказалось непростой задачей несмотря на то что модуль передающий DATA_OUT сидит на тех же SPI_CS и SPI_CLK. 

 

процесс передающий DATA_OUT был записан так

if (clk3 = '1') then
    clk2_count := clk2_count + 1;
end if;

case clk2_count is
    when 0 => data_1553_out <= DOUT(7 downto 0);
    when 1 => data_1553_out <= DOUT(7 downto 0);
    when 2 => data_1553_out <= DOUT(7 downto 0);
    when 3 => data_1553_out <= DOUT(15 downto 8);
    when 4 => data_1553_out <= DOUT(15 downto 8);
      State <= ST_READ_3;							 
    when others => 
end case; 
					 

переписал так

if (clk3 = '1') then
    clk2_count := clk2_count + 1;
end if;

if (clk2_count = 4) then
    State <= ST_READ_3;
else
    if (clk2_count < 2) then
        data_1553_out <= DOUT(7 downto 0);
    else
        data_1553_out <= DOUT(15 downto 8);
end if;

и теперь работает нормально. 

 

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

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


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

15 hours ago, jenya7 said:
  Reveal hidden contents
entity 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);
		 
    INSTR       : out std_logic_vector(7 downto 0);
    ADDR        : out std_logic_vector(15 downto 0);
		 
    DATA_OUT    : out std_logic_vector(7 downto 0);
    DATA_IN     : in std_logic_vector(7 downto 0)
);
end QUADSPI;


SPI_DATA <= buf_in when s_rd_nwr = '1' else "ZZZZ";
buf_out <= SPI_DATA when s_rd_nwr = '0' else "0000";

process(CLK)
variable clk_count : integer range 0 to 2 := 0;
begin

    if (SPI_CS = '0') then

        if (s_ready_read = '1') then
					
            if (rising_edge(SPI_CLK)) then
				
                case clk_count is
                    when 0 =>
                        buf_in <= DATA_IN(7 downto 4);
                        clk_count := 1;
                    when 1 =>	 
                        buf_in <= DATA_IN(3 downto 0);
                        clk_count := 0;
                    when others =>
                end case;	
		
            end if;
				
        end if;		
    else
        buf_in <= DATA_IN(7 downto 4);
        clk_count := 0;		  
    end if;
	 
end process;

process(SPI_CLK)
variable clk_count : integer range 0 to 2 := 0;
begin

    if (SPI_CS = '0') then
		  
        if (s_ready_write = '1') then	
		  
            if (rising_edge(SPI_CLK)) then
				
                case clk_count is
                    when 0 =>
                        DATA_OUT(7 downto 4) <= buf_out;
                        clk_count := 1;
                    when 1 =>	 
                        DATA_OUT(3 downto 0) <= buf_out;
                        clk_count := 0;
                    when others =>
                end case;
					 
           end if;
		
        end if;		
    else
       clk_count := 0;		  
    end if;
	 
end process;

 

мой изначальный вопрос - когда DATA_IN = 0x34 - buf_in = 0x1 0x4 - а должно быть 0x3 0x4 - это было именно из рассинхрона между модулями.

 

Ответить на ваш изначальный вопрос можно было бы, если знать дерево тактовых частот (см. один из первых вопросов ув. Zversky) и как оно было реально трассировано. А также вероятно, знать по каким путям попадают сигналы из "внешнего мира" в ПЛИС. Но для этого нужно смотреть на реальную трассировку. 
P.S я боюсь новый проект тоже может заглючить, когда вам потребуется внести еще какие-то изменения

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


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

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

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

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

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

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

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

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

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

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