本帖最后由 fpgaw 于 2010-7-18 11:13 编辑
请求懂Verilog HDL语言的朋友们帮我看看下面这个程序,这个程序能综合可就是在仿真时就不能仿真出我想要的预期结果,由于我刚学习这们语言所以还有好多地方不是很熟悉,现在我不知道是这个程序编得有问题还是我编的测试文件有问题?请各位高手帮我看看这个程序,再给我编个测试文件.我现在正等着这个程序急用,如有朋友能帮我,下次需要我帮忙时尽管说!
非常感谢大家!
module IDCounter (IDclock,reset,inc,dec,IDout);
input IDclock, reset, inc, dec;
output IDout;
reg inc_new;
reg inc_pulse;
reg dec_new;
reg dec_pulse;
reg Toggle_FF;
reg delayed;
reg advanced;
reg IDout;
always @ (posedge IDclock)
begin
if(!inc)
begin
inc_new<=1;
inc_pulse<=0;
end
else if(inc_pulse)
begin
inc_pulse<=0;
inc_new<=0;
end
else if(inc&&inc_new)
begin
inc_pulse<=1;
inc_new<=0;
end
else
begin
inc_pulse<=0;
inc_new<=0;
end
end
always @ (posedgeIDclock)
begin
if(!dec)
begin
dec_new<=1;
dec_pulse<=0;
end
else if(dec_pulse)
begin
dec_pulse<=0;
dec_new<=0;
end
else if(dec&&dec_new)
begin
dec_pulse<=1;
dec_new<=0;
end
else
begin
dec_pulse<=0;
dec_new<=0;
end
end
always @ (posedgeIDclock)
begin
if(!reset)
begin
Toggle_FF<=0;
delayed<=1;
advanced<=1;
end
else
begin
if(inc_pulse)
begin
advanced<=1;
Toggle_FF<=!Toggle_FF;
end
else if(dec_pulse)
begin
delayed<=1;
Toggle_FF<=!Toggle_FF;
end
else if(Toggle_FF==0)
begin
if(!advanced)
Toggle_FF<=!Toggle_FF;
else if(advanced)
begin
Toggle_FF<=Toggle_FF;
advanced<=0;
end
end
else
begin
if(!delayed)
Toggle_FF<=!Toggle_FF;
else if(delayed)
begin
Toggle_FF<=Toggle_FF;
delayed<=0;
end
end
end
end
always @ (IDclock or Toggle_FF)
begin
if(Toggle_FF)
IDout=0;
else
begin
if(IDclock)
IDout=0;
else
IDout=1;
end
end
endmodule
仿真后的预期结果应该如下:
在此相位控制器模块中,IDclock为输入的时钟信号,inc为进位脉冲信号,dec为借位脉冲信号,IDout为输出信号,相位控制器在没有进位与借位信号时对时钟进行了二分频。此时IDclock为40ns,输出IDout为80ns。当出现进位脉冲inc时,输出信号IDout序列中插入一个脉冲,当出现借位脉冲dec时,输出信号IDout序列中扣除一个脉冲,从而实现了相位控制器对本地时钟序列的控制。该模块符合设计要求。 |