一个关于计数器设计的问题
上面设计的是一个八进制的计数器,上半部分是相当于一个门控时钟,下半部分是计数器输出,计数器输出前半部分很长条的000是由于复位信号的缘故,本意是在时钟上升沿到来时计数,而且计数是从000开始,但现在却是从001开始计数,因为普通计数器设计时编下面一段代码实现的,这段代码必然会造成在第一个上升沿处计数值为001,请问各位大侠门,有什么方法能让它在第一个上升沿处计数值也为000?
counter_out <= (counter_out == 3'b111 ? 3'b000:counter_out+1'b1);
初始态没要求的话可以让他从111开始
呵呵
或者你设计个逻辑,从clk生成一个延迟了一个周期的clk2作为计数器时钟。
愚见愚见
谢谢啊,第一种方式以前就试过了,在我这个电路中不适用,第二种方式可以考虑。
对时钟延迟不是一个好的建议方式,你可以把产生的计数值用时钟延时一拍,然后内部使用这个延时的计数值,那么在上升沿上看到的就是从0到7的计数循环,而不是从1到0的计数循环了。
我想问下,为什么时钟不适合延迟。是不是会导致其他单元调用的时钟跟计数器所使用的时钟不一致而产生错误?
因为我想的是通过一个初始为0、D端接高、时钟端接到clk的DFF生成一个使能信号,并将这个信号与clk与一下作为计时器的时钟。
呵呵,你这么做出来的,就是一开始的一拍时钟没有而已,之后还是和时钟一样的,其实并没有做任何延时,你再想想?至于时钟为什么不合适做延时,我的经验是,时序设计都是依赖于时钟来控制时序的,你改变别的时序总是相对容易的,在时序设计中还是不要通过逻辑去改变时钟的延时,因为不好做,而且实际电路中的时钟到各个寄存器本来就有延时的,所以也没必要去做。
同步设计嘛,整个设计最好只用一个时钟来驱动。直接把计数结果打一拍,延时一个周期就行了。
always @(posedge clk or negedge reset) begin
if (!reset)
cnt <= 4'b1000;
else if (cnt[3])
cnt <= 4'b0000;
else
cnt[2:0] <= cnt[2:0] + 1;
end
其实就是计数器带一个使能信号,复位的时候使能信号无效,复位之后的第一个时钟沿使能有效。
一个时钟来驱动
八楼正解,估计小编没有设置复位端的……