VHDL程序在4位递增计数器中最多可计数10。。。。?

VHDL程序在4位递增计数器中最多可计数10。。。。?,vhdl,Vhdl,为了数到7,我在0到10之间为我做了很多。它没有显示任何错误,但从0000到1111计数 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; entity counter is port(CLK, CLR : in std_logic; output : inout std_logic_vector(3 downto 0)); end counter; a

为了数到7,我在0到10之间为我做了很多。它没有显示任何错误,但从0000到1111计数

     library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_signed.all; 

entity counter is 
  port(CLK, CLR : in  std_logic; 
       output : inout std_logic_vector(3 downto 0)); 
end counter; 
architecture archi of counter is 
  signal tmp: std_logic_vector(3 downto 0); 
  begin 
    process (CLK, CLR)
     variable i: integer:=0;
        begin

           if (CLR='1') then
                tmp <= "0000";
           elsif (clk = '1') then
                for i in 0 to 6 loop
                    tmp <= tmp + 1;
                end loop;
            end if;
您能建议一下怎么做吗?…对不起,英语语法错误

需要在一个时钟边缘操作 因为您的计数器端口中有clk,我们可以假设您希望计数器计数与时钟同步

你在两个时钟边缘上操作

    end process;
     output <= tmp;

end architecture;
应该是

         elsif (clk = '1') then
            for i in 0 to 6 loop
                tmp <= tmp + 1;
            end loop;

这些示例使用clk的上升沿。在IEEE-1076.6 IEEE VHDL寄存器标准下,不能合成使用两个时钟边缘的东西 传输级RTL合成。这不是公认的计时方法

制作模10计数器 假设您希望计数器从0变为9,并将其翻转

         elsif rising_edge(clk) then
应该是

         elsif (clk = '1') then
            for i in 0 to 6 loop
                tmp <= tmp + 1;
            end loop;
这模拟了一个同步负载,它优先于由外部“状态”识别器驱动的增量。通过异步清除,它将模拟74163 4位计数器,外部4输入门识别1001并产生同步并行负载信号加载0000

loop语句有什么问题 如图所示的循环过程将导致一个增量,并在1111处产生如您所描述的反向翻转。您可以删除用于。。。环和端环;语句,它的行为将相同。每个驱动程序的一个信号只有一个计划未来更新,并且一个进程为其分配的每个信号只有一个驱动程序。所有循环迭代都发生在同一clk事件中。tmp在循环完成后的下一个模拟周期内不会得到更新,并且它的赋值在所有循环迭代中都是相同的,表达式tmp+1。最后一个循环迭代赋值将是实际发生的赋值,它赋值的值将是相同的


当计数器为状态驱动状态时,不需要使用循环语句≃ tmp。不需要i表示的附加状态。

For循环的工作方式与您认为的不同。重写代码并删除for循环。
            if tmp = "1001" then         # binary 9
                tmp <= (others => '0');  # equivalent to "0000"
            else
                tmp <= tmp + 1;
            end if;