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

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

Цитата

...

variable clk_count : integer range 0 to 2  1 := 0;
begin

...               

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

 Мелочь, конечно, но отвлекает))

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


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

ищется 5 мин

+ на vhdl

 

On 12/4/2023 at 10:39 AM, jenya7 said:

 

честно говоря взыл бы готовый QUAD SPI и не парился ни минуты. забавно что нигде не нашел готовый модуль.

 

 

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


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

On 12/4/2023 at 9:37 AM, jenya7 said:

Есть такой процесс

  Какие библиотеки у Вас подключены во всем проекте помимо   IEEE.STD_LOGIC_1164.ALL ?

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


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

On 12/7/2023 at 1:15 AM, Джеймс said:

  Какие библиотеки у Вас подключены во всем проекте помимо   IEEE.STD_LOGIC_1164.ALL ?

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

On 12/6/2023 at 10:33 PM, Maverick_ said:

видел эти варианты.

в первом

input	logic MOSI_0,
input 	logic MOSI_1,
input 	logic MOSI_2,
input 	logic MOSI_3,
output  logic MISO_0,
output  logic MISO_1,
output  logic MISO_2,
output  logic MISO_3

у меня нет отдельных линий. у меня

SPI_DATA : inout std_logic_vector(3 downto 0);

второй вариант похож на вуду маджик.

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


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

45 minutes ago, jenya7 said:

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

видел эти варианты.

в первом

input	logic MOSI_0,
input 	logic MOSI_1,
input 	logic MOSI_2,
input 	logic MOSI_3,
output  logic MISO_0,
output  logic MISO_1,
output  logic MISO_2,
output  logic MISO_3

у меня нет отдельных линий. у меня

SPI_DATA : inout std_logic_vector(3 downto 0);

второй вариант похож на вуду маджик.

сделайте промежуточную логику или измените свою...

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


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

On 12/7/2023 at 9:31 AM, Maverick_ said:

сделайте промежуточную логику или измените свою...

в смысле? у меня физически 4 линии. 

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


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

9 minutes ago, jenya7 said:

в смысле? у меня физически 4 линии. 

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

как вариант...

PS для Quad Serial Peripheral Interface (Quad-SPI) должно быть 6 линий

image

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


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

14 hours ago, jenya7 said:

LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

 

@jenya7

Если хотите двигаться дальше, заниматься FPGA разработкой не только "для себя", то:
1) Оставьте только эти объявления:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

Сначала будет сложно, но вы переделаете свой код и настроитесь на верный курс. 

2) Конкретно по этому проекту - использовать SCK именно как clock - это неверный подход. Тактовая частота в вашем SPI модуле должна быть одна. Хотя, оговорюсь я не знаю какая эта частота, сколько там MHz..

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

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

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


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

При чтении сообщений из этого треда меня не покидало ощущение дежавю. Сегодня я понял, почему - когда наткнулся на эту тему -  Первый проект на Verilog. Прошу помощи

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


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

10 hours ago, Джеймс said:

@jenya7

Если хотите двигаться дальше, заниматься FPGA разработкой не только "для себя", то:
1) Оставьте только эти объявления:
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

Сначала будет сложно, но вы переделаете свой код и настроитесь на верный курс. 

2) Конкретно по этому проекту - использовать SCK именно как clock - это неверный подход. Тактовая частота в вашем SPI модуле должна быть одна. Хотя, оговорюсь я не знаю какая эта частота, сколько там MHz..

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

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

добавлю 

+ использовать стандарт VHDL 2008

как минимум чтоби не писать

process(SPI_CLK)

а писать

process(all)

 

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


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

1 hour ago, Maverick_ said:

добавлю 

+ использовать стандарт VHDL 2008

как минимум чтоби не писать

process(SPI_CLK)

а писать

process(all)

 

Это крайне плохой совет. Категорически не советую ему следовать.

Вот зачем? Зачем писать all, если это чисто сихронный процесс? Уже глядя на список чувствительности, начинаешь понимать, что в процессе происходит.

