【问题标题】:How to specify these conditions in my counter如何在我的计数器中指定这些条件
【发布时间】:2023-03-09 14:07:01
【问题描述】:

我在使用 ISE 合成我的代码时遇到了问题。请检查代码并给我建议如何根据特定条件修改它。我的问题仅与计数器的 STAYCOUNT 实体有关。请注意, clk 由另一个电路提供,而 staycount 也由另一个电路提供。

  1. 在初始化步骤中,STAYCOUNT = 0,如果 Reset = 0,并且 clk = 1,则 count=count+1,并给出输出 DOUT = COUNT。
  2. 如果重置 = 1,则计数 = 计数 - 计数。
  3. 然后下一个电路处理 DOUT 的输出,它会停止向计数器馈送或在特定条件下馈送(保持计数 = 1)。
  4. 只要staycount = 1。 如果 clk = 1 那么 while staycount = 1 循环 计数 = 计数 + 1 DOUT
  5. 结束如果

有 2 个问题: 1. 在初始化步骤中,只有当 staycount = 0 且 clk= 1 时,它才应该只处理 count=count+ 1 1 次并给出输出 DOUT。 在 DOUT 向另一个电路发送信号后,该电路有 2 个输出,要么保持计数等于 1,要么继续进行另一个输出。 2. 假设另一个电路给出一个输出staycount = 1,它应该给计数器供电,计数器再次检查clk = 1和staycount = 1是否使count = count + 1并给出另一个输出DOUT = COUNT .

请检查我的计数器代码。但是,它错过了问题#1 的陈述,并成功解决了问题#2,但出现错误 Xilinx ISE "Non-static loop limit exceeded"。

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;

【问题讨论】:

  • 你只想在一个时钟周期内计数一次,对吧?所以将while 更改为if(和loop 匹配)。
  • 我已经解决了我的问题,但我不介意任何 cmets 或回答来提高我的技能。

标签: vhdl


【解决方案1】:

将计数设为寄存器

您似乎正在使用 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多