verilog怎么用计数器实现长延迟

比如在时钟clk下上升沿输入一个控制信号ctrl_a,此信号持续一个周期,我想输出一个延迟16拍的信号ctrl_b,同样持续一个周期,怎么用计数器去实现(不用D触发器去连打16拍),谢谢!

ctrl_a控制信号是高有效还是低有效?可以增加寄存器在控制信号有效的时候,赋值给寄存器保存,
同时计数器开始计数,当计数器计数到16时,将寄存器的值给ctrl_b追问

时钟上升沿来时,ctrl_a=1持续一个周期,此时过16个周期后,ctrl_b=1,同样持续一个周期。其实我目的就是想将ctrl_a为高有效时将其值赋给16个周期后的ctrl_b

追答

当ctrl_a=1时,将ctrl_a的值赋值给ctrl_c,同时当ctrl_a=1,计数器开始计数,计数16个时钟后,将ctrl_c的值给ctrl_b就行了。

always@(posedge clk)
begin
if(ctrl_a=1)
ctrl_c <= ctrl_a;
else
ctrl_c <= ctrl_c;
end
always@(posedge clk)
begin
if(ctrl_a=1)
cnt<= 'd0;
else if(cnt == 16)
cnt <= 0;
else
cnt <= cnt +1'b1;
always@(posedge clk)
begin
if(cnt == 16)
ctrl_b <= ctrl_c;
else
ctrl_b <= 0

追问

首先很感谢你的回答!用寄存的方法我也想过,但是你这样写的话会导致每次计数到16就会赋值给ctrl_b。所以我琢磨了下加个条件应该就可以。
if(ctrl_a=1)
ctrl_c <= ctrl_a;
else if(cnt==16)
ctrl_c <=1'b0 ;
else
ctrl_c <= ctrl_c;
分给你吧 谢谢!

追答

嗯 是的!我只提供思路细节问题肯定要自己考虑

温馨提示:答案为网友推荐,仅供参考
相似回答