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

Не работает условие

Так не работает

if (num < 38 and num < R_CNT) then
end if;   

а так работает

if (num < R_CNT) then
end if;   

я что то не понимаю?

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


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

А зачем ставить вообще внешние скобки? VHDL -- не Верилог, в нём эти скобки не нужны. И уж точно здесь скобки никак не скажутся: из-за строгой типизации and не будет выполнено не с тем, с чем надо, компилятор ругаться будет.

Только вот непонятно, что значит "не работает"? Если чисто num < R_CNT работает, то зачем проверка на num < 38? И как определены эти самые num и R_CNT?

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


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

1 hour ago, SII said:

А зачем ставить вообще внешние скобки? VHDL -- не Верилог, в нём эти скобки не нужны. И уж точно здесь скобки никак не скажутся: из-за строгой типизации and не будет выполнено не с тем, с чем надо, компилятор ругаться будет.

Только вот непонятно, что значит "не работает"? Если чисто num < R_CNT работает, то зачем проверка на num < 38? И как определены эти самые num и R_CNT?

num должен быть меньше 38 и в то же время меньше R_CNT. но я посмотрел num - std_logic_vector и так сравнивать конечно нельзя (< 38). странно что квартус не ругается.

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


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

On 5/12/2020 at 12:44 PM, jenya7 said:

num должен быть меньше 38 и в то же время меньше R_CNT. но я посмотрел num - std_logic_vector и так сравнивать конечно нельзя (< 38). странно что квартус не ругается.

Просматривал темы, стало интересно, что квартус не ругался. 

В модуле случайно не была подключена библиотека ieee.std_logic_signed? 

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


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

У меня все работает. Вот пример кода:

library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.numeric_std.all;

entity example is
    port                     
    (
        num       : in  unsigned(7 downto 0);     
        R_CNT     : in  unsigned(7 downto 0);     
        out_TDATA : out std_logic                 
    );
end entity;

architecture RTL of example is
begin
    process
    (
        num,
        R_CNT
    )
    begin
        if (num < 38  and num < R_CNT) then
            out_TDATA <= '1';
        else
            out_TDATA <= '0';
        end if;
    end process;
end architecture;

Вот тестбенч

   
library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.numeric_std.all;

entity example_tb is
end entity;



architecture RTL of example_tb is

    signal num       : unsigned(7 downto 0);     
    signal R_CNT     : unsigned(7 downto 0);     
    signal out_TDATA : std_logic;  
begin
    
    DUT : entity work.example
    port map                    
    (
        num       => num       ,
        R_CNT     => R_CNT     ,
        out_TDATA => out_TDATA 
    );
    process
    begin
        num    <= to_unsigned(32,8);
        R_CNT  <= to_unsigned(15,8);
        wait for 50 ns;
        num    <= to_unsigned(32,8);
        R_CNT  <= to_unsigned(80,8);
        wait for 50 ns;
        num    <= to_unsigned(77,8);
        R_CNT  <= to_unsigned(96,8);
        wait for 50 ns;
        num    <= to_unsigned(77,8);
        R_CNT  <= to_unsigned(37,8);
        wait for 50 ns;
        num    <= to_unsigned(55,8);
        R_CNT  <= to_unsigned(43,8);
        wait for 50 ns;
        num    <= to_unsigned(38,8);
        R_CNT  <= to_unsigned(38,8);
        wait for 50 ns;
        num    <= to_unsigned(38,8);
        R_CNT  <= to_unsigned(39,8);
        wait for 50 ns;
        num    <= to_unsigned(37,8);
        R_CNT  <= to_unsigned(38,8);
        wait;
    end process;



end architecture;

Вот результат работы :

 

work.PNG

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


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

А если numeric_std заменить на std_logic_signed? Мне кажется там условие будет всегда выполняться, проверить пока не могу, а интересно. 

Jenya7 не привёл же весь текст модуля

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


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

2 hours ago, Nemos760 said:

А если numeric_std заменить на std_logic_signed? Мне кажется там условие будет всегда выполняться, проверить пока не могу, а интересно. 

Jenya7 не привёл же весь текст модуля

поэтому и рабротает что std_logic_signed у меня std_logic_vector.

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


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

А у меня все работает ровно так, как я опишу. Секрет прост - использовать только стандартные библиотеки.

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


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

Если это камень в мой огород, то я тоже использую numeric_std, но был опыт и с библиотеками signed, unsigned и arith, поэтому и вспомнил. Собственно перестал их использовать, когда похожие эффекты возникли при написании ких-фильтра. Плюс ещё и ограничение, что можно использовать только signed или только unsigned, в общем лучше стандартная, хоть и преобразования иногда нужны дополнительные

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

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


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

а если нужен std_logic_vector?

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

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


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

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

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

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

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

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

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

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

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

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