首页 文章

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

提问于
浏览
0

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

  • 在初始化步骤,STAYCOUNT = 0,如果Reset = 0,并且clk = 1则count = count 1,并给出输出DOUT = COUNT .

  • 如果reset = 1则count = count - count .

  • 然后下一个电路处理DOUT的输出,它将停止向计数器供电或在特定条件下供电(staycount = 1) .

  • 每当staycount = 1.如果clk = 1则while staycount = 1循环计数=计数1 DOUT <=计数结束循环

  • 结束如果

有两个问题: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

    Make count a register

    看起来你正在使用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和reset .

相关问题