多边沿问题
各位大侠谁帮我看看这段程序哪有问题啊?提示的错误是下面的always块那的上升沿有问题,但是我看好多参考书上也是这么写的啊!谢谢啦!module menu(clk,clear,stop,MSH,MSL,SH,SL,MH,ML);
input clk,clear,stop;
output MSH,MSL,SH,SL,MH,ML;
reg MSH,MSL,SH,SL,MH,ML;
reg count1,count2;
always @(posedge clk)
begin
if(clear)
begin
MSL<=0;
MSH<=0;
count1<=0;
end
else if(!stop)
begin
if(MSL==9)
begin
MSL<=0;
if(MSH==9)
begin
MSH<=0;
count1<=0;
end
else
begin
MSH<=MSH+1;
count1<=0;
end
end
else
begin
MSL<=MSL+1;
count1<=0;
end
end
end
always @(posedge clear or posedge count1)
begin
if(clear)
begin
SL<=0;
SH<=0;
count2<=0;
end
if(SL==9)
begin
SL<=0;
if(SH==5)
begin
SH<=0;
count2<=1;
end
else
begin
SH<=SH+1;
count2<=0;
end
end
else
begin
SL<=SL+1;
count2<=0;
end
end
always @(posedge clear or posedge count2)
begin
if(clear)
begin
ML<=0;
MH<=0;
end
if(ML==9)
begin
ML<=0;
if(MH==5)
MH<=0;
else
MH<=MH+1;
end
else
ML<=ML+1;
end
endmodule always @(posedge clear or posedge count1)
always @(posedge clear or posedge count2)
这两句是错误的表达。always块沿触发,硬件上是个触发器,而触发器只能有一个上升沿触发或者下降沿出发,不能有两个沿触发。always @(posedge clk or negedge rst)这种表达还是可以的。 回复 2# 哦十全_至芯学员
恩,首先感谢您的解答!我说怎么有的例程是那样写的,你说的很对!那我该怎么改写呢?我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,在秒计数那块我想用count1来作为控制信号,不知道这个要实现的话,该如何改写呢?谢谢您啦!我把这一笑部分改为如下这样也还是不行!
always @(posedge clk)
begin
if(count1)
begin
if(SL==9)
........
........
end
end
期待您的指导和解答! 噢,你说的不行是功能没实现还是编译综合没有通过?
always @(posedge clk)
begin
if(count1) //这个count1必须为1后面的语句才执行,而通过看你以上的程序,你的count始终为1
begin//你应该写错了。你怎样实现跑表思路应该没有问题。只是细节上你好好斟酌。
if(SL==9)
........
........
end
end 不好意思上面句话打错了,应改为:
if(count1) //这个count1必须为1后面的语句才执行,而通过看你以上的程序,你的count1始终为0
你应该写错了。你怎样实现跑表思路应该没有问题。只是细节上你好好斟酌。 回复 5# 哦十全_至芯学员
恩,谢谢您啦!问题已经解决了,以后有问题还望您多多指教! always @(posedge clear or posedge count1)
always @(posedge clear or posedge count2)
这两句是错误的 ...
哦十全_至芯学员 发表于 2011-4-17 22:38 http://www.fpgaw.com/images/common/back.gif
2个上升沿是属于不同的寄存器的也不行吗?我也犯过这个错误,看了你的才明白?楼主改后是不是成功编译了,没有这个错误了?
页:
[1]