多边沿问题
module menu(clk,clear,stop,MSH,MSL,SH,SL,MH,ML);
input clk,clear,stop;
output[3:0] MSH,MSL,SH,SL,MH,ML;
reg[3:0] 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
能详细说下有什么问题吗?
编译下来语法没错啊。
将 if(SL==9)改为else if(ML==9)
将if(ML==9)改为else if(ML==9)就可以了,没错但是一大堆警告,
具体原因不懂,但是你以后可以注意一下毕竟verilog还是不像c那么"自由"
写得有问题,posedge应该是用在时序电路
always @(posedge clear or posedge count2) 这句话你是想用clear当时钟吗?还是用count2做时钟?
一个寄存器只能有一个时钟和一个复位。你之前的always块里不是描述过clk是时钟了吗?怎么到这里又换了。这样是不对的。
恩,你说的很好,我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!
恩,那我该怎么改写呢?我是想做一个跑表的程序,分了几个块,利用count1的状态来确定百分秒向秒的进位,count2的状态来确定秒位向分的进位,我看到一些例程上好像是这么写的,郁闷!不知道这个要实现的话,该如何改写呢?谢谢您啦!
恩,编译到后来时,提示的就是always那块的上升沿有问题,好像是有点混乱吧,从程序中可以看出来应该是count1的两个沿和clk的一个沿,这样的规定好像Verilog 不允许吧!你可以编译一下试试,我看了英文的分析,知道原因但是具体怎么修改不知道,我是想设计一个简单的跑表,用count1来标示百分秒向秒的进位!
哦,忘记说了,其实我是想用count2做时钟的,但是没有clk查看波形仿真,什么结果都没有,后来我就琢磨着加了一个clk,不知道该怎么用?
不要试图用控制信号做寄存器的时钟,实际上counter1只是一个控制信号而已,clear还可以勉强认为是复位(实际上严格来说也不是复位)。所以,所有的寄存器用clk做时钟
always @(posedge clk) begin
if(counter1) begin
.....
end
这才是正确的代码风格,写verilog代码不要像写C语言一样,串起来写,那是不对的。
说得好啊,新手真要注意
恩,小编真是高手,太感谢你了,成功了!再次感谢!
小编,建议你用if else 太长的话,还是用一下其他的语句可不可以。或者用begin end,要不然太乱了。
