Jump to content

    
Sign in to follow this  
jenya7

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites
1 hour ago, SII said:

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

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

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

Share this post


Link to post
Share on other sites
On 5/12/2020 at 12:44 PM, jenya7 said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
2 hours ago, Nemos760 said:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by Nemos760

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.

Sign in to follow this