我在使用ISE合成代码时遇到了问题。请检查代码并给出一个建议,如何根据特定条件对其进行修改。我的问题只出在一个柜台的STAYCOUNT实体上。请注意,clk正在通过另一个电路进行馈电,而且数量也由另一个电路供电。
有两个问题: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;
答案 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和重置。