|
发表于 2007-5-26 17:28:22
|
显示全部楼层
module speed(fp,reset,speed0,speed1,speed2,speed3);
input fp;
input reset;
output[3:0] speed0;
reg[3:0] speed0;
output[3:0] speed1;
reg[3:0] speed1;
output[3:0] speed2;
reg[3:0] speed2;
output[3:0] speed3;
reg[3:0] speed3;
reg c1;
reg c2;
reg c3;
always @(reset or fp or c1 or c2 or c3)
begin
begin :spd0
if (reset==1'b1)
begin
speed0<=4'b0000;
speed1<=4'b0000;
speed2<=4'b0000;
speed3<=4'b0000;
c1<=1'b0;
c2<=1'b0;
c3<=1'b0;
end
else if(fp==1'b1)
begin
if(speed0==4'b1001)
begin
speed0<=4'b0000;
c1<=1'b1;
end
else
begin
speed0<=speed0+1;
c1<=1'b0;
end
end
end
begin:spd1
if (c1==1'b1)
begin
if (speed1==4'b1001)
begin
speed1<=4'b0000;
c2<=1'b1;
end
else
begin
speed1<=speed1+1;
c2<=1'b0;
end
end
end
begin:spd2
if(c2==1'b1)
begin
if(speed2==4'b1001)
begin
speed2<=4'b0000;
c3<=1'b1;
end
else
begin
speed2<=speed2+1;
c3<=1'b0;
end
end
end
begin:spd3
if(c3==1'b1)
begin
if(speed3==4'b1001)
begin
speed3<=4'b0000;
end
else
begin
speed3<=speed3+1;
end
end
end
end
endmodule
这个可以通过MAX+PLUS11的test,至于能否实现你想要的功能就不知道了.
你的代码错误的原因是把硬件编程语言当作软件语言来写了.verilog中,begin和end之间的语句是从上到下顺序执行的,但之外的都是并行执行的.
你原来的代码执行的时候,当第一个触发条件满足,将给c1赋值,c1出现了变化则第二个触发条件满足了,不等你第一部分begin 和end之间的代码执行完就开始执行第二个触发条件里的语句了,这样一来这两块语句中都有给speed1赋值的语句,所以会报错说不能给speed1赋超过一个的值.
修改后的代码把以前的几个模块都用begin 和end框起来了,这样它们就能顺序执行,不会并发的给speed1后其它赋值了.
我也是初学者,大家多多交流.我的邮箱是:rsail@126.com |
|