【问题标题】:VHDL 3-bit u/d counterVHDL 3 位 u/d 计数器
【发布时间】:2016-04-13 15:39:30
【问题描述】:

我有这个用于 3 位向上/向下计数器的 vhdl 代码,但是当我模拟它时没有给出任何输出结果,这是怎么回事??

   library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
entity counter is
  Port ( rst,clk : in STD_LOGIC;
   up: in bit;
          z : out STD_LOGIC_vector( 2 downto 0 ));
end counter;
architecture Behavioral of Counter is
signal zint:  STD_LOGIC_vector( 2 downto 0 ) ; 
begin
z<= zint;
 process (clk)
begin
if (clk' event and clk='1') then 
if (rst ='1') then 
zint <= "000" ;
end if;
if (zint <= "111" )then zint <= "000";
elsif (up='1') then zint <= zint+1;
else zint <= zint-1;
end if;
end if;
end process;
end Behavioral;

【问题讨论】:

  • 欢迎来到 Stack Overflow。通常最好提供MCVE,以便其他人可以重现您的错误,但在这种情况下,我想我可以看到问题所在。
  • 请缩进您的代码。
  • 请出示您的测试台。 不给出任何输出结果是什么意思?

标签: vhdl counter


【解决方案1】:

您在重置时将zint 设置为“000”。然后,只要zint 小于“111”,您就可以再次将其设置为“000”。 zint怎么会和“000”不一样呢?
您可以完全放弃第一个 if 条件,计数器会自动从“111”溢出到“000”,反之亦然。

【讨论】:

    【解决方案2】:

    我认为这条线是你的问题:

    if (zint <= "111" )then zint <= "000";
    

    你不是这个意思吗?

    if (zint = "111" )then zint <= "000";
    

    事实上,你根本不需要上面那行——计数器会自动回绕。 (而且,倒计时也是如此,无论如何你都没有代码。)

    话虽如此,以下是一些改进代码的其他建议:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    -- use ieee.std_logic_unsigned.all;        -- DON'T USE THIS...
    use ieee.numeric_std.all;                  -- ...USE THIS INSTEAD
    entity counter is
      Port ( rst,clk : in STD_LOGIC;
       up: in bit;                             -- DID YOU REALLY WANT TYPE 'bit' HERE?
       z : out STD_LOGIC_vector( 2 downto 0 ));
    end counter;
    
    architecture Behavioral of Counter is
      signal zint:  unsigned( 2 downto 0 ) ;   -- MAKE THIS TYPE 'unsigned'...
    begin
      z<= std_logic_vector(zint);              -- ... AND USE A TYPE CONVERSION HERE
      process (clk)
      begin
        if rising_edge(clk) then               -- '(clk' event and clk='1')' BECAME OLD-FASHIONED in 1993!
          if rst ='1' then                     -- YOU DON'T NEED THE BRACKETS
            zint <= "000" ;                    -- USE INDENTATION!
          --end if;
          --if zint = "111" then zint <= "000";
          elsif up='1' then
            zint <= zint+1;
          else
            zint <= zint-1;
          end if;
        end if;
      end process;
    end Behavioral;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多