我在使用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 回答
Make count a register
看起来你正在使用count来保持你的设计状态 . 它更整洁,并且通常更容易调试,使其成为一个信号 - 如果您在时钟边缘分配信号,它将成为寄存器 .
将计数声明为体系结构中的信号而不是变量,并在每个时钟边沿为其分配下一个值 . 我还建议在此过程中将零重置为零而不是单独减去 - 否则您最终可能会在实现中传播未初始化的值 .
同时分配count_n信号,注意你总是想要至少增加一次:
现在还根据计数信号同时分配输出,并注意您可以将灵敏度列表限制为仅clk和reset .