Нет, если вы любитель писать запутанный и код и вдобавок обфусцировать его в процессе писания, то удачи. А коллеги, кому этот код потом достанется, помянут вас тихим (а может, и не тихим) матерным словом.

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


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

56 minutes ago, andrew_b said:

Это крайне плохой совет. Категорически не советую ему следовать.

Вот зачем? Зачем писать all, если это чисто сихронный процесс? Уже глядя на список чувствительности, начинаешь понимать, что в процессе происходит.

Нет, если вы любитель писать запутанный и код и вдобавок обфусцировать его в процессе писания, то удачи. А коллеги, кому этот код потом достанется, помянут вас тихим (а может, и не тихим) матерным словом.

не знал...

думал что

image.thumb.png.2a59cc3ecc5cb891f9308e93866eba6e.png

PS меня не путает, упрощает жизнь

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


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

3 minutes ago, Maverick_ said:

не знал...

Не знали что? Что из того, что я написал, явилось для вас новостью?

4 minutes ago, Maverick_ said:

думал что

Там всё правильно написано. Но есть нюанс.

Когда я читаю код и вижу список чувствительности

process (clk)

я понимаю, что это в этом процессе будет описан синхронный триггер.

 Когда я вижу

process (reset, clk)

я понимаю, что это описан синхронный триггер с асинхронным сбросом.

 Когда я вижу

process (all)

я ожидаю увидеть комбинаторику, типа

process (all)
begin
     y <= x1 or x2 or x3 or x4;
end process;

А если в таком процессе внезапно оказывается триггер, то у меня возникают сомнения в квалификации автора кода и в качестве самого кода. Это то же самое, как и

process (clk, reset, ce, x)
begin
     if (rising_edge (clk)) then
        if (reset = '1') then
           y <= '0';
        elsif (ce = '1') then
           y <= x;
     end if;
end process;

Можно в вписок чувсвительности вписать все сигналы, но зачем? Чтобы что? Профита это никакого не даёт, а даже наоборот.

15 minutes ago, Maverick_ said:

меня не путает, упрощает жизнь

На что вы тратите те секуды, которые сэкономили на написании all вместо правильного списка чувствительности?

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


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

5 минут назад, andrew_b сказал:

Не знали что? Что из того, что я написал, явилось для вас новостью?

Там всё правильно написано. Но есть нюанс.

Когда я читаю код и вижу список чувствительности

process (clk)

я понимаю, что это в этом процессе будет описан синхронный триггер.

 Когда я вижу

process (reset, clk)

я понимаю, что это описан синхронный триггер с асинхронным сбросом.

 Когда я вижу

process (all)

я ожидаю увидеть комбинаторику, типа

process (all)
begin
     y <= x1 or x2 or x3 or x4;
end process;

А если в таком процессе внезапно оказывается триггер, то у меня возникают сомнения в квалификации автора кода и в качестве самого кода. Это то же самое, как и

process (clk, reset, ce, x)
begin
     if (rising_edge (clk)) then
        if (reset = '1') then
           y <= '0';
        elsif (ce = '1') then
           y <= x;
     end if;
end process;

Можно в вписок чувсвительности вписать все сигналы, но зачем? Чтобы что? Профита это никакого не даёт, а даже наоборот.

На что вы тратите те секуды, которые сэкономили на написании all вместо правильного списка чувствительности?

Полностью поддерживаю. Еще у VHDL 2008 есть нюанс при работе с Vivado. Заключается в том, что там нет возможности каждый VHDL файл рассматривать как версию 2008. Это надо дополнительно руками указывать. Неудобно. А вообще все проблемы со списком чувствительности из-за непонимания, как он работает. 

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


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

3 minutes ago, Flip-fl0p said:

Полностью поддерживаю. Еще у VHDL 2008 есть нюанс при работе с Vivado. Заключается в том, что там нет возможности каждый VHDL файл рассматривать как версию 2008. Это надо дополнительно руками указывать. Неудобно. А вообще все проблемы со списком чувствительности из-за непонимания, как он работает. 

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]

 

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


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

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

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

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

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

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

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

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

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

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