如何在我的柜台中指定这些条件

时间:2016-10-16 09:01:17

标签: vhdl

我在使用ISE合成代码时遇到了问题。请检查代码并给出一个建议,如何根据特定条件对其进行修改。我的问题只出在一个柜台的STAYCOUNT实体上。请注意,clk正在通过另一个电路进行馈电,而且数量也由另一个电路供电。

  1. 在初始化步骤,STAYCOUNT = 0,如果Reset = 0,clk = 1则count = count + 1,并输出DOUT = COUNT。
  2. 如果reset = 1则count = count - count。
  3. 然后下一个电路处理DOUT的输出,它将停止向计数器供电或在特定条件下供电(staycount = 1)。
  4. 每当staycount = 1。 如果clk = 1那么      而staycount = 1循环       count = count + 1       DOUT< =计数       结束循环
  5. 结束如果
  6. 有两个问题:1。在初始化步骤中,只有当staycount = 0且clk = 1时,它才应该只处理count = count + 1一次并给出输出DOUT。 DOUT向另一个电路发送信号后,该电路有2个输出,或者等于1,或者继续进行另一个输出。 2.假设另一个电路给出一个输出staycount = 1,它应该输入计数器,并且计数器将再次检查clk = 1和staycount = 1是否使count = count + 1并给出另一个输出DOUT = COUNT

    请检查我的代码柜台。然而,它错过了问题#1的陈述,并成功解决了问题#2,但错误Xilinx ISE"超出非静态循环限制"。

    entity counter is
    
        generic(n: natural :=4);
        port(   CLK: in std_logic;
                Reset : in std_logic;
                staycount: in std_logic;
                DOUT    : out   std_logic_vector(n-1  downto 0) );
    end counter;
    
    architecture behavior of counter is
    
    begin 
    
        process(CLK,CLK,Reset,staycount,COUNT) -- behavior describe the counter
        variable COUNT:std_logic_vector(n-1  downto 0); 
            begin
    
               if Reset = '1' then
                  COUNT := COUNT - COUNT;
    
                  elsif (CLK='1' and CLK'event) then
                while (staycount = '1') loop
                COUNT := COUNT + 1;
                    DOUT <= COUNT after 50 ns;
                    end loop;   
              else DOUT <= COUNT;
              end if;               
    
        end process;
    end behavior;
    

1 个答案:

答案 0 :(得分:0)

计算一个寄存器

看起来您正在使用 count 来保持设计的状态。它更整洁,并且通常更容易调试,使其成为一个信号 - 如果你在时钟边缘分配它就会成为一个寄存器。

将计数声明为体系结构中的信号而不是变量,并在每个时钟边沿为其分配下一个值。我还建议在此过程中将零重置为零而不是单独减去 - 否则您最终可能会在实现中传播未初始化的值。

if reset = '1' then
    count <= (others => '0');
elsif (CLK='1' and CLK'event) then
    count <= count_n;
end if;

同时分配count_n信号,注意你总是想要至少增加一次:

count_n <= (n-1 downto 1 => '0') & '1' when count = 0 else
           count when staycount = '0' else 
           count + 1;

现在还根据计数信号同时分配输出,并注意您可以将灵敏度列表限制为仅clk和重置。